はじめに
暇つぶしにライフゲームを普通とは違う方法で実装しました。せっかくなので記事にしました。
実装
実装したコードはたった**18行!!**モジュールはnumpyとopencvを使っています。
lifegame.py
import cv2
import numpy as np
weight = np.array([
[2.0, 2.0, 2.0],
[2.0, 1.0, 2.0],
[2.0, 2.0, 2.0]
], dtype=np.uint8)
_ = cv2.VideoCapture(-1)
size = 256
s = (np.random.rand(size, size) > 0.5).astype(np.uint8)
while True:
s_ = cv2.filter2D(s, -1, kernel=weight)
s = (s_ > 4).astype(np.uint8) * (s_ < 8).astype(np.uint8)
cv2.imshow('LifeGame', 255 * s.reshape(size, size))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
使用したルールは23/3です。以下のような場合に次の状態が1になります
- 対象セルが1かつ周辺2つが1(畳み込みの値は5)
- 対象セルが0かつ周辺3つが1(畳み込みの値は6)
- 対象セルが1かつ周辺3つが1(畳み込みの値は7)
対象セルの値と周辺で活性化しているセルの数に対して畳み込んだ値は一対一で対応してるので、畳み込みの値によって次のセルの状態が決定することになります。
次の活性化セルの条件を書き換えることでルールを簡単に変更できます。
結果
最後に
私が使用しているPCはMacbookAirですが1024×1024でも余裕で動きます。ぜひ遊んでみてください。