ライフゲーム - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0
ライフゲームの基本ルール
誕生 周囲に生存セルがちょうど3つあれば誕生
生存 周囲に生存セルが2個か3個あれば生き残る
消滅 上記以外の場合消滅
セルを使うなんてエクセルにピッタリじゃん
ってことで紙ってるエクセル方眼紙とVBAで試してみた
エクセル方眼紙は神エクセルじゃなくて糸氏エクセルだからセーフ
自分の周り8個のセルを調べて、生存セルの個数を数える
周りのセルの座標は自分から-1から1ズレたところにあるから
Offset関数を使う
塗りつぶし黒はColorIndexが1
なので
基準になる自分のセルを渡すと周りのセルで黒のセルの個数を返す関数
'周りの8セルを探査、黒のセルの個数を返す
Function SearchCell(r As Range) As Long
Dim c As Long
For y = -1 To 1
For x = -1 To 1
If r.Offset(x, y).Interior.ColorIndex = 1 Then
If Not (x = 0 And y = 0) Then '自身はカウントしない
c = c + 1
End If
End If
Next
Next
SearchCell = c
End Function
下準備として
使うシートは2枚、名前をlifegameA, lifegameBにした
使うセル範囲は20x20で、名前を付けてそれぞれmapA, mapBにした
シートlifegameA
操作したり表示用
シートlifegameBは探索用(判定用)
流れ
- mapAをmapBにコピー
- mapBで目標の周囲のセルを探査
- 結果からmapAのセルを書き換える
- 目標のセルを次のセルにする
- 2番に戻る(最後のセルまで繰り返し)
コード全部
初期配置ボタンを押したところ
全体の3割が黒になる、3割か4割がいい感じに次世代につながる
8割、9割だと次世代で全滅とかになるw
次世代へボタンを押すと
こうなる
このとき探索用シートは前世代の状態になっているはずのlifegameBを見ると
前世代の状態で残っている
誕生、生存、消滅の判定部分はムダというか冗長な所あるけど、まあいいや
気になるのが上下左右の辺のセルの処理端だと外側は必ず生存なしのセルだから、なんか違う感じになるので
反対側とループさせたい
今回のエクセルファイル:ライフゲーム.xlsm
https://box.yahoo.co.jp/guest/viewer?sid=box-l-3rjuj7hqmqr7b3al3lvxcim3ku-1001&uniqid=6ad2c7f0-98b9-44d8-98d7-a2649bbcc386&viewtype=detail
つづきは4日後
エクセルVBAでライフゲームその2 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14606097.html
http://blogs.yahoo.co.jp/gogowaten/14606097.html
反対側と繋げてループできた