详解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下函数参数的传递(参数带星号的说明)
Sep 19 Python
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
Python线程中对join方法的运用的教程
Apr 09 Python
收藏整理的一些Python常用方法和技巧
May 18 Python
Python聊天室实例程序分享
Jan 05 Python
老生常谈Python进阶之装饰器
May 11 Python
Python实现查看系统启动项功能示例
May 10 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python 同时读取多个文件的例子
Jul 16 Python
python hashlib加密实现代码
Oct 17 Python
python实现简单图书管理系统
Nov 22 Python
如何通过python实现人脸识别验证
Jan 17 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
用PHP产生动态的影像图
2006/10/09 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
python查看列的唯一值方法
2018/07/17 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
Django REST framwork的权限验证实例
2020/04/02 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
英语感恩演讲稿
2014/01/14 职场文书
英语分层教学实施方案
2014/06/15 职场文书
总经理检讨书
2014/09/15 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
防汛通知
2015/04/25 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
MySQL笔记 —SQL运算符
2022/01/18 MySQL