以下资料引用至百度百科

康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序。

概述:

生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏。事实上,也是因为它模拟和显示的图像看起来颇似生命的出生和繁衍过程而得名为“生命游戏”。在游戏进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状一经锁定就不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。

每个方格中都可放置一个生命细胞,每个生命细胞只有两种状态:

“生”或“死”。用黑色方格表示该细胞为“生”,空格(白色)表示该细胞为“死”。或者说方格网中黑色部分表示某个时候某种“生命”的分布图。生命游戏想要模拟的是:随着时间的流逝,这个分布图将如何一代一代地变化。

生存规则:

​游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。

应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。

也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。

(1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为生,则保持不变。

(2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。

(3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。

(4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。

可以把最初的细胞结构定义为种子,当所有种子细胞按以上规则处理后,可以得到第1代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。

上面的生存定律当然可以任意改动,发明出不同的“生命游戏”。

图片解释:

最近看丹尼尔.丹尼特的《直觉泵》,书中简单介绍了两个计算机科学方面的思考工具,一个是寄存器机(一种假想的计算机,类似于图灵机), 还有康威的生命游戏。

遂利用python的turtle模块简单模拟一下

1、

根据一个二维数组arr绘制图形 当arr[i,j]==1 黑色,表示生,当arr[i,j]==0 白色,表示死。

文件draw_pic.py

# -*- coding:utf-8 -*-
# Author : MorbidMuse
# data : 2022/7/15 8:24# 根据一个二维数组arr绘制图形 当arr[i,j]==1 黑色,表示生,当arr[i,j]==0 白色,表示死
import turtle
import numpy as npdef my_goto(t,x,y):t.up()t.goto(x,y)t.down()def draw_square(t,d,color):t.fillcolor(color)t.begin_fill()t.setheading(0)for i in range(4):t.fd(d)t.left(90)t.end_fill()def draw(arr,x0,y0,d):''':param m: 二维列表行数:param n: 二维列表列数:param x0: 绘制起始点的x坐标:param y0: 绘制起始点的y坐标:param d:  绘制小正方形的边长:return:'''t = turtle.Turtle()t.pencolor('orange')turtle.tracer(0)my_goto(t,x0,y0)m,n = arr.shapefor i in range(m):for j in range(n):if arr[i,j] == 1:color = 'black'else:color = 'white'draw_square(t,d,color)t.fd(d)t.backward(d*n)if i != m-1:t.setheading(-90)t.fd(d)turtle.update()# turtle.done()if __name__ == '__main__':arr = np.array([[0,1,0],[1,0,1],[0,0,1]])draw(arr,-300,0,30)turtle.done()

结果:

2、life_game.py   注意这个脚本导入了上一个脚本

# -*- coding:utf-8 -*-
# Author : MorbidMuse
# data : 2022/7/15 7:56"""
模拟生命游戏:在一个二维平面的世界,物理规则如下:1.整个平面被分成m行n列的二维表格2.每个单元格只有两种状态,0代表死,用白色表示;1代表生,用黑色表示3.每一个单元格周围有8个邻居,分别位于东南西北,以及对角线方向的东北,东南,西南,西北。4.单元格在下一个时刻的状态取决于其当前时刻邻居的存活状态:若邻居存活数等于3,则生;若邻居存活数等于2,则保持当前状态;其他情况,小于2(太孤单了),或者大于3(太拥挤了),则死本脚本的功能:给定一个二维数组表示世界的开端,通过turtle绘制其图形表示迭代几代,观察生命游戏世界的变化
"""
import numpy as np
from draw_pic import draw
import turtledef live_or_die(arr):'''计算下一个时刻,当前单元格的存活状态:param arr: 3*3的二维数组,代表当前单元格和他的所有邻居:return:0:die1:live'''crrent_status = arr[1,1]neighbor_live_num= 0if crrent_status == 1:neighbor_live_num = np.count_nonzero(arr) - 1  # np.count_nonzero(arr))  统计非0元素的个数else:neighbor_live_num = np.count_nonzero(arr)if neighbor_live_num == 2:next_status = crrent_statuselif neighbor_live_num == 3:next_status = 1else:next_status = 0return next_statusdef origin_to_extend(source):'''将源二维数组的外围添加一圈邻居,数值填充为0,作为哨兵,以防止判断外圈单元格时出现下标越界:param source: 源二维数组:return: 扩充后的二维数组'''m,n = source.shaperes = np.zeros((m+2,n+2))res[1:m+1,1:n+1] = sourcereturn resdef draw_x_life_game(arr,x,size):'''绘制x次迭代的生命游戏的世界:return:'''now = arrdraw(now, -450, 0, size)  # 绘制当前状态for k in range(x):#计算下一代next_time = nowex_now = origin_to_extend(now)m, n = now.shapefor i in range(m):for j in range(n):next_time[i,j] = live_or_die(ex_now[i:i+3,j:j+3])# print(next_time)draw(next_time, -450 + (size * (n + 1))*(k+1), 0, size)now = next_timedef main():now = np.array([[0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 1, 1, 1],[0, 0, 0, 0, 0, 0, 0],[0, 0, 1, 1, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0],[1, 1, 1, 0, 0, 0, 0],[1, 0, 0, 0, 0, 0, 0],])# now = np.eye(11,11)draw_x_life_game(now, 4,20)#保存图片ts = turtle.getscreen()ts.getcanvas().postscript(file="3.eps")turtle.done()if __name__ == '__main__':main()

结果:

这个在书中被叫做吞噬者,因为随着迭代的进行,左下方的形状会把右上角的形状吞噬掉 。

解释:

通过修改main()函数中的now二维数组的输入,以及修改

89行 draw_x_life_game(now, 4,20)中的第二个参数(迭代次数),第三个参数(小正方形的边长)可以绘制其他不同的情况

如:

信号灯:两代之间交替

滑翔机:经过4代又回到原来的形状,就像从开始位置滑翔到了终止位置

静止的生命:保持不变

消失的斜线

补充:

最后的保存图片为eps格式,可以通过ps打开

如果使用.jpg会因为信息丢失无法打开


35岁学python,也不知道为了啥

康威生命游戏简易版python_turtle实现相关推荐

  1. Conway‘s Game of Life - Unlimited Edition(康威生命游戏-无限版)

    最近也不知道在忙啥,反正好久没玩 codewars 了,上去看看的时候偶尔看到了一个很有意思的题目,稍微看了一下说明,感觉可以做出来,于是就开始了长达 2+2 个小时的解题过程. 下面是简单的题目说明 ...

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

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

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

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

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

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

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

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

  6. python棋类项目规划一——五子棋游戏简易版——项目一

    五子棋游戏简易版 目前只能人人对战 o 代表黑棋 x 代表白棋 . 代表无棋子 以下是代码: def nemBoard():'''初始化棋盘''' board = [[0 for i in range ...

  7. Conwaylife_HDLbits(康威生命游戏)

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

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

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

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

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

最新文章

  1. C#编写的多生产者多消费者同步问题
  2. 随机线性插值提高神经网络的健壮性
  3. 业余草 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
  4. java web 过滤器跟拦截器的区别和使用
  5. 如何查看Linux上程序或进程用到的库
  6. python读取文件的常用方法
  7. python3使用serial以及pyserial包读取串口数据并解析字节数组,涉及数据移位以及Python无符号整数转为有符号整数操作
  8. Nginx的SSL相关指令
  9. Mac版本Navicat下载
  10. python easy install 编译_python安装easy_install和pip
  11. 移动web时代已开启:腾讯X5内核浏览服务
  12. matlab randi 函数,MATLAB中的randi函数
  13. arm-2009q1-203-arm-none-linux-gnueabi.bin执行错误解决
  14. 诺基亚挥别Qt,转手给Digia
  15. 自动生成SQL查询、删除、更新、插入语句
  16. node js npm grunt安装,elasticsearch-head 5.X安装
  17. zrender源码分析4--初始化Painter绘图模块2
  18. lammps教程:以Cu纳米磨削为例详解region命令
  19. 论需求分析方法及应用--系统分析师
  20. ‘gbk‘ codec can‘t decode byte 0xae in position 199: illegal multibyte sequen 问题解决

热门文章

  1. POJ 1637 混合图的欧拉回路 + Dinic
  2. python数据类型与数据结构--内置数据类型
  3. python安装torch出现from torch._C import *ImportError: DLL load failed:报错解决方法
  4. ICP备案和ICP许可证区别
  5. 在线教育平台项目——需求分析
  6. IRP(I/O Request Package)详解
  7. easyUI日期框的日期范围限制
  8. 交换机与路由器技术-08-路由器上配置DHCP
  9. 【Python 脚本报错】AttributeError:‘module‘ has no attribute ‘xxx‘的解决方法
  10. MATLAB面向对象_及_AppDesigner使用