python实现元胞自动机

python实现元胞自动机,第1张

        这是刚学习写代码时完成的,因此很多地方编写的可能不太美观,但运行起来没有问题,先发出来,之后有精力了在修改美化。

该元胞自动机的功能:

1.初始化按一定概率在各个位置生成元胞。

2.迭代,每次迭代元胞八个方向若没有一个以上存活的元胞数量,则该元胞死亡;若一个空格子周围有三个及三个以上元胞存活,则该空格子出长出新元胞。

3.不断迭代,直到所有元胞存活状态不再改变(或所有元胞全部死亡)。

放几张运行时截图

 

 

 代码如下:

import os
from random import random
import numpy as np
import copy

#系统指定生命空间的大小,也即:6行;6列
width=6
hight=6

###辅助函数1 初始化生命空间
def init(life_prob):
    #(life_prob=0.2):
    life=[]
    for i in range(hight):
        life.append([])
        for j in range(width):
            
            if random()<=life_prob:
                life[i].append('*')
            else:
                life[i].append(" ")
    
        
    return np.array(life)
   
    
        
    """
    初始化游戏,以life_prob的概率生成活细胞
    输入:life_prob——生成活细胞的概率
    输出:width x height大小的细胞状态
    """   
    
        
    
###辅助函数2 打印细胞状态
def print_screen(screen):
    """ 
    screen 参数类型与init()函数返回值类型一致,表示当前
    细胞状态。由于屏幕打印时行距比字符宽度大很多,所以请在打印
    每个字符后面加空格,并在最后一个字符的后面打印'|'表示生命
    空间的边界(注意:表示生命空间边界的符号可以换成你们喜欢的符号,不局限
    于'|')
    """
    
    for i in screen:
        for j in i:
            print(j,end="   ")
        print('|\n')

###辅助函数3 计算相邻细胞中活细胞的数目
def get_near_by_cells_count(screen, i, j):
    """
    get_near_by_cells_count()的形参有:screen, i,j;
    其中screen与init()函数的返回值类型一致,表示当前细胞的状态;
    i和j均为int类型,表示生命空间各细胞,也即:n*n空间内的格子,所在的行号和列号
    函数返回值为int类型,表示位置(i,j)的细胞其相邻活细胞的数量
    """
    survival_numbers=[]
    '''四个角落'''
    if i==1 and j==1:
        if screen[0][1]=='*':
            survival_numbers.append(screen[0][1])
        if screen[1][1]=='*':
            survival_numbers.append(screen[1][1])
        if screen[1][0]=='*':
            survival_numbers.append(screen[1][0])
        nums=len(survival_numbers)
    elif i==1 and j==width:
        if screen[0][width-2]=='*':
            survival_numbers.append(screen[0][width-2])
        if screen[1][width-1]=='*':
            survival_numbers.append(screen[1][width-1])
        if screen[1][width-2]=='*':
            survival_numbers.append(screen[1][width-2])
        nums=len(survival_numbers)
    elif i==hight and j==1:
        if screen[i-1][1]=='*':
            survival_numbers.append(screen[i-1][1])
        if screen[i-2][0]=='*':
            survival_numbers.append(screen[i-2][0])
        if screen[i-2][1]=='*':
            survival_numbers.append(screen[i-2][1])
        nums=len(survival_numbers)
    elif i==hight and j==width:
        if screen[i-1][j-2]=='*':
            survival_numbers.append(screen[i-1][j-2])
        if screen[i-2][j-1]=='*':
            survival_numbers.append(screen[i-2][j-2])
        if screen[i-2][j-2]=='*':
            survival_numbers.append(screen[i-2][j-1])
        nums=len(survival_numbers)
        
# 边框

    elif (i==1 or i==hight) and 1

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/793937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)