python实现元胞自动机
生活随笔
收集整理的這篇文章主要介紹了
python实现元胞自动机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????????這是剛學習寫代碼時完成的,因此很多地方編寫的可能不太美觀,但運行起來沒有問題,先發出來,之后有精力了在修改美化。
該元胞自動機的功能:
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<j<width:if i==1:a=screen[i][j-2:j+1]c=[screen[i-1][j-2],screen[i-1][j]]else:a=screen[i-2][j-2:j+1]c=[screen[i-1][j-2],screen[i-1][j]]c.extend(a)nums=c.count('*')elif 1<i<hight and (j==1 or j==width):if j==1:c=[screen[i][j-1],screen[i-2][j-1],screen[i-2][j],screen[i-1][j],screen[i][j]]else:c=[screen[i][j-1],screen[i-2][j-1],screen[i-2][j-2],screen[i-1][j-2],screen[i][j-2]] # 中間 nums=c.count('*')elif 1<i<hight and 1<j<width:c=[screen[i][j],screen[i][j-1],screen[i][j-2],screen[i-1][j],screen[i-1][j-2],screen[i-2][j],screen[i-2][j-1],screen[i-2][j-2]]nums=c.count('*')return nums###輔助函數4 更新細胞的狀態 def update(screen):"""該函數包含一個參數,screen,其類型與init()函數返回值類型一致,表示當前細胞狀態。該函數根據傳入生命空間screen內細胞的狀態,利用更新原則對細胞狀態進行更新,并返回更新后的細胞狀態,返回值類型與screen類型一致"""new_screen=copy.copy(screen)for i in range(hight):for j in range(width):if get_near_by_cells_count(screen, i+1, j+1)==3:new_screen[i][j]='*'elif get_near_by_cells_count(screen, i+1, j+1)==2:passelse:new_screen[i][j]=' 'return new_screen###輔助函數5,判斷細胞狀態是否沒有變化def is_state_same(screen, new_screen):"""參數screen和new_screen分別表示更新前和更新后的細胞狀態根據判斷更新前后細胞的狀態,如果更新前細胞(i,j)的狀態與更新后細胞(i,j)的狀態一致,則返回True;否則返回False"""for i in range(hight):for j in range(width):if new_screen[i][j]==screen[i][j]:passelse:return Falsereturn True###輔助函數6,循環更新細胞直至細胞生命狀態不變,實現人機互動 def _main(screen, new_screen,cycle_index): while not is_state_same(screen, new_screen):#實現人機互動,如果按q鍵則結束游戲;如果按其他鍵則繼續游戲print('按下任意鍵繼續,q鍵結束')_input_nums=input()print('\n')if _input_nums=='q':return 'game over'#打印每次更新后的細胞狀態for i in new_screen:for j in i:print(j,end=' ')print('|\n')print('細胞更新前后生命狀態不同')print('更新了',cycle_index,'次')#更新細胞screen=update(screen)new_screen=update(screen)#判斷細胞更新前后生命狀態是否相同 若相同游戲結束if is_state_same(screen, new_screen)==True:print('按下任意鍵繼續,q鍵結束')_input_nums=input()print('\n')if _input_nums=='q':return 'game over'for i in new_screen:for j in i:print(j,end=' ')print('|\n')print('細胞更新狀態前后無變化')print('更新了',cycle_index+1,'次')return 'game over'cycle_index=cycle_index+1#####以下為主程序,主要實現游戲實現與人機互動 def start():"""(1)游戲開始后,用戶輸入活細胞的概率:life_prob的值,并調用輔助函數1 實現生命空間內細胞狀態的隨機生成(2)根據輔助函數1生成的細胞狀態,調用輔助函數2,將當前細胞的狀態進行打印(3)實現人機互動,如果按q鍵則結束游戲;如果按其他鍵則繼續游戲(4)提示:如果要繼續游戲,則需要對細胞生命狀態進行更新,也即需要調用輔助函數3;并判斷細胞生命狀態更新前后差異,如果沒有變化則終止游戲"""##以下代碼實現了輸入任意鍵游戲開始功能os.system("cls") # 用于清空窗口之前打印的內容print('==== 元胞自動機 ====')print('按下任意鍵開始游戲...')input()os.system("cls")##請在以下部分實現主程序的上述功能# (1)游戲開始后,用戶輸入活細胞的概率:life_prob的值,并調用輔助函數1 #實現生命空間內細胞狀態的隨機生成life_prob=float(input('請輸入細胞存活概率:'))screen=init(life_prob)#(2)根據輔助函數1生成的細胞狀態,調用輔助函數2,將當前細胞的狀態進行打印print_screen(screen)new_screen=update(screen)cycle_index=1_main(screen, new_screen, cycle_index)###以下為主程序的測試代碼 if __name__ == "__main__":# 以下為start()函數的測試代碼start()總結
以上是生活随笔為你收集整理的python实现元胞自动机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样快速做个 BI 系统
- 下一篇: esrgan_ESRGAN: Enhan