1. 程式人生 > 實用技巧 >Python 100行程式碼實現2048小遊戲

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         sw = {
13             operate=="":move_up,
14             operate=="":move_down,
15             operate=="":move_left,
16             operate=="":move_right
17         }
18         res = sw[True]()
19         if res == "Game over":
20             break

讓我們開始我們的遊戲吧!!!