エクセルマクロでライフゲーム
コンピュータの黎明期から存在するライフゲームをエクセル上で動かしてみました。
作り方とVisualBasicのソースコードを掲載しています。
ライフゲームとは
名前はゲームとありますが、ゲームというよりシミュレーションみたいなもの。超有名なので、検索すればいろいろ出てきます。
格子状に並べたマス目に生と死の状態を付け、対象マスの周りのマスの生死状態の数により対象マスの生死を決めてゆきます。
対象マスが生きている場合、
周りの生きているマスの合計が2か3であれば、生き続けることができる。それ以外は死へ変更。
対象マスが死んでいる場合、
周りの生きているマスの合計が3であれば生に変更。それ以外は死んだまま。
という単純なルールをすべてのマスについて計算を繰り返すことで、興味深い複雑なパターンが現れます。(黒いセルが生きています)
エクセルでライフゲーム
ライフゲームで使う格子構造は、ちょうどエクセルで使うセルと同じ構造です。
ですので、エクセルのマクロ(VisualBasic)を使えば簡単にライフゲームを作ることができます(上の動画)。
マクロのソースコードは下をご覧ください。お手持ちのエクセルにコピペして使います。
コピペしたら、シート2枚をそれぞれ1と2とい名前に変更してから実行してください。
ライフゲームのルールを変更してみる
複雑なパターン楽天 の生まれるライフゲーム、セルの生死ルールがカギを握っています。
これは生物を模して、「過密でも過疎でも個体が生きてゆけない」というルールですが、ではルーツをちょっと変えたらどうなるでしょうか?
○生まれる条件を変える
周囲に3つが生きていれば生まれる条件を2つにしてみましょう。
こんな感じでいつまでも秩序の生まれない状態
4にしたらこんな感じ
多様さは急速に失えわれ、すぐに定常状態へ収束
○生き続ける条件を変える
2~3で生き続けることができますが、これを緩和して1~4にするとどうでしょうか?
これも徐々に多様性が失われて、迷路みたいになってしまいました。
適度に多様性があり、適度に秩序がある状態になると面白い複雑なパターンが生まれるようですね。
この宇宙もライフゲームと同じようにセル・オートマトンではないかという考え方があるそうです。
もし引力がもう少し強かったら、太陽くらいの大きさでもブラックホールとかしてしまい、宇宙は人やその他複雑なものを宿すものにはならなかったといわれています。
逆にもう少し弱ければ、同じ引力でも地球は大きなサイズになれるし、太陽の寿命も延びてもっと複雑な構造になれたでしょう。
これってライフゲームのルールにちょっと似ていますね。
ライフゲームのソースコード
Sub Macro1()
'
' Macro1 Macro
'
x = 30
y = 30
'初期化
For ix = 2 To x - 1
For iy = 2 To y - 1
'Sheets("1").Cells(ix, iy).Select
Sheets("1").Cells(ix, iy).Value = Int(Rnd(5) * 2)
If Sheets("1").Cells(ix, iy).Value = 0 Then Sheets("1").Cells(ix, iy).Value = ""
Next iy
Next ix
For i = 0 To 30
For ix = 2 To x - 1
For iy = 2 To y - 1
xx = Sheets("1").Cells(ix - 1, iy - 1).Value + Sheets("1").Cells(ix - 1, iy).Value + Sheets("1").Cells(ix - 1, iy + 1).Value
xx = xx + Sheets("1").Cells(ix, iy - 1).Value + Sheets("1").Cells(ix, iy + 1).Value
xx = xx + Sheets("1").Cells(ix + 1, iy - 1).Value + Sheets("1").Cells(ix + 1, iy).Value + Sheets("1").Cells(ix + 1, iy + 1).Value
Sheets("2").Cells(ix, iy).Value = ""
Sheets("2").Cells(ix, iy).Interior.Color = RGB(255, 255, 255)
If Sheets("1").Cells(ix, iy).Value = "" Then
If xx = 3 Then
Sheets("2").Cells(ix, iy).Value = 1
Sheets("2").Cells(ix, iy).Interior.Color = RGB(0, 0, 0)
End If
End If
If Sheets("1").Cells(ix, iy).Value = 1 Then
If xx >= 2 Then
If xx <= 3 Then
Sheets("2").Cells(ix, iy).Value = 1
Sheets("2").Cells(ix, iy).Interior.Color = RGB(0, 0, 0)
End If
End If
End If
Next iy
Next ix
For ix = 2 To x - 1
For iy = 2 To y - 1
'Sheets("1").Cells(ix, iy).Select
Sheets("1").Cells(ix, iy).Value = Sheets("2").Cells(ix, iy).Value
Next iy
Next ix
Next i
End Sub
最終更新日: 2018-08-16 09:10:45