针对2048,笔者根据自身仅会的一些python库和代码基础编写了一个2048的雏形,由于暂时没有对python GUI的相关实操经验,因此输出结果与操作仅在Pycharm的run结果中呈现,具体实现效果如下:
具体代码内容如下:
import numpy as np import random class Game: def __init__(self): self.row = 4 self.col = 4 self.status_matrix = np.zeros((self.row, self.col)) self.value_matrix = np.zeros((self.row, self.col)) self.response = 0 self.alive = True self.score = 0 def give_intro(self): print('*This is an initial version of 2048 by Python*') print("*Use wasd to move the cubes*") print('*Author: Yu*') print('*Date: 2021.08.01*\n') def get_response(self): print('*'*40) self.response = input('The next step / quit: ') print('*'*40) def display_score(self): self.score = int(self.value_matrix.sum()) print('The Score is: ', self.score) def get_maximum(self): max = 0 for i in range(self.row): for j in range(self.col): if self.value_matrix[i,j] > max: max = self.value_matrix[i,j] return max def print_color(self, color, content): start_line = '\033[1;' + color + 'm ' end_line = '\033[0m' return start_line + content + end_line def judge_full(self): count_empty = 0 for i in range(self.row): for j in range(self.col): if self.value_matrix[i,j] == 0: count_empty += 1 return count_empty def judge_failure(self): judge1 = self.get_maximum() < 2048 and self.judge_full() == 0 judge2 = 0 for i in range(self.row): for j in range(self.col): try: if self.value_matrix[i,j] == self.value_matrix[i-1,j]: judge2 += 1 except IndexError: pass try: if self.value_matrix[i,j] == self.value_matrix[i+1,j]: judge2 += 1 except IndexError: pass try: if self.value_matrix[i,j] == self.value_matrix[i,j-1]: judge2 += 1 except IndexError: pass try: if self.value_matrix[i,j] == self.value_matrix[i,j+1]: judge2 += 1 except IndexError: pass if judge1 and (judge2 == 0): self.alive = False def update_status_matrix(self): for i in range(self.row): for j in range(self.col): if self.value_matrix[i,j] == 0: self.status_matrix[i,j] = 0 else: self.status_matrix[i,j] = 1 def go_to_right(self): for i in range(self.row): for _ in range(self.col - 1): for j in range(self.col - 1, 0, -1): if self.value_matrix[i, j] == 0: self.value_matrix[i, j], self.value_matrix[i, j - 1] = self.value_matrix[i, j - 1], \ self.value_matrix[i, j] for j in range(self.col-1, 0, -1): if self.value_matrix[i, j] == self.value_matrix[i, j - 1]: self.value_matrix[i, j] += self.value_matrix[i, j - 1] self.value_matrix[i, j - 1] = 0 for _ in range(self.col - 1): for j in range(self.col - 1, 0, -1): if self.value_matrix[i, j] == 0: self.value_matrix[i, j], self.value_matrix[i, j - 1] = self.value_matrix[i, j - 1], \ self.value_matrix[i, j] def go_to_bottom(self): for j in range(self.col): for _ in range(self.col - 1): for i in range(self.row - 1, 0, -1): if self.value_matrix[i, j] == 0: self.value_matrix[i - 1, j], self.value_matrix[i, j] = self.value_matrix[i, j], \ self.value_matrix[i - 1, j] for i in range(self.row-1, 0, -1): if self.value_matrix[i, j] == self.value_matrix[i - 1, j]: self.value_matrix[i, j] += self.value_matrix[i - 1, j] self.value_matrix[i - 1, j] = 0 for _ in range(self.col - 1): for i in range(self.row - 1, 0, -1): if self.value_matrix[i, j] == 0: self.value_matrix[i - 1, j], self.value_matrix[i, j] = self.value_matrix[i, j], \ self.value_matrix[i - 1, j] def go_to_left(self): for i in range(self.row): for _ in range(self.col - 1): for j in range(self.col-1): if self.value_matrix[i,j] == 0: self.value_matrix[i, j], self.value_matrix[i, j + 1] = self.value_matrix[i, j + 1], \ self.value_matrix[i, j] for j in range(self.col-1): if self.value_matrix[i, j] == self.value_matrix[i, j + 1]: self.value_matrix[i, j] += self.value_matrix[i, j + 1] self.value_matrix[i, j + 1] = 0 for _ in range(self.col - 1): for j in range(self.col-1): if self.value_matrix[i,j] == 0: self.value_matrix[i, j], self.value_matrix[i, j + 1] = self.value_matrix[i, j + 1], \ self.value_matrix[i, j] def go_to_top(self): for j in range(self.col): for _ in range(self.row - 1): for i in range(self.row-1): if self.value_matrix[i, j] == 0: self.value_matrix[i + 1, j], self.value_matrix[i, j] = self.value_matrix[i, j], \ self.value_matrix[i + 1, j] for i in range(self.row-1): if self.value_matrix[i, j] == self.value_matrix[i + 1, j]: self.value_matrix[i, j] += self.value_matrix[i + 1, j] self.value_matrix[i + 1, j] = 0 for _ in range(self.row - 1): for i in range(self.row-1): if self.value_matrix[i, j] == 0: self.value_matrix[i + 1, j], self.value_matrix[i, j] = self.value_matrix[i, j], \ self.value_matrix[i + 1, j] def update_random(self): count = 0 left_places = [] for i in range(self.row): for j in range(self.col): if self.status_matrix[i,j] == 0: left_places.append(count) count += 1 try: random_place = random.choice(left_places) count = 0 for i in range(self.row): for j in range(self.col): if count == random_place: self.value_matrix[i,j] = 2 count += 1 except: pass def display_matrix(self): for i in range(self.row): print('| \t', end='') temp_all = '' for j in range(self.col): number = int(self.value_matrix[i,j]) if number == 0: temp_len = ' \t| ' temp = ' \t| ' else: temp_len = str(number) + '\t| ' temp = self.print_color('31',str(number)) + '\t| ' temp_all += temp_len print(temp,end='\t') print('\n','-'*2*len(temp_all)) def execute(self): flag = True self.update_random() self.display_score() self.display_matrix() while self.alive: self.get_response() if self.response == 'w': self.go_to_top() elif self.response == 'd': self.go_to_right() elif self.response == 'a': self.go_to_left() elif self.response == 's': self.go_to_bottom() elif self.response == 'quit': break else: print('Wrong Order!!!') continue self.update_random() self.display_score() self.display_matrix() self.update_status_matrix() self.judge_failure() if self.value_matrix.max() >= 2048 and flag == True: flag = False hint = input('You have win! Continue?(n to exit)') if hint == 'y': pass elif hint == 'n': break if self.response == 'quit': print('Quit!') else: print('Failure!') def run(self): self.give_intro() try: self.execute() except KeyboardInterrupt: print('\n\nGame Over!') if __name__ == '__main__': game = Game() game.run()
对于各个方法的具体说明:
1、__init__方法:初始化行列数、用户分数、显示数组、状态数组、总分等
2、give_intro方法:给出关于游戏的相关介绍
3、get_response方法:接收每次用户的输入内容,wasd分别对应上左下右四种操作,输入quit会直接退出游戏
4、display_score方法:每次用户输入后,返回当前的总得分
5、get_maximum方法:返回当前显示数组中的最大值,判断用户是否达到了2048的目标
6、print_color方法:设置在pycharm中显示的颜色
7、judge_full方法:判断当前显示数组是否已经全部非空
8、judge_failure方法:判断当前是否达到游戏失败的结果
9、update_status_matrix方法:更新当前的状态数组
10、go_to_XX方法:执行对于用户上下左右的操作反馈的计算
11、update_random方法:每次在一个随机位置产生一个新的数“2”
12、display_matrix方法:在IDE中打印2048的显示数组
13、execute方法:对上面所有方法的执行、执行顺序的封装
14、run方法:对于整个类的操作执行
15、主函数
由于笔者技艺不精,因此在代码中有大量的冗余与暴力计算的内容,这些都是可以在日后加以改进的,如有错误或修改建议敬请评论说明,谢谢!