実質1行だけで現世代から次世代へ変換できる。
import numpy as np from scipy.signal import convolve2d class LifeGame: def __init__(self, mat): self.mat = np.asarray(mat, dtype="uint8") # 現世代排列を取り込んで、念のためndarrayにしておく。 self.Rules = np.array([[0,0,0,1,0,0,0,0,0], [0,0,1,1,0,0,0,0,0]], dtype="uint8") # 生死ルール排列を定義しておく。 self.weight = np.array([[1,1,1], [1,0,1], [1,1,1]], dtype="uint8") def update(self): # この1行だけで次世代排列が求まる。 # たとえば現世代排列が0、そのムーア近傍の和が6ならルール排列のインデックス[0,6]を検索して次世代の生死を決定する。 self.mat = self.Rules[self.mat, convolve2d(self.mat, self.weight, mode="same", boundary="wrap")] ######## # test # ######## if __name__ == "__main__": # グライダーで確かめてみる。 glider = np.array([[0,0,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0], [0,1,1,1,0,0,0], [0,0,0,0,0,0,0]], dtype="uint8") life = LifeGame(glider) for i in range(100): print("第%d世代: " % (i)) print(life.mat) life.update()
実行結果: