![](https://omouga-mama.com/wp-content/uploads/2021/04/cropped-arisu30.png)
迷路を解くプログラムを作ってみます。
通路を総当たりで進んで、いつかゴールにたどり着くプログラムです。
わりと簡単なプログラムで作ることができます。
プログラムの概要
迷路を自動で解くプログラムを考えてみたいと思います。
自動でとはいっても、人間の様に最短のコースを見つけるような仕組みではありません。
通路を総当たりに通って、いつかゴールにたどり着くプログラムです。
では、どんな風に通路を進んだら総当たりになるのでしょうか。
例えば、ずっと壁沿いに進んでいくとどうでしょう。
人が洞窟に迷い込んだとき、左手でずっと壁を触りながら歩いていくと、いつか必ず出口にたどり着きます。
この仕組みをプログラムで作ってみたいと思います。
この仕組みの場合、ゴールが不可能な場合もあります。
例えば、出口が広い部屋の真ん中にある場合はいくら壁沿いに歩いてもゴールにたどり着きません。
または、
スタート時点で、出口につながっていない壁沿いからスタートした場合です。
例えば、部屋の真ん中に立っている柱に手をついてしまった場合、同じところをぐるぐる回り続けてしまいます。
左手沿いに進むロジック
迷路の形はなんでもいいのですが、イメージしやすいように下のような迷路を想像してください。
※背景に標準で用意されているものを使っています。
20pxの方眼紙に緑の色を塗って迷路を作りました。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-60.png)
緑色の部分が壁で、内側の白い部分が通路です。
この通路を総当たりで進むプログラムを考えます。
進行方向に向かって左手沿いに
ズバリ、このようになります。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-61.png)
基本的な動きは、
上半分のプログラムです。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-62.png)
1.前に進む
2.進んだ先が壁(緑)だったら、戻る
3.戻ったときは右に向きを変える。
このパターンです。
ただ、これだけでは問題があります。
突き当たるまで、まっすぐ進み続けます。
途中に左に分かれ道があったときに、左に曲がる仕組みがありません。
そこで、後半部分を追加します。
前に進むごとに左に進んでみます。
左に壁があれば戻って向きを戻します。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-63.png)
※1秒待つは、今は考えなくてよいです。
この後、1秒でコマずつ迷路を解く動きをさせるために入っています。
1.”でなければ”(壁にぶつからずに進んでいたら)左を確認するプログラムを実行します。
2.左に向きを変える。
3.進む
4.進んだ先が壁だったら戻る
5.戻ったときは右に向きを変える(元の方向を向く)
この仕組みで、左手沿いに通路を進んでいくプログラムになります。
実行するとこの様になります。
このプログラムで目的は達成したのですが、動きがイマイチです。
猛スピードで進むことと、1マスずつカクカク動くので、滑らかに動くように改造してみましょう。
滑らかに動かす
このように、滑らかに迷路を進むように改造してみましょう。
仕組みは割と簡単です。
紫の四角のスプライトは非表示にします。
ボールのスプライトを追加して、ボールが滑らかに動くようにします。
スプライトの設定はこのようにしておきます。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-64.png)
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-65.png)
プログラムの大まかな仕組みは、次の2つを追加します。
1秒かけてBall(ボール)はスプライト1(紫四角)の場所に移動します。
スプライト1(紫四角)はBall(ボール)が触れたら次のマスに進むようにします。
スプライト1(紫四角)のプログラムはこちらです。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-66.png)
Ball(ボール)のプログラムはこちらです。
![](https://omouga-mama.com/wp-content/uploads/2024/03/image-67.png)
コメント