前回は、「棒倒し法」の基本ルールと、9×9マスの迷路を作るための裏側の仕組み(リスト)について解説しました。
いよいよ、「もっと巨大な迷路を作りたい!」「大きさを自由に変えたい!」というご希望にもこたえるべく、どんな大きさの迷路でも自動で作れる万能プログラムに進化させていきます!
実は、前回のプログラムをそのまま使って迷路を大きくしようとすると、ブロックの数がとんでもなく増えてしまい、修正も大変になってしまいます。
そこで今回は、プロのエンジニアも必ず使う「変数(へんすう)」という技を使って、コードを劇的に短くスッキリさせていきます。
小学校高学年や中学生の算数・数学で習う「座標(ざひょう)」や「割り算のあまり」の考え方も出てくるので、頭の体操にぴったりですよ!
ステップ1:大きさを決める「変数」を作ろう
まずは、迷路の大きさを自由に変えられるように、新たに3つの「変数」を用意します。
- 縦(たて): 迷路の縦のマス目
- 横(よこ): 迷路の横のマス目
- 1マスのピクセル数: 1つのブロックの大きさ

必ず「初期設定」もしましょう!バグが減ります!
変数「カウンタ」「倒す方向」については、
前回ブログを参照してください。
今回は試しに、縦11マス、横13マス、1マスの大きさを30ピクセルに設定してスタートしてみましょう! これなら、合計のマス目は 縦(11)× 横(13)= 143マス になりますね。前回の81個固定から、変数同士の掛け算にするだけで、どんなサイズにも対応できるようになります。

ステップ2:表を見比べて「かくれた法則」を見つけ出す
迷路の大きさを自由に変えるために、プログラムをどう書き換えればいいのでしょうか? いきなりScratchのブロックを組む前に、「データを見比べる」という作業をしてみましょう。
ここでは、前回の「9×9マスの迷路(全部で81マス)」と、今回の「11(縦)×13(横)マスの迷路(全部で143マス)」の裏側のリスト(セル番号)の表を見比べてみます。
9×9マス(横9マス)の表
一番右側の壁になるマスの番号を見てみましょう。

一番上の右端は「9」、その下は「18」「27」…と続いていき、最後は「81」になりますね。
▼ 11×13マス(横13マス)の表
では、横幅が13マスになったらどうなるでしょう?

一番右側の壁の番号は「13」「26」「39」…と続いていき、最後は「143」になっています。
この2つの数字の並びを見て、何か共通するルール(法則)に気づきませんか?


そうです! 9×9の時は「9の段(9の倍数)」になっていて、11×13の時は「13の段(13の倍数)」になっていますね! つまり、一番右側の壁の番号は「横のマス数 × 何段目か(カウンタ)」という計算式で必ず見つけることができるんです。

もし変数を使わないと、9×9の迷路を作るときは「9×カウンタ」、11×13の迷路のときはわざわざプログラムを「13×カウンタ」に書き直さなければなりません。
でも、「横」という変数を作って、そこに好きな数字を入れられるようにしておけば… プログラムを「変数『横』 × カウンタ」というたった一つの式にしておくだけで、コンピュータが勝手に「今は横9マスだから9の段だね」「今回は13マスだから13の段だね」と計算して、正しい場所に壁を作ってくれます。
同じように、
- 一番左側の壁: 「横 × カウンタ + 1」番目

- 一番上の壁:「カウンタ」番目

- 「横 × (縦 - 1) + カウンタ」番目

・・・というように、表をじっくり観察して法則を見つけ出し、具体的な数字を「縦」や「横」という変数に置き換えるだけで、どんなサイズの迷路でも自動で作れる最強の設計図が出来上がります。
「なんだか難しそう」と思うかもしれませんが、これって小学校の算数で習う「変わり方調べ」や、中学校の数学で習う「文字式」と全く同じ考え方なんです。算数や数学の力が、プログラミングで大活躍する瞬間ですね!
ステップ3:「割り算の余り」で柱を立てる場所を見つける
次は、迷路の中に「柱」を立てていくプログラムについて考えてみましょう。
使えそうな法則を探す
柱は、左から右へ「1マスおき(2マスごと)」に規則正しく立てていきますよね。 これをプログラムにする場合、マスの番号(カウンタ)を「2ずつ変える」というブロックを使います。
でも、ここで一つ大きな問題が発生します。 「コンピュータは、どこまで柱を立てればいいか分からない」のです。 放っておくと、右端の壁を突き抜けて、どんどん外側に柱を立てていってしまいます。

コンピュータに「右端の壁にぶつかったらストップしてね」と教えるには、どうすればいいのでしょうか?
ここで、さきほどの「表(リストの番号)」が再び大活躍します!
9×9マスの表で確認
3行目の柱が立つ場所を見てください。

左から順番に「21番」「23番」「25番」に柱が立ちます。次に「+2」をすると「27番」になりますね。表を見てみると、27番は右端の壁です!ここでストップさせたいですね。
11×13マスの表で確認
13マスの場合はどうでしょう?

3行目の柱は「29番」「31番」「33番」「35番」「37番」に立ちます。次に「+2」をすると「39番」になります。表を見てみると、やはり39番は右端の壁です!
さあ、ストップさせたい右端の壁の番号「27」と「39」。 この数字の正体、もう分かりましたね?
先ほど見つけた法則と同じ、「横のマス数(9や13)の倍数」になっています!
算数で習う「余り」が魔法のブロックに!
「倍数」になっているということは、「横のマス数」で割り算をすると、必ず割り切れるということです。
- 9×9マスのとき: 27 ÷ 9 = 3 (余り 0)
- 11×13マスのとき: 39 ÷ 13 = 3 (余り 0)
そうです!小学校の算数で習う「割り算の余り」を使うんです!
Scratchには「◯ を ◯ で割った余り」というブロックがあります。

これを使って、次のようにプログラミングします。
【今のマスの番号(カウンタ)】 を 【横】 で割った余りが 「0」になるまで繰り返す

しているかについては、考えてみて!
たったこれだけで、コンピュータは「あ、今調べているマスの番号が横の数で割り切れたぞ(余りが0になったぞ)!ということは右端の壁にぶつかったから、柱を立てるのはここまでだ!」と自分で判断して、ピッタリ正しい位置でストップしてくれるようになります。
この考え方を利用して、2番目以降の柱を立てるプログラムも作ります。

迷路の横幅が13マスになろうが、101マスになろうが、絶対に右端で止まってくれます。 「割り算の余り(プログラマーは『モジュロ』と呼んだりします)」は、ゲームプログラミングの世界で「画面の端っこを判定する」ためによく使われる、超強力な魔法の計算なんですよ!
ステップ4:上下左右のマスの指定も「変数」におまかせ!
一番の肝である「柱を倒す」処理です。 前回は、上・下・右・左のマスを調べるために、具体的な数字を足したり引いたりしていました。でも、迷路の横幅が変わると、上のマスや下のマスの番号も変わってしまいます。
そこで、ここでも変数「横」を使います。
- 右のマス: 今のマス(カウンタ) + 1
- 左のマス: 今のマス(カウンタ) - 1
- 下のマス: 今のマス(カウンタ) + 横
- 上のマス: 今のマス(カウンタ) - 横

これなら、迷路の幅が13マスでも、23マスでも、コンピュータが勝手に上下左右の場所を計算してくれます。コードが劇的に短くなる魔法のようなテクニックです!
ステップ5:長〜いコードがたった1行に!?
さて、いよいよ迷路の道を切り開く「柱を倒す」処理です。
ここが今回の最大のハイライト。プログラマーの「腕の見せ所」です!
前回の9×9マス専用のプログラムを思い出してみましょう。
柱を倒すとき、こんな風に作っていました。
9×9マス専用の時のプログラム(ビフォー)
- 「1番上の柱」と「2番目以降の柱」で、別々の長いブロックを作っていた。
- 倒せる方向を調べた後、乱数で1〜4の数字を選び、「もし1なら上(-9)を壁にする」「もし2なら右(+1)を壁にする」……というように、「もし〜なら」のブロックがズラッと長く連なっていた。


決して間違いではありません。 また、柱を倒す仕組みを丁寧に説明し、その説明をそのままプログラムにしたのでこの形でした。
ただ、これだと迷路のサイズを変えたい時に修正が大変ですし、何よりブロックが長すぎて読むのが嫌になってしまいますよね。
これを、変数とリストの「魔法」を使って、劇的に短く賢いプログラムに生まれ変わらせます!
魔法その1:「上」を調べる条件を入れ子にする
前回は「一番上の柱」と「二番目以降の柱」で2つの大きなブロックを分けていましたが、よく考えると違うのは「上に倒せるかどうか」だけですよね。
そこで、新しいプログラムではブロックを1つに合体させました!

基本は「右・下・左」を調べますが、『もし、今調べているのが一番上の柱(リストの数字が2)なら、上も調べる』というブロックを中に組み込んだのです。

これで、長かったブロックが半分になりました!上下のマスを調べるときは、もちろん「+横」「-横」という変数を使っていますよ。
魔法その2:リストに「計算式」をそのまま覚えさせる!
ここからが超絶テクニックです。
前回は、倒せる方向のリストに「1(上)」「2(右)」「3(下)」「4(左)」というただの記号を入れていました。だから後で「1だから上だね」と判定する長いブロックが必要だったのです。
今回は、リストに入れる数字を次のように変えます。
- 右に倒せるなら: 1
- 左に倒せるなら: -1
- 下に倒せるなら: 変数 横 (※例えば横が13なら、+13)
- 上に倒せるなら: 変数 横 × -1 (※例えば横が13なら、-13)

お気づきですか?
リストに記録しているのは記号ではなく、「今の場所からいくつ数字を足し引きすればいいか」という実際の計算の数字なのです!
衝撃のアフター!最後はたった「1行」のブロックで完了
リストの中に「+1」や「-13」といった計算用の数字が入っているので、あとはその中からランダムに1つ数字を取り出して、今の場所(カウンタ)に足してあげるだけです。
[迷路データ] の (カウンタ + [_倒す方向]の(1から[_倒す方向]の長さ までの乱数)番目) 番目を (4) で置き換える

なんと!!
あんなに長かった「もし1なら…でなければ、もし2なら…」の連鎖ブロックが、跡形もなく消え去り、たった1行のブロックになってしまいました!
コンピュータにとって分かりやすいデータの持たせ方(リストの使い方)を工夫するだけで、プログラムはこんなにも美しく、短くなるんです。
これぞ、プログラミングの最大の面白さであり、プロのエンジニアがいつも考えている「コードを洗練させる(リファクタリング)」という魔法です。
パズルを解いた後のような、スッキリした気分になりませんか?




比べるとプログラムの長さが劇的に短くなっている!
ステップ6:画面の「ド真ん中」に迷路を描画する
裏側の設計図(リスト)が完成したら、いよいよ画面にブロック(クローン)を並べて迷路を描きます。 でも、ここでも一つ問題があります。
「迷路の大きさを変えても、常に画面の『ド真ん中』に表示するには、最初のブロックをどこに置けばいいのか?」
たとえば、いつも同じ場所(左上)からブロックを並べ始めると、小さな迷路の時は画面の左上にちょこんと寄ってしまい、巨大な迷路の時は画面の右下にはみ出してしまいます。 これを解決するのが、中学校の数学で習う「X座標・Y座標」と、小学校の算数で習う「割合」の考え方です!
(座標は中学校で習う言葉ですが、考え方はそんなに難しくありません。小学生の発達段階でも充分理解できます。さのプログラミング教室では、小2~3年くらいから、座標を使ったプログラミングをしている子もいます。というか、「座標」という言葉を知らないまま、xやyを使いこなしてキャラクターの移動などに活用しています。)
魔法の式その1:ブロックの大きさを自由自在に変える
まず、迷路のマス目が多くなったとき、ブロックが大きすぎると画面に入りきりません。そこで「1マスのピクセル数」という変数を使って、クローンの大きさを調整します。
▼ 大きさを決めるブロック
大きさを ( ( 1マスのピクセル数 / 30 ) × 100 ) %にする

私たちが最初に作ったブロックのコスチュームは「30 × 30」ピクセルでしたね。 もし「1マスのピクセル数」を 15 にしたい場合、15 ÷ 30 = 0.5(半分の大きさ)になります。Scratchの大きさブロックはパーセント(%)で指定するので、最後に 100 を掛けて「 50% 」にしています。 これは小学5年の算数で習う「もとにする量と比べる量(割合)」の計算そのものです!
魔法の式その2:「切り下げ」でスタート位置(左上)を割り出す
ここが今回一番頭を使う、最高に面白いポイントです。 迷路をド真ん中(X = 0, Y = 0)に置くためには、一番最初のブロック(左上の角)の座標を計算で割り出さなければなりません。
例として、横幅が「13マス」の迷路で考えてみましょう。 中心のマス(7マス目)を X = 0 の位置に置きたいので、左端のスタート位置は、中心から「左に6マス分」進んだ場所になります。 この「6」という数字を、変数「横」から自動で計算するにはどうすればいいでしょうか?
最初のX座標を決める計算式
X座標を ( ( (横 / 2)の切り下げ ) × 1マスのピクセル数 × -1 ) にする

- (横 / 2):まず横幅を半分にします。(13 ÷ 2 = 6.5)
- 切り下げ:小数を切り捨てて、整数の「6」にします。
- × 1マスのピクセル数:6マス分の実際の長さを計算します。(例:6 × 30 = 180ピクセル)
- × -1:左方向(マイナス方向)に移動させたいので、最後に -1 を掛けます。(結果:-180)
見事に、左端のX座標「-180」が計算できました!
気になる人は、ほかの数字でも試してみてください。
最初のY座標を決める計算式
考え方は、X座標のときと変わりません。縦幅を半分にして切り下げ、ピクセル数を掛けます。
ただし、上方向はプラスなので「-1」は必要ありません。
Y座標を ( ( (縦 / 2)の切り下げ ) × 1マスのピクセル数 ) にする

これで、どんなに「縦」や「横」の数字を変えても、コンピュータが自動的に「ここから並べ始めれば、ぴったりド真ん中になるぞ!」と計算して、完璧な位置から迷路を作り始めてくれます。

タイプライターのようにブロックを並べて完成!
スタート位置さえ決まれば、あとは設計図(リスト)を見ながらブロックのクローンを並べていくだけです。
- 変数「カウンタ」を1ずつ増やしながら、リストの中身を確認します。
- もし数字が「0(通路)」でなければ、クローンを作ります。
- X座標を「1マスのピクセル数」分だけ右にズラします。
- これを「横」の回数だけ繰り返すと、1行分が完成します。
- 【改行の処理】 1行終わったら、X座標を先ほど計算した「左端のスタート位置」に戻し、Y座標を「1マスのピクセル数 × -1(下方向)」だけ下げます。
これを「縦」の回数だけ繰り返せば…… ジャーン!画面の中央から美しく広がる、あなただけのオリジナル自動生成迷路の完成です!

プログラミングと数学の力が合わさると、こんなに凄いことができるんです。感動しませんか?
まとめ:算数・数学はゲーム作りの最強の武器!
いかがでしたか?「変数」や「計算」をうまく組み合わせることで、どんなに大きな迷路でも、比較的少ないブロックで作り出すことができました。
私たちのプログラミング教室では、ただゲームで遊ぶだけでなく、「どうしてそう動くのか?」「算数の知識がどう活きるのか?」を、少人数でじっくり考えながら学んでいきます。
完成したプログラムを改造して、タイムアタック機能や、敵キャラクターを追加して、自分だけのオリジナル迷路ゲームに進化させてみてくださいね!
次回予告!
棒倒し法による、自動迷路生成プログラムは完成しました!
プログラミング教室しながら、これを教材化したかったんですよ~
願いが一つかなって、満足です!
じゃあ、次何するか、というと…
この仕組み、Minecraft Educationで使えないか…?
これです!これしかない!
さのプログラミング教室のメイン教材は「Scratch」と「Minecraft Education」ですので、
次回はエージェント君に迷路を作らせます!
お楽しみに!
今回のコード
今回のコードは、下記URLでご確認いただけます。
