康威生命游戏是由英国教授John Horton Conway提出的一种生命仿真游戏。其具体的形式是,所有的细胞生活在一个二维平面上,一个细胞在下一个时刻的生存状态取决于当前时刻周围的各个细胞的生存状态,如果相邻方块的存活细胞过多,则该细胞则会因为物资过于匮乏在下一时刻死去,如果相邻方块的存活细胞过少,则该细胞则会因为孤单而在下一时刻死亡。康威生命游戏在一定的给定初始条件以及存活条件下,会呈现出不同的生命发展趋势,最终可能会趋于一个收敛的稳定状态,也可能永不停止。这也是元胞自动机的雏形。

在游戏开始时,我们随机地设定每一个细胞的生存状态,并且规定规则如下:

1、如果该细胞周围的八个细胞在当前时刻恰好有三个生存,则该细胞在下一时刻仍然存活;

2、其他情况下,该细胞的下一时刻状态将变成死亡;

3、用1表示存活,用0表示死亡;

4、对于边界上的细胞,我们将模型考虑成一个首尾相接的平面,即对于右侧边界的点,其再右侧的点为左边界的点,对于上下边界以及四个角落的点采用相同的考虑方式。

在这个实例中,我们采用matplotlib.pyplot的散点图的方式来表示细胞的存活状态。

以下是具体代码内容:

首先,引入相关的需要使用的库:

import matplotlib.pyplot as plt
import numpy as np
import random

初始化二维网格以及所有细胞的存活状态:

class GameOfLife:cells = []def __init__(self, size):self.size = sizedef cells_ini(self):self.cells = [[1 if random.random() > 0.5 else 0 for i in range(self.size)] for j in range(self.size)]

此处size接收二维网格的长度和宽度,我们默认其为一个正方形。通过random.random()方法,以0.5的概率赋予每个网格点存活/死亡的初始状态。

尔后,对每个点的周围相邻点的细胞当前存活状态进行计算,并据此确定下一时刻的生存状态:

    def count_nearby_alive(self, x, y):near = [-1, 0, 1]nearby = 0for dx in near:for dy in near:if dx + x == self.size:new_x = 0if dy + y == self.size:new_y = 0if dx + x != self.size and dy + y != self.size:new_x = dx + xnew_y = dy + ynearby += self.cells[new_x][new_y]nearby = nearby - self.cells[x][y]return nearbydef change_status(self, x, y):count = self.count_nearby_alive(x,y)return 1 if count == 3 else (0 if count < 2 or count > 3 else self.cells[x][y])

此处,读者可以通过修改change_status方法中的return结果来修改生存规则。

最后,反复更新每个时刻的二维网格生存状态,并且用ax.cla()方法不断更新打印图像的幕布,实现图像的动态显示:

    def update_whole_cells(self):self.cells = [[self.change_status(x,y) for y in range(self.size)] for x in range(self.size)]def plot_it(self):time = 0more = 0.8ax.axis([-more,1+more,-more,1+more])while True:time = time + 1ax.cla()ax.axis('square')ax.axis('off')plt.title('Game of Life (Time step '+str(time)+')')self.update_whole_cells()plot_list = (np.array([(i,j) for i in range(self.size) for j in range(self.size) if self.cells[i][j] == 1]) / self.size).transpose()ax.scatter(plot_list[0], plot_list[1], s=1300 / self.size, c='b', marker='s', edgecolors='none')plt.pause(0.01)

执行主程序:


def run_life_game():global fig, axfig, ax = plt.subplots()Life = GameOfLife(100)Life.cells_ini()Life.plot_it()plt.grid()plt.show()return Noneif __name__ == '__main__':run_life_game()

该代码纯属个人兴趣由来编写,如有不当之处或可精进修改之处敬请指正。

完整代码如下:

import matplotlib.pyplot as plt
import numpy as np
import randomclass GameOfLife:cells = []def __init__(self, size):self.size = sizedef cells_ini(self):self.cells = [[1 if random.random() > 0.5 else 0 for i in range(self.size)] for j in range(self.size)]def count_nearby_alive(self, x, y):near = [-1, 0, 1]nearby = 0for dx in near:for dy in near:if dx + x == self.size:new_x = 0if dy + y == self.size:new_y = 0if dx + x != self.size and dy + y != self.size:new_x = dx + xnew_y = dy + ynearby += self.cells[new_x][new_y]nearby = nearby - self.cells[x][y]return nearbydef change_status(self, x, y):count = self.count_nearby_alive(x,y)return 1 if count == 3 else (0 if count < 2 or count > 3 else self.cells[x][y])def update_whole_cells(self):self.cells = [[self.change_status(x,y) for y in range(self.size)] for x in range(self.size)]def plot_it(self):time = 0more = 0.8ax.axis([-more,1+more,-more,1+more])while True:time = time + 1ax.cla()ax.axis('square')ax.axis('off')plt.title('Game of Life (Time step '+str(time)+')')self.update_whole_cells()plot_list = (np.array([(i,j) for i in range(self.size) for j in range(self.size) if self.cells[i][j] == 1]) / self.size).transpose()ax.scatter(plot_list[0], plot_list[1], s=1300 / self.size, c='b', marker='s', edgecolors='none')plt.pause(0.01)def run_life_game():global fig, axfig, ax = plt.subplots()Life = GameOfLife(100)Life.cells_ini()Life.plot_it()plt.grid()plt.show()return Noneif __name__ == '__main__':run_life_game()

Python | 实现简单的康威生命游戏相关推荐

  1. Python - 康威生命游戏Conway's game of life

    使用python实现康威生命游戏Conway's game of life 参考<python极客项目编程> 游戏规则: 任何四周邻居存活数少于两个的存活网格将死亡,因为人口稀少. 任何四 ...

  2. 康威生命游戏java_Java Python 康威生命游戏 - 命令行版

    Java & Python 康威生命游戏 - 命令行版(2020年7月23日) 制作背景 高二的时候看霍金的<大设计>最后几页的时候看到里面提到了康威生命游戏,介绍了它的规则,感觉 ...

  3. 康威生命游戏简易版python_turtle实现

    以下资料引用至百度百科 ​ 康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序. 概述: 生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏.事实 ...

  4. 康威生命游戏是如何搭建计算机的?

    2020年4月,数学家约翰·康威(John H. Conway)因新冠肺炎去世.大家回顾康威教授平生贡献时,不可避免要提到伟大.深刻的"康威生命游戏"(Conway's Game ...

  5. Conwaylife_HDLbits(康威生命游戏)

    康威生命游戏:一个二维细胞自动机. "游戏"是在一个二维细胞网格上进行的,每个细胞要么是1(活的),要么是0(死的).判断依据和周围8个相邻有关. 使用一个16x16的圆环体,其中 ...

  6. Go语言模拟康威生命游戏Conway‘s Game of Life

    康威生命游戏是一种很有意思的游戏,显示的是细胞的生死状态取决于周边细胞(相邻8个细胞)的存活状态,是一种模拟生命的演化过程. 反过来看,还可模拟病毒的传染,患者传染给接触者,也可以设定概率,另外是否戴 ...

  7. 用Verilog实现二维细胞自动机——康威生命游戏(Conway's Game of Life)

    在一个二维的棋盘上,每个格子有存活(1)和死亡(0)两种状态.在每个时间周期,每个格子会根据他的8个邻居来决定自己下一个周期的状态: 0-1个邻居:人口稀少,死亡(0): 2个邻居:保持原状态: 3个 ...

  8. [Codewar训练]Conway's Game of Life - Unlimited Edition(康威生命游戏)

    问题: 段位:4 说明: 就是经典的康威生命游戏,输入会提供一个二维数组,然后根据提供的generations,计算出多少代的生命样子,并且需要把多余的(就是整行整列为0),外围的空间去掉,只剩下概括 ...

  9. python猜数字游戏编程循环_使用python进行简单的猜数字游戏(while循环)

    使用python进行简单的猜数字游戏(while循环) 本案例主要是练习while循环,需求:如果给出某人的年龄,让你猜,猜对的话打印出You guess right 如果猜的数字小于真实年龄值,那就 ...

最新文章

  1. 我与监控宝之间的点点滴滴
  2. 你不知道的 Node.js 工具函数
  3. windows下Call to undefined function curl_init() error问题
  4. dede tags.php漏洞,织梦dedecms安全漏洞之/include/common.inc.php漏洞解决办法
  5. 拓端tecdat|R语言Copula的贝叶斯非参数估计
  6. 模拟人生Java修改_模拟人生4 常用修改秘籍作弊码一览 修改秘籍怎么用
  7. Ubuntu18.04安装ceres-solver
  8. 带你读懂《深入理解计算机系统》开篇
  9. 【外汇天眼】外汇周回顾:MT5发布新功能,M4Markets收购计划成功
  10. 西门子数控机床如何用FTP进行程序传输
  11. 这些常见的漏洞和修复方法你知道吗?
  12. 智能手持终端CPU选型报告
  13. xp桌面计算机在哪个文件夹,windows桌面文件路径 windows xp 桌面文件默认存放路径...
  14. python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇
  15. 《C程序设计快速进阶大学教程》第8章编程题
  16. QT Designer使用入门
  17. 修改Transmission登陆密码
  18. 阿里、中兴、中国联通打造物联网区块链框架
  19. 眼睛糖果插件 Alien Skin Eye Candy 7.2.3.37 for Mac汉化版(10.14.1)
  20. 自己动手不求人 - ghost安装系统软件硬盘安装器 安装ghost图文教程

热门文章

  1. android 原生请求权限代码
  2. 优酷弱网平台落地实践
  3. arxiv数据_使用neo4j第1部分分析arxiv数据
  4. 弘扬岭南画派爱国精神,广州市海珠区文博管理中心等联袂举办爱国名画进校园
  5. 另类神秘幽浮飞棍之迷已被解开
  6. BGP路由协议实验配置命令
  7. Java cipher加密与解密
  8. 上拉、下拉电阻的原理和作用
  9. 关于shell unix下,直接执行shell与sh 执行 或加 . 脚本 的区别及含义
  10. MyBatis中的resultMap两个association