详解Python 实现元胞自动机中的生命游戏(Game of life)


Posted in Python onJanuary 27, 2018

简介

细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有NN个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把33的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。

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

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

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

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

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

代码

"""
元胞自动机 Python 实现
"""
import numpy as np
import matplotlib.pyplot as plt


class GameOfLife(object):

  def __init__(self, cells_shape):
    """
    Parameters
    ----------
    cells_shape : 一个元组,表示画布的大小。

    Examples
    --------
    建立一个高20,宽30的画布
    game = GameOfLife((20, 30))
    
    """

    # 矩阵的四周不参与运算
    self.cells = np.zeros(cells_shape)

    real_width = cells_shape[0] - 2
    real_height = cells_shape[1] - 2
    
    self.cells[1:-1, 1:-1] = np.random.randint(2, size=(real_width, real_height))
    self.timer = 0
    self.mask = np.ones(9)
    self.mask[4] = 0
  
  def update_state(self):
    """更新一次状态"""
    buf = np.zeros(self.cells.shape)
    cells = self.cells
    for i in range(1, cells.shape[0] - 1):
      for j in range(1, cells.shape[0] - 1):
        # 计算该细胞周围的存活细胞数
        neighbor = cells[i-1:i+2, j-1:j+2].reshape((-1, ))
        neighbor_num = np.convolve(self.mask, neighbor, 'valid')[0]
        if neighbor_num == 3:
          buf[i, j] = 1
        elif neighbor_num == 2:
          buf[i, j] = cells[i, j]
        else:
          buf[i, j] = 0
    self.cells = buf
    self.timer += 1
  
  def plot_state(self):
    """画出当前的状态"""
    plt.title('Iter :{}'.format(self.timer))
    plt.imshow(self.cells)
    plt.show()

  def update_and_plot(self, n_iter):
    """更新状态并画图
    Parameters
    ----------
    n_iter : 更新的轮数
    """
    plt.ion()
    for _ in range(n_iter):
      plt.title('Iter :{}'.format(self.timer))
      plt.imshow(self.cells)
      self.update_state()
      plt.pause(0.2)
    plt.ioff()
          

if __name__ == '__main__':
  game = GameOfLife(cells_shape=(60, 60))
  game.update_and_plot(200)

效果图

详解Python 实现元胞自动机中的生命游戏(Game of life)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
使用Python实现windows下的抓包与解析
Jan 15 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
详解Django定时任务模块设计与实践
Jul 24 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
python datetime处理时间小结
Apr 16 Python
浅析Python requests 模块
Oct 09 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
python基础之停用词过滤详解
Apr 21 Python
Python实现的栈(Stack)
Jan 26 #Python
使用python实现链表操作
Jan 26 #Python
Python中optparser库用法实例详解
Jan 26 #Python
python利用socketserver实现并发套接字功能
Jan 26 #Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 #Python
Python编程实现的简单神经网络算法示例
Jan 26 #Python
Django使用httpresponse返回用户头像实例代码
Jan 26 #Python
You might like
杏林同学录(五)
2006/10/09 PHP
php笔记之:有规律大文件的读取与写入的分析
2013/04/26 PHP
php不写闭合标签的好处
2014/03/04 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python AES加密实例解析
2018/01/18 Python
python xpath获取页面注释的方法
2019/01/14 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
python Matplotlib模块的使用
2020/09/16 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
教师求职自荐书
2014/06/14 职场文书
应用心理学专业求职信
2014/08/04 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技