详解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 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
python中as用法实例分析
Apr 30 Python
21行Python代码实现拼写检查器
Jan 25 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
Python如何快速上手? 快速掌握一门新语言的方法
Nov 14 Python
python将字典内容存入mysql实例代码
Jan 18 Python
使用python制作一个解压缩软件
Nov 13 Python
python构建指数平滑预测模型示例
Nov 21 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
Python流程控制常用工具详解
Feb 24 Python
Python基于paramunittest模块实现excl参数化
Apr 26 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 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
在Mac上删除自己安装的Python方法
2018/10/29 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
工程售后服务方案
2014/06/08 职场文书
会议接待欢迎标语
2014/10/08 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
运动会新闻报道稿
2015/07/22 职场文书
《春酒》教学反思
2016/02/22 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL