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

 

让我们开始我们的游戏吧!!!

posted @ 2020-11-04 12:06  你的小可爱吖  阅读(1048)  评论(0编辑  收藏  举报