Scratchで迷路を作ろう!「棒倒し法」で9*9マスの迷路自動生成

Scratch

前回記事では、棒倒し法の仕組みについて解説しました。
今回はいよいよ、Scratchで迷路の自動生成をしていきます!

本当は迷路の大きさや、迷路を構成するブロックの大きさを自由に設定できるプログラムを作りたいのですが、最初から大きさを自由に変えられる複雑なプログラムに挑戦すると頭が混乱してしまうので、今回は基本を学ぶために「9×9マス」の大きさ限定のシンプルな迷路を作っていきましょう!

完成したプログラムを実行した様子。

棒倒し法(ぼうたおしほう)のルールって?

まずは、棒倒し法のおさらいです。
「棒倒し法」は、その名の通り「等間隔に立てた柱(棒)を、パタンと倒して壁にする」ことで迷路を作るルールです。

  1. 外周を作る: 迷路の一番外側をグルッと壁で囲みます。
  2. 柱を立てる: 1マスおきに、等間隔に「柱」を立てます。
  3. 柱を倒す: 立てた柱を「上・右・下・左」のどれかにランダムにパタンと倒します。倒れた場所が、新しい壁になります。
  4. 【重要】2段目からのルール: すべての柱を上下左右に倒してしまうと、道が完全に塞がってしまうことがあります。それを防ぐため、2段目以降の柱は「上」には倒さない(右・下・左の3方向だけにする)というルールを追加します。

「2段目のルールを無視するとどうなるか」については、下の記事を見てください。

プログラムの設計図:81個のリストで迷路を管理しよう

では、Scratchで迷路を作っていきましょう!
とはいっても、画面にいきなりブロックの絵を描き始めるのは少し待ってください。

プログラミングで迷路を作るときは、まずコンピュータの頭の中(裏側)で「迷路の設計図」を作るのが成功のコツです。

まずはじめに、計算や処理をするスプライトを作りましょう。このスプライトは、表示されませんが、中でデータ生成する重要な役割を担ってもらいます。(スプライト名は「迷路データ」にしました)

私はデータ生成やシステムを動かすスプライトに、
Scratchのデフォルト画像である”Laptop”をよく使います。

プログラムを見やすくするため、定義ブロックを作り、その中にプログラムを作っていきます。迷路データ生成は、「外壁と柱」「柱を倒す処理」の二つで構成されるので、「迷路データ生成01_外壁と壁」「迷路データ生成02_柱を倒す」という二つの定義ブロックを用意します。

今回は縦9マス×横9マスなので、合計 81マス 分のデータが必要です。

Scratchの「リスト」を1つ用意して(名前は 迷路データ とします。)、1番目から81番目までの数字でマスの状態を記録していきます。

変数やリストは、プログラムをスタートさせるたびに「まっさらな状態」で始めたいので、プログラムの初めには「リストのすべてを削除する」を入れてから、リストを作っていきます。

ちなみに今回、リストには0~4の数字が入っていきます。数字にはそれぞれ役割があります。詳しい説明はおいおいしていきますが、まずは数字の意味と役割をお知らせしておきます。

リストの数字意味実際の役割
0通路何もない空間(歩ける場所)
1外壁迷路の一番外側の枠
2柱(1列目)上・右・下・左に倒せる柱
3柱(2列目以降)右・下・左にしか倒せない柱
4倒れた柱柱が倒れて新しくできた壁

この数字のリストを完成させてから、最後に画面に迷路を描いていきます。

ステップ1:初期設定と土台作り

まずは旗が押されたときの準備と、迷路の土台作りです。

リストの中身を一度すべて「0(通路)」にする

迷路の外側の数字を「1(外壁)」に書き換える

81個のデータは、下の表の位置に対応しています。

この表の外側の部分をすべて壁にしたいので、リストの対応する番号の数字を1に置き換えます。

リストの番号との対応表

対応する部分の数字を”1″にする

リストの1~9番目、73~81番目の数字を”1″に置き換える

繰り返し(9回)と変数「カウンタ」を使って変更していきます。

左右の列の番号の中身も”1″に置き換える

緑の部分、なぜこのような式になるか、分かりますか?

1マスおきに柱を立てます。

1番上の柱と、2番目以降の柱では、「柱の倒し方」に違いがあるので、下のように数字を置き換えます。

  • 一番上の柱→”2″
  • 2番目以降の柱→”3″
リストの番号との対応表

対応する部分の数字を”2″または”3″にする

1番上の柱

1番上の柱ができるのは、表の3行目です。そして、3・5・7列目に置かれるので、繰り返しを使って置き換えをします。

2番目以降の柱

2番目の柱の列は表の5行目にできます。そして、3・5・7列目に置かれるのは一列目と同じです。

この時点で、リストの中には「外枠」と「等間隔に並んだ柱」が準備完了です!

ステップ2:【ここが肝!】柱をランダムに倒す

いよいよ迷路のルートを決める「柱を倒す」処理です。

変数「カウンタ」をここでも使います。また、変数「倒す方向」を新たに作りましょう。どちらもカウンタを0にしましょう。
さらに、リスト「倒す方向」を用意します。初期設定のため、「リスト内のすべてを削除する」ブロックを使います。

リストの1番目から81番目まで順番に確認していき、「2」か「3」の柱を見つけたら処理を行います。

“2”(1列目の柱の処理)

自分のマスの「上・右・下・左」のマスが「0(通路)」かどうかを確認します。通路だった場合、リスト「倒す方向」に数字を追加します。

倒す方向の候補がそろったら、その中から乱数(ランダムな数)で1つ方向を選び、そのマスの数字を「4(倒れた柱)」に書き換えます。

えらんだ数字を変数「倒す方向」に入れ、
その数字によって柱をどちらに倒すかを決めている。

処理が終わったら、リスト「倒す方向」の全てを削除して、次の処理に備えます。

“3”(2列目以降の柱の処理)

自分のマスの「右・下・左」の3方向だけを確認します。上には倒さないように「もし」ブロックを組むのがポイントです!

上に倒さないので、「上」のブロックがなくなっている。

倒す方向の候補がリストアップできたら、あとは1列目の処理と一緒です。「上」はないので、少し短くなります。

このように順番に柱を倒していくことで、裏側の設計図(81個のリスト)が完成します。

ステップ3:クローンで画面に描画する

裏側で設計図が完璧に完成したら、いよいよ画面に表示します!

ブロックのスプライトを作成

コスチュームで30×30pxの正方形を作ってください。自分が作ったコスチュームの大きさは、画面左側のコスチュームリストの、名前の下に「◯×◯」と表示されています。

クローンで壁を作っていくので、初期設定で本体は隠します。また、クロンをスタートさせる位置に移動させておきます。

迷路データの読み込み

壁ブロックのクローンは、迷路データができてから実行するので、メッセージで「データ生成完了」を知らせてもらいましょう。

スプライト「データ生成」内

もし数字が 0 (通路)ではない場合(つまり1〜4の壁や柱のとき)、その場所にブロックのクローンを作ります

X座標を右にズラしていき、「9回」右に進んだら端っこなので、Y座標を1段下げてX座標を左端に戻す……という動きを繰り返します。

クローンは表示するだけでOKです。

これで、一気に迷路が画面に浮かび上がります!

次回予告!

これで、9×9の自動生成迷路の完成です!

リストを使って裏側でデータを管理する考え方は、本格的なゲーム作りに欠かせないテクニックです。

でも、ここで一つ疑問が湧きませんか?

「もっと巨大な迷路にしたい!」
「9×9じゃなくて、23×17みたいに大きさを自由に変えたい!」

実は、今回の作り方は、わかりやすく解説するために、ブロックの重複をあえてそのままにしてあるところがあります。迷路のサイズを自由に変えられるプログラムを作るために、今回のプログラムをそのまま転用すると、プログラムがとんでもなく長くて複雑になってしまいます。

そこで次回の記事では、プロのプログラマーも使う「コードを劇的に短くスッキリさせる裏技」を使って、どんな大きさの迷路でも作れる万能なプログラムに進化させる方法を解説します!

小学校高学年〜中学校の算数数学の学びにもなりますよ!

次回もぜひチャレンジしてみてくださいね!

今回のコード

今回のコードは、下記URLでご確認いただけます。

https://scratch.mit.edu/projects/1365793060
タイトルとURLをコピーしました