前回の部分まで出来ていれば、今回は意外に簡単かもしれません。各場所は前回書いたプログラムに書きたしていくことになるので、最終行のEnd Subの直前に書きます。そして、すべてのセルを順番に書き出していくために「For~Next」をyとxにそれぞれ使用する前回同様の形となります。また、計算結果を一時的に保管するために整数型の変数を1つ使います。変数名はlifeValueとでもしておきましょうか。ここまで書くと、下の形となります。
Dim lifeValue As Long
For y= 1 to YMAX
For x= 1 to XMAX
‘ここの処理を考えましょう。
Next
Next
End Sub
さて、では中心の処理について考えていきましょう。まずは、ちょっと分かりやすいように次の図を見てください。
エクセルのセルの上で、見た目が左のようになっている場合、前回作ったmemory配列上は右の図のようになっているはずです。真ん中の太枠部分の次の世代は隣接する8か所の値を足した数をもとに決めることとなります。なので、まずは8か所を表す式を作ってみましょう。
分かり安いように番号を振ったセルを準備しました。式は下のようになります。
これを全部足したものを先ほど定義したlifeValueに代入しましょう。
では、次の世代を書き出しましょう。ライフゲームのルールを再確認すると、
この4つでした。IF文でこの4通りを設定しましょう。自分のセルが「生」かつ隣接セルがちょうど3つというような条件を作るには、2つの条件を「And」でつなげばよいです。また、2つまたは3つというような時はOrでつなげばよいです。
memory(y, x) = 0 And lifeValue = 3
memory(y, x) = 1 And (lifeValue = 2 Or lifeValue = 3)
memory(y, x) = 1 And lifeValue <= 1
memory(y, x) = 1 And lifeValue >= 4
そして、それぞれの場合に対して、Cells(y, x).Interior.Colorを「RGB(255, 0, 0)」か「xlNone」に振り分けていきましょう。今回のコードをすべてまとめると、下のようになります。
Dim y As Long
Dim x As Long
Dim memory(YMAX + 1, XMAX + 1) As Long
For y= 1 to YMAX
For x= 1 to XMAX
If Cells(y, x).Interior.Color = RGB(255, 0, 0) Then memory(y, x) = 1
Next
Next
Dim lifeValue As Long
For y= 1 to YMAX
For x= 1 to XMAX
lifeValue = memory(y – 1, x – 1) + memory(y – 1, x) + memory(y – 1, x + 1) + memory(y, x – 1) + memory(y, x + 1) + memory(y + 1, x – 1) + memory(y + 1, x) + memory(y, x + 1)
If memory(y, x) = 0 And lifeValue = 3 Then
Cells(y, x).Interior.Color = RGB(255, 0, 0)
ElseIf memory(y, x) = 1 And (lifeValue = 2 Or lifeValue = 3) Then
Cells(y, x).Interior.Color = RGB(255, 0, 0)
ElseIf memory(y, x) = 1 And lifeValue <= 1 Then
Cells(y, x).Interior.Color = xlNone
ElseIf memory(y, x) = 1 And lifeValue >= 4 Then
Cells(y, x).Interior.Color = xlNone
End If
Next
Next
End Sub
ここまで、出来たらぜひちょっと動かしてみてください。書いたプログラムを実行するにはF5キーを押すだけで実行されます。(または、上の方にビデオのリモコンと同じような再生・一時停止・停止のボタンがあるハズなので、再生を押してもOKです。)プログラムを実行すると、セルの状態が次の世代に移ります。
分かりやすくするために、文章での条件とプログラムの条件を対応させましたが、IF文はいろんな書き方があります。下の2つのコードはすべて先ほど書いたものと最終的な結果は同じとなります。
Cells(y, x).Interior.Color = RGB(255, 0, 0)
ElseIf memory(y, x) = 1 And (lifeValue = 2 Or lifeValue = 3) Then
Cells(y, x).Interior.Color = RGB(255, 0, 0)
Else
Cells(y, x).Interior.Color = xlNone
End If
If lifeValue = 3 Then
Cells(y, x).Interior.Color = RGB(255, 0, 0)
End If
Else
If lifeValue = 2 Or lifeValue = 3 Then
Cells(y, x).Interior.Color = RGB(255, 0, 0)
Else
Cells(y, x).Interior.Color = xlNone
EndIf
End If