首先我們來看看我們效果圖:
這是最簡版后期可以去優化,后端自己寫一個可視化頁面,或者配上一個前端,可以使我們的程序變得更絢麗。
下面我們開始我們的代碼
一、構造一個把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
讓我們開始我們的游戲吧!!!