Scratchで迷路を作ろう!一番簡単な「棒倒し法」の仕組み

教育

前回記事では、迷路の自動生成の様々なアルゴリズムを紹介しました。

「棒倒し法」を使って迷路を自動生成するプログラムを、Scratchで作っていきたいと思います。
今回は、Scratchでのプログラミングの前に、迷路の作り方の手順を確認していきます。

迷路ができるまでの3ステップ

キャンバス(2次元配列)を用意する

まずは、迷路全体を構成する「2次元配列(マス目)」を作ります。 この時、全体の幅(縦と横のマス数)は「5以上の奇数」にします。そして、一番外側のマス(外周)をすべて「壁(■)」にし、内側を「通路(□)」にしておきます。

(例:幅7、高さ7の配列の場合)

■■■■■■■← 外周は壁
■□□□□□■← 内側は一旦
■□□□□□■すべて通路
■□□□□□■
■□□□□□■
■□□□□□■
■■■■■■■

基準となる「棒」を配置する

次に、外周の内側に、基準となる壁(=倒す前の棒)を1マスおきに配置します。

■■■■■■■
■□□□□□■
■□□■←柱
■□□□□□■
■□□■←柱
■□□□□□■
■■■■■■■

棒を倒して壁を作っていく

ここからが迷路づくりの本番です!
立てた内側の棒を順番に見ていき、「上下左右」のいずれかランダムな方向にパタンと倒して、新しい壁を作ります。

ただし、適当に倒すと道が塞がってしまうため、2つの重要なルールを守る必要があります。

⚠️ 重要なルール

1行目以外は「上」に倒してはいけない!

一番上の行にある棒(▲)は、上下左右どこに倒してもOKです。しかし、2行目以降の棒(◆)は「下・左・右」の3方向のどれかにしか倒せません。

すでに壁がある方向には倒してはいけない!

倒そうとした方向にすでに別の棒が倒れていて「壁」になっていた場合、重ねて倒すことはできません。別の方向を選び直します。

図解で見る「倒し方」の具体例

実際にルールを守って棒を倒していく流れを見てみましょう。

1行目の棒を倒す

1行目の棒(▲)は「上」に倒してもOKです。 左上の棒は「上」、右上の棒は「左」にランダムに倒したとします。

■■■■■■■
■□□□□■←上に倒れた
■□▲▲□■←左に倒れた
■□□□□□■
■□◆□◆□■
■□□□□□■
■■■■■■■
2行目以降の棒を倒す

2行目の棒(◆)です。
ルールにより「上」には倒せません。
左下の棒は「右」に倒してみましょう。

■■■■■■■
■□●□□□■
■□▲●▲□■
■□□□□□■
■□◆◆□■←右に倒れた
■□□□□□■
■■■■■■■
重なりを防ぐ(ルールの適用)

最後に残った右下の棒です。
「上」には倒せません。
また、すぐ左のマスには先ほど倒した壁がすでにあるため、「左」にも倒せません。
したがって、「下」か「右」のどちらかに倒します(今回は下に倒します)。

■■■■■■■
■□●□□□■
■□▲●▲□■
■□□□□□■
■□◆●◆□■
■□□□□■←下に倒れた
■■■■■■■

すべての棒を倒し終わったら、迷路の完成です!

ルール「上に倒すのは1行目だけ」を無視すると・・・

もし、このルールを無視してすべての棒を上下左右ランダムに倒してしまうと、迷路の中に「絶対にたどり着けない謎の小部屋」ができてしまうことがあります。

どういうことか、図解で見てみましょう!

失敗のシミュレーション

内側に4本の棒(柱)が立っている状態からスタートします。

■■■■■■■
■□□□□□■
■□□■←柱
■□□□□□■
■□□■←柱
■□□□□□■
■■■■■■■

1行目の棒を倒す(ここはルール通り)

左上の棒を「右」に、右上の棒を「下」に倒したとします。

■■■■■■■
■□□□□□■
■□◆◆□■←右に倒した
■□□□□■←下に倒した
■□◆□◆□■
■□□□□□■
■■■■■■■

2行目の棒を倒す(右下を左に倒す)

右下の棒を左に倒します。ここまではルール通りです。

■■■■■■■
■□□□□□■
■□◆●◆□■
■□□□●□■
■□◆◆□■←左に倒す
■□□□□□■
■■■■■■■ 

ルールを無視してみる(左下を「上」に倒す)

ルールを無視して、左下の棒を「上」に倒してしまいます。
すると、どうなるでしょうか…?

■■■■■■■
■□□□□□■
■□◆●◆□■
■□×●□■←上に倒す
■□◆●◆□■
■□□□□□■
■■■■■■■

図の真ん中にある「×」のマスに注目してください。

四方をぐるっと壁に囲まれてしまい、外から絶対に中に入れない、完全に閉じ込められた孤立空間ができてしまいました!
ついでに言うと、道の部分もぐるっと一周できるループ状になってしまい、迷路とは言えない形になってしまっています。

迷路づくりの世界では、すべての道がどこかで繋がっていて「無駄な空間がない」状態を「完全な迷路(パーフェクト・メイズ)」と呼ぶそうです。

2行目以降の棒が「上」に倒れると、1行目の棒が作った壁と手をつなぐ形になってしまい、このような「輪っか(ループ)」や「孤立した部屋」が発生しやすくなります。

だからこそ、「上に倒していいのは1行目(一番上の行)だけ! 2行目以降は下か左か右!」というルールを守ることで、道が途切れたり閉じ込められたりしない、美しい完全な迷路を作ることができるのです。

おわりに

迷路の自動生成の仕組みが今回分かったので、次回はいよいよ、Scratchでプログラミングに落とし込んでいきたいと思います!

ゲームや仕組みをプログラミングするとき、いきなりブロックを積み上げるより、「どのように組み立てていくか」をしっかり設計してから進めると、プログラミングがスムーズに進みます。

これから何か作ろう!と思ったとき、「何を作るか」「どんな仕組みにするか」「ゴールはどこか」を決めて進めてみましょう!きっともっと楽しくものづくりができると思います!

タイトルとURLをコピーしました