仮想通貨100種類以上の特徴を紹介!だけど雑記ブログw

プログラミング講座2-5・ライフゲーム-記憶した配列の中身を計算して、次の世代を書き出す

 

前回の部分まで出来ていれば、今回は意外に簡単かもしれません。各場所は前回書いたプログラムに書きたしていくことになるので、最終行の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か所を表す式を作ってみましょう。

分かり安いように番号を振ったセルを準備しました。式は下のようになります。

ライフゲーム-8か所に番号を振ってみた

  1. memory(y – 1, x – 1)
  2. memory(y – 1, x)
  3. memory(y – 1, x + 1)
  4. memory(y, x – 1)
  5. memory(y, x + 1)
  6. memory(y + 1, x – 1)
  7. memory(y + 1, x)
  8. memory(y + 1, x + 1)

これを全部足したものを先ほど定義したlifeValueに代入しましょう。

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)

次世代の書き出し

では、次の世代を書き出しましょう。ライフゲームのルールを再確認すると、

  • 誕生-「死」のセルに隣接する「生」のセルがちょうど3つあれば、生命が誕生し、次の世代では「生」となる。
  • 生存-「生」のセル隣接する「生」のセルが2つか3つならば、生命は生存し、次の世代でも「生」となる。
  • 過疎-「生」のセルに隣接する「生」のセルが1つ以下ならば、過疎により次の世代では「死」となる。
  • 過密-「生」のセルに隣接する「生」のセルが4つ以上ならば、過密により次の世代では「死」となる。

この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」に振り分けていきましょう。今回のコードをすべてまとめると、下のようになります。

Public Sub nextGeneration()

    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文の書き方について)

分かりやすくするために、文章での条件とプログラムの条件を対応させましたが、IF文はいろんな書き方があります。下の2つのコードはすべて先ほど書いたものと最終的な結果は同じとなります。

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)

Else

    Cells(y, x).Interior.Color = xlNone

End If

If  memory(y, x) = 0 Then

    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

前へ ・ 目次へ ・ 次へ

SNSでフォローする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です