Python 100行代码实现2048小游戏

摘要:
首先,让我们看看我们的渲染图:这是可以在后期优化的最简单版本。后端可以自己编写一个可视页面,也可以使用前端,这样可以使我们的程序更漂亮。“)12continue13sw={14operation==”向上“:move_Up,15operation===”向下“:move_Down,16operation==”向左“:move_Left,17operation==“向右”:move_right18}19res=sw[True]()20ifres==”游戏结束“:21break让我们开始游戏!!!

首先我们来看看我们效果图:

Python 100行代码实现2048小游戏第1张

 这是最简版后期可以去优化,后端自己写一个可视化页面,或者配上一个前端,可以使我们的程序变得更绚丽。

下面我们开始我们的代码

一、构造一个把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

三、构造一个向左移动地图并合并的函数

Python 100行代码实现2048小游戏第2张

 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_

四、构造一个向右移动地图并合并的函数(和向左移动差不多,就是相反放进去相反取出来就好)

Python 100行代码实现2048小游戏第3张

 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_

五、构造一个向上(下)移动地图合并的函数

Python 100行代码实现2048小游戏第4张Python 100行代码实现2048小游戏第5张

首先我们写一个移动方阵的函数

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

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

免责声明:文章转载自《Python 100行代码实现2048小游戏》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu安装java jdk选择版本MySQL-查询线程信息下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Python】 压缩文件处理 zipfile & tarfile

【zipfile】 虽然叫zipfile,但是除了zip之外,rar,war,jar这些压缩(或者打包)文件格式也都可以处理。   zipfile模块常用的一些操作和方法:     is_zipfile(filename)  测试filename的文件,看它是否是个有效的zipfile     ZipFile(filename[,mode[,compres...

python反射

isinstance: 判断对象是否是属于这个类(向上判断)type: 返回某对象的数据类型issubclass: 判断某类是否是这个类的子类 1 class Animal: 2 def chi(self): 3 print('吃饭') 4 class Cat(Animal): 5 def he(self):...

python中出现ascii编码问题的解决办法

一劳永逸,一次性全盘解决的办法  环境变量中去设置 以centos 7为例:   vim /etc/profile    export PYTHONIOENCODING=utf-8   source /etc/profile 其它方法有: 代码头加: #coding:utf-8   等各种格式的声明 python2: import sys reload(s...

Shell终端收听音乐--网易云音乐命令行版

Musicbox:网易云音乐命令行版本 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写。 这款命令行的客户端使用 Python 构建,以 mpg123 作为播放后端: Vim 式的流畅操作,支持快捷键绑定 支持电台、收藏等各种特色功能 支持 OS X 及各类 Linux 发行版 安装Python2.* pacman -S pytho...

python中print函数的使用小技术-使用分隔符和行尾符

关于python3中,print函数,可以同时打印输出多个和多种类型数据,如下: >>> print(1,"abc",2,"https://www.cnblogs.com/5201351",True) 1 abc 2 https://www.cnblogs.com/5201351True >>> 如上可以看出,各项默认以...

第七章 Python 盒子:模块、包和程序

前戏部分 模块,用一堆(很多行)代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来说,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。 其实模块只是有很多 Python 代码的一个文...