第13回 考える楽しさ、習う楽しさ「6.迷路を作ろう その4」
|
|
13−6 迷路を作ろう その4
多少、贅沢な悩みですが、その3で作った迷路に対して、手放しで満足を感じない部分があります。 ちょっと考えてみることにしましょう。 その3で登場した、経路を徹底的に検索するタイプのプログラムですが、徹底的に空いている部分を検索しますので、迷路作成の最初の方は1つの検索経路が長いのですが、終盤にさしかかると、検索できる経路が減ってくるため、1つの経路が短くなることが考えられます。 その3のプログラムでは、全部の基点を左上から右下まで順に検索しましたから、迷路作成の終盤、つまり、右側に近づにつれて、だんだんと壁が短くなるわけです。 ![]() つまり、この迷路の左側と右側では壁の長さに「偏り」が発生するような気がするのですが、もちろん、隣方向の初期値をランダムで決めているので「常にそうなる」というわけではありません。 しかし、そういう傾向を含んでいるのは確かですので、何らかの形で対応をしておきたいところです。 そこで、次はこの部分を解決してみるわけですが、順番に基点を検索しているところが問題なのは明らかですから、これを、順番ではなく、ランダムに選択すればよいですね。 ![]() でも、問題は具体的な方法です。 そこで、基点をランダムに選択して検索を行い、1つの検索が終わったら基点の状態を調べて、すべての基点にブロックが置かれた時点で終了にする、という方法を考えてみました。 ![]() フローチャートにまとめると、比較的わかりやすくて、これなら問題が解決しそうです。 しかし、この方法には、大きな欠点があります。それは何でしょうか? そうですね、今回の最初に登場した、ランダムな数列を作る、という例題で遭遇した問題と内容が同じですね。気がつきましたか? 始点となる基点を決めるために、乱数を使うのですが、迷路作成の後半になってくると、だんだんと空いている残りの基点が少なくなります。 そのため「ランダムに基点を選ぶ」という部分を何度も繰り返すことになりますので、この部分にボトルネックができてしまうわけです。 そこで、ランダム数列を作るときにも登場した手法を、ここでも生かしてみましょう。あらかじめ、検索する基点の順番をランダムな数列として作っておけばよいですね。 ![]() これをプログラミングしてみました。
その2を改良してその3を作ったように、その4への改良も、部分的な追加で済ませられるように工夫してみました。 例えば、この部分です。
ひとつ前の、その3では、
となっていた部分で、こちらの場合は、変数 x を直接ループさせていましたが、その4では、変数 x を ランダム数列 Rx()から与えるようにしてあります。 話は前後しますが、ランダム数列はRx()とRy()のそれぞれに、基点の横、縦方向の座標がランダムに入っています。 基点の座標は(3,3)〜(23,23)で、奇数の部分ですから、それぞれの初期値は、
としてあります。 ここでは、
の時に、
となる奇数の数列を作っています。 この数列を後から利用しする場合は、ちょっと工夫をして、プログラムの変更が少なくなるようにしました。
また、乱数の数列を作る時、最初の説明では、For〜Nextのループを小さい順にループさせましたが、ここでは、
と大きい順にしてあります。 これは、乱数を求めるときに、「1からXまでの乱数」を求める方が楽だからです。 一番最初の例では、「その位置の後ろから30までの乱数」でしたが、後ろからループさせる事で、「1からその位置の前まで」にする事ができて、プログラムがちょっと簡単になります。
一目見ただけで、単純なのがどちらだか、わかるでしょう? こんな、ホンのちょっとのことですが、繰り返し処理をする場合には、この「ちょっとの差」が重要だったりします。この辺りは、考えた人に脱帽ですね。 さて、予想通りプログラムは今までの中で一番長くなってしまいましたが、実際に、迷路を作っている様子は面白いですね。 そして、その4で完成した迷路は、今までの中で最高の完成度を誇るような気がしませんか? 難易度は、その3とそれほど変わらないといえば変わらないですけど、気分的には違いますね。 ![]() |
|||||||||
第13回 考える楽しさ、習う楽しさ「6.迷路を作ろう その4」
|