迷路を右手法で攻略する(6) 右(左)手法の欠点

右手法(左手法)を使えば、必ずゴールにたどり着けるのでしょうか?

これまでは、キャラクターの出発地点を左上、ゴールを右上に設定していました。これらが毎回ランダムに出現するようにしてみましょう。setup() の以下の部分を修正します。

X = 1;
Y = 1;
 ↓ 修正
do{
 X = int(random(20));
 Y = int(random(20));
}while(map[Y][X]==1);

do while文は「後判定」と呼ばれ、一度{}内の処理をした後に while の()内の条件に合っているかを判定します。
int(random(20)) で 0 から20未満のランダムの値を X と Y に入力し、map[Y][X]==1 の間は入力を繰り返す、つまり map[Y][X]==0 になるまで X と Y に値を入力し続けます。

同様にゴールも毎回ちがう場所に出現するようにしてみましょう。新たに goalX と goalY という変数を用意します。ゴールの値は 2 に設定していましたので、ゴールの場所(map[goalY][goalX])に 2 を上書きしておきます。なお、コードは前回までの左手法を使用しています。

do{
 goalX = int(random(20));
 goalY = int(random(20));
}while(map[goalY][goalX]==1);
map[goalY][goalX] = 2;

すると、毎回違う場所にキャラクターとゴールが出現するようになりました。でも・・・あれ?


左の図では、いつかゴールをしてくれそうですが、永遠にゴールしません。
キャラクターは外側の壁伝いに動きますが、ゴールは迷路の内側にあるためです。


今度はどうでしょう。
キャラクターが移動の頼りにしている左側の壁が、他の壁から独立して島のようになっています。
そのため、この壁の周りをぐるぐると回り続けます。


さて今度は。今回キャラクターが最初に出現した場所が、幅が広い道でした。
この場合、白い部分をくるくると回り続けます。
右手(左手)法は壁を頼りにするわけですが、肝心の壁がまわりにないためこのようなことが起こります。

つまり以下の場合、これまでの右(左)手法ではゴールにたどり着くことができません。

  • キャラクターが壁に接していない
  • ゴールが壁に接していない
  • キャラクター、ゴールともに壁に接しているが、その壁がつながっていない

当然といえば当然ですね。さて次回は、回避策を検討するのかしないのか。

Leave a Reply

Your email address will not be published. Required fields are marked *