详解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的lambda匿名函数的简单介绍
Apr 25 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
python变量的作用域是什么
May 26 Python
Python实现我的世界小游戏源代码
Mar 02 Python
python实现腾讯滑块验证码识别
Apr 27 Python
pytorch fine-tune 预训练的模型操作
Jun 03 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
Yii操作数据库的3种方法
2014/03/11 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
PHP6新特性分析
2016/03/03 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
vue小白入门教程
2018/04/02 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
Python2和Python3的共存和切换使用
2019/04/12 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
机电专业毕业生求职信
2013/10/27 职场文书
小学生评语大全
2014/04/18 职场文书
村容村貌整治方案
2014/05/21 职场文书
2014年国庆节寄语
2014/09/19 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
小学总务工作总结
2015/08/13 职场文书