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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM