見出し画像

ライフゲームを作る

こんにちは!ぽたぽたです!
ジャンルを全く固定せずに書くと人気になれないって知ってるけど、本当にごめんなさい!
僕は自分のやりたいことをやりたいんです!
一応言っておくと今日は深夜テンションではないです。
明日が休みなのでかなり理性的です。イマジナリーフレンドもいません。
しかし理性がある時はだんだんと自我が消えていきます。
今回はScratch(実際はTurboWarp)でライフゲームを作っていきます。
ひたすら自分の作ったプログラムがどういう動きをしてるのかを言っていくだけです。つまり超雑説明。
ステージのサイズは480×360固定。変わることはありません。
マスの一辺の大きさは自由に変えられるようにします。
(例えばマスの大きさが10だと48×36で計算することになる。)
端は常に死のマスになるようにします。
まあ最後の4行がわからない人は無視して大丈夫です。

プログラムの大きなスクショ

プログラム全体はこんな感じです

プログラム全体(234ブロック)

一つ一つ⇩

すべてを司る部分

すべてを司る部分(16ブロック)

最初に準備する部分

最初に準備する部分(17ブロック)

シミュレーションする部分

シミュレーションする部分(92ブロック)

描画する部分

描画する部分(62ブロック)

マスを操作する人間が変更する部分

マスを操作する人間が変更する部分(47ブロック)

プログラムの説明

すべてを司る部分

すべてを司る部分(16ブロック)

旗が押されたら準備をし、その後は「プレイヤーがマスを変えるプログラム」と「シミュレーションして描画するプログラム」をスペースキーで切り替えられるようにしています。

最初に準備する部分

最初に準備する部分(17ブロック)

マスの大きさをメモし、それに合わせたマスの横の大きさと縦の大きさを計算した後、実際にマスのデータが入った空のリストを作ります。
このプログラムでは0が死、1が生を表すとして計算します。
その後に描画します。マスは何もない状態なので、グリッドだけが書かれることになります。
ちなみにリストはこのような順番で二次元配列を表しています。

12×9の例。黒色がマスで、青色が壁。

シミュレーションする部分

シミュレーションする部分(92ブロック)

定義ブロック「シミュレーション」では計算をしたあとに計算結果をコピーするようにしています。
計算結果を2つ目のリストに入れてからそれを後にコピーするのは、1つ目のリスト内で計算するたびにリストを置き換えるように計算していくと、ライフゲームの同時にすべてのマスを計算することを再現できなくなるからです。
計算の部分では、壁を除くすべてのマスで周り8マスと自分のマスを含めた計9マスで計算しています。
自分のマスが死の場合は、周り8マスの合計が3の場合次の状態は「生」、3以外場合は「死」になります。
自分のマスが生の場合は、周り8マスの合計が2、もしくは3の場合、次の状態は「生」、3以外の場合は「死」になります。
壁を除くすべてのマスの次の状態を計算した結果はリスト「マス2」に入れられ、コピーする部分で整理されます。(計算するたびにマス2のリストは全部消しています。)
コピーの部分では、リスト「マス」をすべて削除してから、リスト「マス2」を壁を含んだものに整理して、リスト「マス」に写しています。

描画する部分

描画する部分(62ブロック)

定義ブロック「描画」では全部消した後、グリッドを書き、マスを書きます。
グリッドはマスの境界線を灰色の直線で書きます。
マスを描画する部分では、マスの場所に移動し、もしそのマスが生の場合、黒色で直径がマスの一辺の大きさの円を書きます。

マスを操作する人間が変更する部分

マスを操作する人間が変更する部分(47ブロック)

マウスが押されたら、マウスが押された状態ではなくなるまでマウスがある場所のマスの状態を最初にマウスが押された時にマウスがあった場所のマスの生死を反転させたものにします。
定義ブロック「マウスの場所」は、マウスのマス上の場所を計算します。

実際に動かした動画がこちらです⇩

Scratchでも共有してるので見てみてください。
https://scratch.mit.edu/projects/985705953/

追記
朝起きてnoteを読み返してみました。
それで気づいたんですけど、マウスの場所求めるプログラムミスりまくってます。
直すのめんどくさいので自分で作る時は修正しといてください。
これが正しいです⇩

この記事が気に入ったらサポートをしてみませんか?