元胞自动机是很常用的传播/交通模型,因此写下这篇文章,以后忘了可以再翻看

元胞自动机元胞自动机又被称为康威生命游戏,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。它最初于1970年10月在《科学美国人》杂志上马丁·葛登能的“数学游戏”专栏出现

元胞自动机是一个零玩家游戏。他包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一时刻的生死取决于相邻八个方格中或者的或死了的细胞数量

规则

每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动:细胞过少:当周围低于2个(不包含2个)存活细胞时,本单元活细胞死亡

稳定:当周围有2个或3个存活细胞时,本单元细胞保持原样

人口过剩:当周围有3个以上的存活细胞时,本单元活细胞死亡

繁殖:当周围有3个存活细胞时,本单元细胞存活/活化

初看觉得这就是个模拟细胞繁衍的东西,规则也很简单。

随着游戏的进行,杂乱无序的细胞会逐渐演化出各种精致、有形的结构,这些结构往往有很好的对称性,而且每一代都在变化形状,一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的"入侵"而被破坏。但是形状和秩序经常能从杂乱中产生出来。对于生成的形状和秩序,我们称作pattern(模式)

开发准备

首先安装pygamepip install pygame

开发步骤

我们使用矩阵来记录我们的游戏世界,其中0表示细胞死亡,1表示细胞存活

感谢The Game of Life in Python这篇博文,一行代码解决了计算细胞周围活细胞数量的问题nbrs_count = sum(np.roll(np.roll(X, i, 0), j, 1)

for i in (-1, 0, 1) for j in (-1, 0, 1)

if (i != 0 or j != 0))

由于我们的游戏世界是上下左右循环的,所以将矩阵往8个方向进行循环移位得到8个新矩阵,将8个新矩阵相加就能得到每个细胞周围的活细胞数量矩阵了

np.roll操作就是循环移位操作。np.roll(X, i, 0)中的X代表输入矩阵,i代表以为的大小,0代表移位的维度,np.roll(X, 1, 0)代表矩阵下移一格,np.roll(X, 1, 2)代表右移一格,if (i != 0 or j != 0)是为了不计算死亡的细胞

通过活细胞数量矩阵根据更新规则更新我们的世界。因为矩阵单位只有两种状态,这里我们只考虑存货态就可以了。注意到存活的条件是:稳定:当周围有2个或3个存活细胞时,本单元细胞保持原样

繁殖:当周围有3个存活细胞时,本单元细胞存活/活化

即细胞周围数量等于3或者本单元细胞存活的同时周围有2个存活细胞时候,本单元细胞将在下一代存活

翻译过来就是(nbrs_count == 3) | (X & (nbrs_count == 2))

注意到这种方法虽然便捷,但效率显然不怎么样。因为这种做法更新了矩阵的每一个单元,这完全没有必要,大部分情况下矩阵都是稀疏的,如何改进希望读者自己尝试

我们实现生命游戏的操作如下:R键:重置世界

回车键:进行演化

空格键:暂停演化

鼠标左键:增添一个细胞

鼠标右键:销毁一个细胞

下面是用pygame实现的全部代码# -*- coding: utf-8 -*-

import pygame, sys, time

import numpy as np

from pygame.locals import *

# Matrix width and matrix height

WIDTH = 80

HEIGHT = 40

# A global variable that records mouse button conditions

pygame.button_down = False

# A matrix that records the game world

pygame.world=np.zeros((HEIGHT,WIDTH))

# Create a Cell class to facilitate Cell drawing

class Cell(pygame.sprite.Sprite):

size = 10

def __init__(self, position):

pygame.sprite.Sprite.__init__(self)

self.image = pygame.Surface([self.size, self.size])

# Fill in the white

self.image.fill((255,255,255))

# Creates a rectangle with the upper-left corner as the anchor point

self.rect = self.image.get_rect()

self.rect.topleft = position

# Drawing function

def draw():

screen.fill((0,0,0))

for sp_col in range(pygame.world.shape[1]):

for sp_row in range(pygame.world.shape[0]):

if pygame.world[sp_row][sp_col]:

new_cell = Cell((sp_col * Cell.size,sp_row * Cell.size))

screen.blit(new_cell.image,new_cell.rect)

# Update the map according to cell update rules

def next_generation():

nbrs_count = sum(np.roll(np.roll(pygame.world, i, 0), j, 1)

for i in (-1, 0, 1) for j in (-1, 0, 1)

if (i != 0 or j != 0))

pygame.world = (nbrs_count == 3) | ((pygame.world == 1) & (nbrs_count == 2)).astype('int')

# init Map

def init():

pygame.world.fill(0)

draw()

return 'Stop'

# Stop operation

def stop():

for event in pygame.event.get():

if event.type == QUIT:

pygame.quit()

sys.exit()

if event.type == KEYDOWN and event.key == K_RETURN:

return 'Move'

if event.type == KEYDOWN and event.key == K_r:

return 'Reset'

if event.type == MOUSEBUTTONDOWN:

pygame.button_down = True

pygame.button_type = event.button

if event.type == MOUSEBUTTONUP:

pygame.button_down = False

if pygame.button_down:

mouse_x, mouse_y = pygame.mouse.get_pos()

sp_col = int(mouse_x / Cell.size);

sp_row = int(mouse_y / Cell.size);

if pygame.button_type == 1: # The left mouse button

pygame.world[sp_row][sp_col] = 1

elif pygame.button_type == 3: # The right mouse button

pygame.world[sp_row][sp_col] = 0

draw()

return 'Stop'

# Timer, control frame rate

pygame.clock_start = 0

# Evolution operations

def move():

for event in pygame.event.get():

if event.type == QUIT:

pygame.quit()

sys.exit()

if event.type == KEYDOWN and event.key == K_SPACE:

return 'Stop'

if event.type == KEYDOWN and event.key == K_r:

return 'Reset'

if event.type == MOUSEBUTTONDOWN:

pygame.button_down = True

pygame.button_type = event.button

if event.type == MOUSEBUTTONUP:

pygame.button_down = False

if pygame.button_down:

mouse_x, mouse_y = pygame.mouse.get_pos()

sp_col = mouse_x / Cell.size;

sp_row = mouse_y / Cell.size;

if pygame.button_type == 1:

pygame.world[sp_row][sp_col] = 1

elif pygame.button_type == 3:

pygame.world[sp_row][sp_col] = 0

draw()

if time.clock() - pygame.clock_start > 0.02:

next_generation()

draw()

pygame.clock_start = time.clock()

return 'Move'

if __name__ == '__main__':

# init, stop, move

state_actions = {

'Reset': init,

'Stop': stop,

'Move': move

}

state = 'Reset'

pygame.init()

pygame.display.set_caption('Conway\'s Game of Life')

screen = pygame.display.set_mode((WIDTH * Cell.size, HEIGHT * Cell.size))

while True:

state = state_actions[state]()

pygame.display.update()

元胞自动机python代码_Python实现元胞自动机(康威生命游戏)相关推荐

  1. 投掷骰子的python代码_Python基础篇——模拟掷骰子小游戏

    写在前面 ↓ 骰子是我们经常能看到的小玩意儿,今天我们来做一个模拟掷骰子过程的文字版小游戏,送给幻想编程岛新接触Python的初学者们~ 注:本教程基于64位windows系统(鼠标右键点击桌面&qu ...

  2. Python | 实现简单的康威生命游戏

    康威生命游戏是由英国教授John Horton Conway提出的一种生命仿真游戏.其具体的形式是,所有的细胞生活在一个二维平面上,一个细胞在下一个时刻的生存状态取决于当前时刻周围的各个细胞的生存状态 ...

  3. 康威生命游戏java_Java Python 康威生命游戏 - 命令行版

    Java & Python 康威生命游戏 - 命令行版(2020年7月23日) 制作背景 高二的时候看霍金的<大设计>最后几页的时候看到里面提到了康威生命游戏,介绍了它的规则,感觉 ...

  4. Python - 康威生命游戏Conway's game of life

    使用python实现康威生命游戏Conway's game of life 参考<python极客项目编程> 游戏规则: 任何四周邻居存活数少于两个的存活网格将死亡,因为人口稀少. 任何四 ...

  5. postman生成python代码_python代码直接生成可执行exe文件

    前言: python中有一个很厉害的库可以直接将写好的python代码打包成可执行的.exe文件,生成好的文件不需要python运行环境和pycharm等IDE就可以直接双击运行,是不是很厉害呢!这样 ...

  6. 初学者怎样看懂python代码_Python 初学者,如何快速的入门

    随着疫情的到来,不少人开启了退休之前最长的一次度假,唯一不同的是,这次的度假是在家里完成的.同时还面临着低薪,高额的房租房贷卡贷等. 所以就有了油然而生的想法,何不在这唯一一次长时间的假期来学习一项技 ...

  7. word转换pdf的python代码_python word转pdf代码实例

    原理 使用python win32 库 调用word底层vba,将word转成pdf 安装pywin32 pip install pywin32 python代码 from win32com.clie ...

  8. 一段有趣的python代码_Python 五个有趣的彩蛋,你都知道吗?

    阅读文本大概需要 6.6 分钟. 当一门编程语言是开源的时候,往往会有产生一些搞笑和有趣的东西.通常,这意味着社区的贡献者会为该语言添加一些有趣和特别的彩蛋以及隐藏的特性(当然前提是不会增加在生产环境 ...

  9. 海绵宝宝python代码_Python那些事——python还能这么玩?帅呆了

    当我们还是孩子的时候,总是迷恋漫画书,当翻到我们的英雄们开始行动时会激动不已. 大家总是争论谁是最厉害的超级英雄,认真地讨论他们的家族历史,或者梦想自己拯救高谭市.我们很多人用自己的童年创造了这样的难 ...

  10. 如何集成Python代码和GUI来创建一个简单的游戏?

    您不需要集成任何内容.您可以使用pygame屏幕作为GUI. 公平警告:它没有内置功能,如按钮或弹出窗口.每次都需要硬编码. 通过集成,如果你的意思是python代码的结果应该显示在屏幕上,那么这将发 ...

最新文章

  1. 公司新来的同事一顿操作把大家整懵了,问了他的经历细思极恐。。。
  2. SCO UNIXWARE 文件系统损坏,后恢复数据成功
  3. Tomcat源码解析一:下载源码与导入eclipse
  4. 计算机巧用剪纸做画册教案,大班绘画剪纸制作的教案总结
  5. 贾又福大象鸿蒙,奏乐!继续吹!库里又创记录,射进MVP榜单,众多名记变“库吹“...
  6. 2021年中国人力资源服务行业研究报告
  7. 2017《面向对象程序设计》课程作业七
  8. REX-Ray 了解
  9. 系统学习机器学习之模型选择
  10. Audiolatry RetroVibes for Mac - 虚拟乐器插件
  11. 风云2号卫星云图_风云四号A星搭载多通道扫描成像辐射计(AGRI)和大气垂直探测仪(GIIRS)可对台风进行加密观测...
  12. 绘制地形图(测量篇2——实测数据导入CAD)-龙啸
  13. 通过 api 调用检查具体日期是否为法定节假日
  14. calipso是什么意思_library是什么意思_library的翻译_音标_读音_用法_例句_爱词霸在线词典...
  15. Mr. Panda and Fantastic Beasts(EC2016 后缀数组)
  16. OTU/ASV/Feature tabel 表格 过滤 相对丰度 微生物
  17. 游戏合作伙伴专题:BreederDAO 与 Air Ballerz 达成合作
  18. 【计算机网络-1】为什么学习计算机网络
  19. CS 入门技能树测评
  20. 深度学习是什么?深度学习和神经网络的区别是什么

热门文章

  1. 新版Idea设置代码提示背景色
  2. ubuntu16.04下微信和TIM的安装
  3. 论文精读:车尧-《社会网络视角下战略性新兴产业的专利情报研究》
  4. 声音均衡器怎么调好听_调音师必备:如何调出最佳人声?
  5. 地理空间数据下载 积累
  6. linux迅雷下载命令,命令行也强大之下载迅雷资源的方法
  7. 使用iText处理pdf文件的入门级教程
  8. MATLAB显示图像变白问题
  9. swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程
  10. 【Nginx系列】- Nginx源码复杂安装