Python 100行代码实现2048小游戏
首先我们来看看我们效果图:
这是最简版后期可以去优化,后端自己写一个可视化页面,或者配上一个前端,可以使我们的程序变得更绚丽。
下面我们开始我们的代码
一、构造一个把0元素移至末尾的函数
[2, 4, 0, 2] --> [2, 4, 2, 0]
1 def zero_end(): 2 """ 3 0元素移至到末尾 4 :param list_merge: 5 :return: 6 """ 7 for i in range(-1, -len(list_merge) - 1, -1): 8 if list_merge[i] == 0: 9 del list_merge[i] 10 list_merge.append(0) 11 12 return list_merge
二、构造一个合并相邻的元素的函数
[2, 2, 0, 0] --> [4, 0, 0, 0]
1 def merge(): 2 """ 3 合并相邻的相同元素 4 :param list_merge: 5 :return: 6 """ 7 for i in range(len(list_merge) - 1): 8 if list_merge[i] == list_merge[i + 1]: 9 list_merge[i] += list_merge[i + 1] 10 del list_merge[i + 1] 11 list_merge.append(0) 12 return list_merge
三、构造一个向左移动地图并合并的函数
1 # @stochastic 2 # @finish 3 def move_left(): 4 """ 5 地图 向左移动 并合并 6 :return: 7 """ 8 for line in map_: 9 global list_merge 10 list_merge = line 11 zero_end() 12 merge() 13 return map_
四、构造一个向右移动地图并合并的函数(和向左移动差不多,就是相反放进去相反取出来就好)
1 # @stochastic 2 # @finish 3 def move_right(): 4 """ 5 地图 向右移动 并合并 6 :return: 7 """ 8 for line in map_: 9 global list_merge 10 list_merge = line[::-1] 11 zero_end() 12 merge() 13 line[::-1] = list_merge 14 return map_
五、构造一个向上(下)移动地图合并的函数
首先我们写一个移动方阵的函数
1 def square_matrix_transpose(sqr_matrix): 2 for c in range(0, len(sqr_matrix) - 1): 3 for r in range(c, len(sqr_matrix)): 4 sqr_matrix[r][c], sqr_matrix[c][r] = sqr_matrix[c][r], sqr_matrix[r][c] 5 return sqr_matrix
然后我们开始构造向上移动并合并的函数
1 # @stochastic 2 # @finish 3 def move_up(): 4 """ 5 向上移动方阵 并合并 6 :return: 7 """ 8 square_matrix_transpose(map_) 9 for line in map_: 10 global list_merge 11 list_merge = line 12 zero_end() 13 merge() 14 square_matrix_transpose(map_) 15 return map_
最后我们开始构造向下移动并合并的函数
1 # @stochastic 2 # @finish 3 def move_down(): 4 """ 5 向下移动方阵 并合并 6 :return: 7 """ 8 square_matrix_transpose(map_) 9 for line in map_: 10 global list_merge 11 list_merge = line[::-1] 12 zero_end() 13 merge() 14 line[::-1] = list_merge 15 square_matrix_transpose(map_) 16 return map_
到现在我们的总体代码就快写完了,还剩下两个装饰器就大功告成了
首先我们来写每次移动我们随机添加一个数字2
1 def stochastic(func, *args, **kwargs): 2 def lnner(*args, **kwargs): 3 try: 4 global one_execute 5 if not one_execute: 6 one_execute = True 7 print("欢迎体验2048小游戏") 8 return map_ 9 else: 10 p = [] 11 data = func() 12 for k, v in enumerate(data): 13 for i, j in enumerate(v): 14 if j == 0: 15 p.append([k, i]) 16 rand = random.choice(p) 17 data[rand[0]][rand[1]] = 2 18 return data 19 except Exception as e: 20 print(e) 21 return "Game over"
首先我们来写一个结束的装饰器
1 def finish(func, *args, **kwargs): 2 def lnner(*args, **kwargs): 3 now_list = copy.deepcopy(map_) 4 data = func() 5 if now_list == data: 6 return "Game over" 7 return data 8 9 return lnner
现在我们所有的代码就都大功告成了,就剩下最后一步了,大快人心的时刻来了。启动
1 if __name__ == '__main__': 2 map_ = [ 3 [0, 0, 0, 0], 4 [0, 0, 0, 0], 5 [0, 0, 2, 0], 6 [0, 0, 0, 0] 7 ] 8 while True: 9 operate = input("请输入(上下左右):") 10 if operate not in ["上","下","左","右"]: 11 print("请输入(上下左右)其中一个。") 12 continue 13 sw = { 14 operate=="上":move_up, 15 operate=="下":move_down, 16 operate=="左":move_left, 17 operate=="右":move_right 18 } 19 res = sw[True]() 20 if res == "Game over": 21 break
让我们开始我们的游戏吧!!!