1. 生命游戏是什么

生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。

规则看起来很简单,但却能演绎出无穷无尽的内容。

滑翔者:每4个回合"它"会向右下角走一格。虽然细胞早就是不同的细胞了,但它能保持原本的形态。

轻量级飞船:它的周期是4,每2个回合会向右边走一格。

脉冲星:它的周期为3,看起来像一颗周期爆发的星星。

更复杂的图案。

来体会一下这些作品的脑洞以及震撼:

史诗般的生命游戏http://www.iqiyi.com/w_19rsq435c9.html

用生命游戏实现生命游戏:http://www.bilibili.com/video/av616329/index.html

2. Console版:一个简单的Python实现

生命游戏的规则其实很简单。我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。

每个格子的生死遵循下面的原则:

1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。

2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;

3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)

设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。

我们用#代表活的细胞,空格表示死的细胞,那么我们可以用控制台打印字符、清屏来模拟生命游戏。我的代码在github上:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.py

游戏世界尺寸为60x20,随机生成初始状态,循环边界,按任意键进入下一帧,q退出。

单纯的看这段程序,好像并没有什么问题,代码逻辑正确、清晰。

效果图:

3. Python列表生成式

我们来尝试一些python的高级特性,比如列表生成式。

例如,在生成初始值时,我们一般这样写:

1 screen = []

2 width = 60

3 height = 20

4 def Init():

5 for i in range(height):

6 line = []

7 for j in range(width):

8 if random.random() > 0.8:

9 line.append('#')

10 else:

11 line.append(' ')

12 screen.append(line)复制代码

如果用列表生成式,我们可以这样写:

1 def Init():

2 global screen

3 screen = [['#' if random.random() > 0.8 else ' ' for i in range(width)] for j in range(height)]复制代码

注意这里必须用global声明,否则screen将默认作为函数内的局部变量。这里用了两层列表生成式来生成一个二维数组。

列表生成式很好很强大,如果用好能大大提高效率。但会牺牲一定的可读性,如果单个表达式写的过于复杂,那就变成write-only了。尤其是在团队开发情况下,可读性日益重要。

重写后的代码:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.1.py

如果仅仅是作为练习,这样就已经足够好了,简洁易读。

4. 重构:面向对象与重用

可是我们还不能满足,我们来给生命插上面向对象的翅膀,在模块化的天空中翱翔。对,就是让他跟别的模块搞对象!

先来定义一个类GameOfLifeWorld,之前那些丑陋的全局变量,让他们统统变成成员变量,再也不能在外兴风作浪。

class GameOfLifeWorld:

width = 100

height = 100

cells = []

…略复制代码

然后把UI层剥离,只保留游戏的核心逻辑。

代码:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLifeWorld.py

5. GUI:Tkinter的调用

有了上一步的铺垫,我们终于可以让Tkinter粉墨登场了。Tkinter是著名的UI库,Python自带的Tkinter是一个精简版,不过也够我们用的了。

我们这里用到的主要是Canvas,Button控件。Canvas画布用来绘制游戏区,Button用来交互。

代码:

https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLifeWorld.py

效果:

以上就是这样,项目我还会继续改进,希望大家喜欢。

python游戏后端_Python实现生命游戏相关推荐

  1. c语言设计生命游戏,C语言实现生命游戏.doc

    C语言实现生命游戏 本世纪70年代,人们曾疯魔一种被称作"生命游戏"的小游戏,这种游戏相当简单.假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:&q ...

  2. python打地鼠游戏教程_Python入门小游戏,炫酷打地鼠教程第二部分,都是干货

    还记得那位玩打地鼠小游戏,然后学会python的女白领吗? 那份教程还没有写完,只写到了对游戏中精灵的定义,然后我们继续写. 实现了游戏精灵的定义后,我们就要开始展现真正的技术啦,也就是写主程序. 首 ...

  3. python猜数游戏流程_Python 猜数字游戏

    游戏内容:猜数字游戏 游戏过程描述 程序运行起来,随机在某个范围内选择一个整数. 提示用户输入数字,也就是猜程序随即选的那个数字. 程序将用户输入的数字与自己选定的对比,一样则用户完成游戏,否则继续猜 ...

  4. Python | 实现简单的康威生命游戏

    康威生命游戏是由英国教授John Horton Conway提出的一种生命仿真游戏.其具体的形式是,所有的细胞生活在一个二维平面上,一个细胞在下一个时刻的生存状态取决于当前时刻周围的各个细胞的生存状态 ...

  5. python五子棋游戏说明_python实现五子棋游戏(pygame版)

    python实现五子棋游戏(pygame版) 发布时间:2020-10-11 17:05:18 来源:脚本之家 阅读:67 作者:king0964 本文实例为大家分享了python五子棋游戏的具体代码 ...

  6. python扫雷游戏代码_python实现扫雷游戏的示例

    扫雷是一款益智类小游戏,最早于 1992 年由微软在 Windows 上发行,游戏适合于全年龄段,规则简单,即在最短的时间内找出所有非雷格子且在中间过程中不能踩到雷, 踩到雷则失败,需重新开始. 本文 ...

  7. python能制作游戏吗_Python 能写游戏吗?有没有什么开源项目?

    先森林好,负基础Python游戏开发入门了解一下~ 低能预警! 大扎好,没油轱天乐,我系渣渣喵,探挽教程,介四里没有学过的船新教程(简单版).全程蹄把蹄教学,包教包会,害外面辣些妖艳教程大不一样.挤需 ...

  8. python如何开发游戏脚本_python能开发游戏吗

    python可以写游戏,但不适合.下面我们来分析一下具体原因. 用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的.但一般来说,还是用工业机器人更合适对吗? 比较大型的, ...

  9. python适合开发游戏吗_python能开发游戏吗

    python可以写游戏,但不适合.下面我们来分析一下具体原因. 用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的.但一般来说,还是用工业机器人更合适对吗? 比较大型的, ...

最新文章

  1. 安装Rabbitmq脚本
  2. Spring基础知识及入门
  3. 阿里云叔同:以容器为代表的云原生技术,已经成为释放云价值的最短路径
  4. 【机器视觉】 import算子
  5. 学会用core dump调试程序错误
  6. 九种 0-1 背包问题详解
  7. 【图像处理】——Python+opencv实现提取图像的几何特征(面积、周长、细长度、区间占空比、重心、不变矩等)
  8. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理
  9. java 内存泄露 jmap_jmap命令 检查内存泄漏
  10. surface simplification using quadratic error metrics
  11. oracle从子表取出前几行数据:
  12. 安卓手机通电自动开机,自动执行脚本,断电关机,连接电源手机自动开机,断电关机
  13. 【C++STL库】stack常用函数学习
  14. 高精度地图数据的结构
  15. Mysql区分大小写问题
  16. 数据库异常用户sa登录失败_Sa登录失败
  17. 怎样设置和检测浏览器语言
  18. tekla中钢筋外形(TSM.RebarGeometry)
  19. clickhouse UI可视化工具
  20. K8S 数据卷volumes之Secret

热门文章

  1. Web实现:仿QQ注册页
  2. 蓝牙协议栈(Bluetooth stack)简介
  3. 什么是MMU,MMU的作用
  4. EPSON简单视觉应用编程
  5. 前端地图使用高德地图隐藏左下角的logo和copyright
  6. 家庭组计算机无权限,win7系统家庭组提示“没有权限”访问对方文件夹的解决方法...
  7. mysql存储animoji_iphone X Animoji怎么导入微信表情-在微信中导入Animoji表情包的方法 - 河东软件园...
  8. 网报iphone6s的a9处理器秒杀macbook
  9. 网络机顶盒哪个好?发烧友实测2023网络机顶盒排名
  10. required a bean of type 'com.xxx.xxx' that could not be found.错误