用Python 实现康威生命游戏

举报
xenia 发表于 2019/12/15 15:10:27 2019/12/15
【摘要】 康威生命游戏是一个久负盛名的数学游戏,有简单的规则和无穷无尽的组合。它不仅看起来非常迷幻,而且极富理性,可能用来模拟物理、化学、生态、社会等等各种现象。在国内外,都有很多小组专门研究这个游戏,并创造出了许多惊为天人的模型。本课程将使用 pygame 模块来实现这样一个游戏,让你在趣味游戏中提升对 Python 的理解,入门 pygame。本教程由 Eric_Wenyi 发布在 实验楼,完整教...

康威生命游戏是一个久负盛名的数学游戏,有简单的规则和无穷无尽的组合。它不仅看起来非常迷幻,而且极富理性,可能用来模拟物理、化学、生态、社会等等各种现象。在国内外,都有很多小组专门研究这个游戏,并创造出了许多惊为天人的模型。

本课程将使用 pygame 模块来实现这样一个游戏,让你在趣味游戏中提升对 Python 的理解,入门 pygame。

本教程由 Eric_Wenyi 发布在 实验楼,完整教程、代码及在线练习地址:Python 实现康威生命游戏(更多课程请查看全部 - 课程 - 实验楼


一、实验介绍

1.1 实验内容

内容背景

康威生命游戏,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。

它最初于1970年10月在《科学美国人》杂志上马丁·葛登能的“数学游戏”专栏出现。


Conways_game_of_life_breeder_animation.gif

内容描述

生命游戏是一个零玩家游戏。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。

可以先在下面的地址中玩玩看。(注意这游戏迷幻的很)

http://pmav.eu/stuff/javascript-game-of-life-v3.1.1/

规则

每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。

  • 人口过少:当周围低于2个(不包含2个)存活细胞时, 本单元活细胞死亡。

  • 稳定:当周围有2个或3个存活细胞时, 本单元细胞保持原样。

  • 人口过剩:当周围有3个以上的存活细胞时,本单元活细胞死亡。

  • 繁殖:当周围有3个存活细胞时,本单元细胞存活/活化。

可能初看觉得这就是个模拟细胞繁衍的东西,规则也很简单,这能有什么意思。

这很有意思。

在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。对于生成的形状和秩序我们称作 pattern。或者在这里,我们也把它称作 creature。

生物图鉴

静物族:面包


98px-Game_of_life_loaf.svg.png

震荡族:信号灯


Game_of_life_blinker.gif

震荡族:脉冲星


Game_of_life_pulsar.gif

宇宙飞船族:LWSS


Game_of_life_animated_LWSS.gif

XXX族:质数计算器


gtk-primes.png

(本图出自 golly 的主页:http://golly.sourceforge.net/ golly 是一个跨平台专门用于探索生命游戏与元胞自动机的开源软件)

趣闻:康威曾经相信没有 pattern 能够生成无限多的活细胞,并悬赏 50刀 奖赏能在 1970 年前找到反例的人。结果就是在生命游戏的世界中出现了很多枪支***啦(不懂这个梗的同学可以去看一看http://pmav.eu/stuff/javascript-game-of-life-v3.1.1/ 中间的Gosper Glider Gun)

1.2 实验知识点

  • 有限状态机

  • pygame模块

  • python 2.7

1.3 实验环境

  • python2.7

  • Xfce终端

1.4 适合人群

本课程难度中等,适合具有 Python 基础和 pygame 基础的同学学习。

1.5 代码获取

你可以通过下面命令将代码下载到实验楼环境中,作为参照对比进行学习。

1576393547428230.png

由于我们的游戏世界是上下左右循环的,所以将矩阵往8个方向进行循环移位得到8个新矩阵,将8个新矩阵相加就能够得到每个细胞周围的活细胞数量的矩阵了。

np.roll 操作就是循环移位操作。np.roll(X, i, 0) 中的 X 代表输入矩阵,i 代表移位的大小,0 代表移位的维度,np.roll(X, 1, 0) 代表矩阵下移一格,np.roll(X, 1, 1) 代表右移一格,if (i != 0 or j != 0)) 是为了将原矩阵从计算中去除。

通过活细胞数量矩阵根据更新规则更新我们的世界。因为矩阵单位只有两种状态,这里我们只考虑存活态就可以了。注意到存活的条件:

  • 稳定:当周围有2个或3个存活细胞时, 本单元细胞保持原样。

  • 繁殖:当周围有3个存活细胞时,本单元细胞存活/活化。

即细胞周围数量等于3 或者 本单元细胞存活的同时周围有2个存活细胞的时候。本单元细胞将在下一代存活(也可看作繁衍)

翻译过来就是:

(nbrs_count == 3) | (X & (nbrs_count == 2))

注意到这种方法虽然便捷,但显然效率不怎么样。因为这种做法更新了矩阵的每一个单元,这完全没有必要,大部分情况下矩阵都是稀疏的。但如何改进就不在本文的讨论范畴内了。欢迎读者自己尝试提升效率。

我们实现的生命游戏操作如下:

  • R键 :重置世界

  • 回车键 :进行演化

  • 空格键 :暂停演化

  • 鼠标左键 :增添一个细胞

  • 鼠标右键 :销毁一个细胞

下面是用 pygame 实现的全部代码。

1576393620106593.png

1576393620993637.png

1576393620392213.png

1576393620210160.png

1576393620160916.png

1576393620880425.png

六、实验总结

实验本身还是很有难度的,但是做出来的成就感就爆棚了呀。在学习的过程中就是需要一些自己感兴趣的东西来带动我们提升。如果还对游戏类的 Python 项目感兴趣的话,推荐 pygame 开发打飞机游戏 和 200行Python代码实现2048 去深入理解 pygame 模块。

七、延伸阅读

八、课后习题

自由地玩耍或者用自己喜欢的语言实现一个生命游戏。


完整教程、代码及在线练习地址:Python 实现康威生命游戏(更多课程请查看全部 - 课程 - 实验楼


本文转载自异步社区

原文链接:https://www.epubit.com/articleDetails?id=NC7E3EF944580000150FABAF0D14C9A10

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。