详解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 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
Python常见的pandas用法demo示例
Mar 16 Python
numpy中的ndarray方法和属性详解
May 27 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
python将字母转化为数字实例方法
Oct 04 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
python操作cfg配置文件方式
Dec 22 Python
tensorflow求导和梯度计算实例
Jan 23 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 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+MySQL删除操作实例
2015/01/21 PHP
php实现json编码的方法
2015/07/30 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python入门篇之字典
2014/10/17 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
Python版中国省市经纬度
2020/02/11 Python
Python如何合并多个字典或映射
2020/07/24 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
文明城市标语
2014/06/16 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
离婚协议书怎么写
2015/01/26 职场文书
红与黑读书笔记
2015/06/29 职场文书
Redis 常见使用场景
2021/08/30 Redis
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS