穴掘り法による迷路作成アルゴリズムに関する質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
五反田

穴掘り法による迷路作成アルゴリズムに関する質問

#1

投稿記事 by 五反田 » 15年前

2chで質問したのですが、ミスのせいでまともな答えがもらえなさそうなので、こちらで質問させてください。

穴掘り法でコンソールの迷路を作成しようとしたのですが、参考にしたソースと同じ様に動かすつもりで
書いたのに、なぜか、掘られていない壁が残ってしまいます。
ソースを載せますので、自分のソースのどこに問題があるのか指摘してください。

参考にしたもの
ttp://codepad.org/9iaa2YAs
自分で書いたヤツ
ttp://codepad.org/DYLuK5Ca

よろしくお願いします。

たいちう

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#2

投稿記事 by たいちう » 15年前

while(1){
    i=0;
    y=1;
    while(y<SizeY-1){
        x=1;
        while(x<SizeX-1){
とりあえず、↑このように変更したら良いと思う。
forをwhileに変更した際のミスですね。
元のプログラムもそうなってましたが、
srandはプログラムの最初で一回だけ呼べばよいです。
丁寧に見てないので、他にも問題はあるかも。

パコネコ

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#3

投稿記事 by パコネコ » 15年前

int dig(int x,int y){
int dx,dy,r;
c=0;
r=rand();
printf("%d\n",r);
のrって何に使われてるんですか?
同じ数がいっぱい出てくるので気になって…ランダムなのに…
プログラムが動いてるからこれで正常なんでしょうがわかりません
質問スレに質問するのもどうかと思いましたがいいでしょうか?

たいちう

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#4

投稿記事 by たいちう » 15年前

srandの使い方を間違えているため、同じ数字になってしまいます。
dig()を呼ぶ直前に、その時の時刻で乱数を初期化してますので、
一瞬で終わるプログラムの場合は、毎回同じ時刻で初期化され、
常に同じ乱数を使うことになってしまいます。

main()の最初に一度だけsrand()を呼ぶように変えて下さい。

パコネコ

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#5

投稿記事 by パコネコ » 15年前

おおできた
ばらばらだ~
五反田さんもできたかな~
たいちうさんありがとうございます
これでもやもやが晴れました

ookami

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#6

投稿記事 by ookami » 15年前

見ましたが、
for( x=0; x<SizeX; x++ ){
for ( y=0; y<SizeY; y++ ){
map[x][y]=1;
}
}

for(x=0;x<=SizeX-1;x++){
for(y=0;y<=SizeY-1;y++){
map[x][y]=1;
}
}
とか、
++i;

i++;
など、「そこ変えても意味なくないか?」と思うところが多くてまどわされるんですが...

x=1;
y=1;
while(y<SizeY-1){
while(x<SizeX-1){

x=x+2;
}
y=y+2;
}
を、元のソースの
for(y=1; y<SizeY-1 ; y += 2 ){
for(x=1; x<SizeX-1 ; x += 2 ){

}
}
に変えてはどうでしょうか。

(個人的には、135行もあって2重ループがあちこちにあって、コメントが皆無で開発環境も明示されていないプログラムの間違いを探せと言ったら、まともな答えが帰ってこないのも無理ないと思います。)

--- 追記

たいちうさんが43分も(23:30~0:13)前に回答されていたのに気付かず同じ回答をしてしまいました... スルーしてください;; 画像

五反田

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#7

投稿記事 by 五反田 » 15年前

>>たいちうさん
ありがとうございます。
無事に臨むような結果が得られました。
なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
見落としていました。

>>パコネコさん
>>ookamiさん
質問の仕方とか、書いたコードが分かりにくい感じでしたね。すいません。
自分でもところどころどうなっているのか分かりづらいと思いました。


while(y<SizeY-1){
while(x<SizeX-1){

x=x+2;
}
y=y+2;
}

↑のコードなんですが、実はもとのソースを参考にしてartisocというソフトでvisual basic的なコードを使って、シミュレーション用のマップ生成のコードを書いていたのですが、その仕様の関係でfor文が

for x=0 to 6
:
next x

のような書き方しか出来なかったので無理やりwhileにしようとして、さらにそれがまともに動かなかったので、自分が書いたやつをcに書き直してアドバイスを伺おうと思ったらこうなってしまったんです。
でも、artisocのほうはやっぱり掘り残しが残ってしまうorz
もう少し考えてみます。

何はともあれ皆さんアドバイスありがとうございました。

たいちう

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#8

投稿記事 by たいちう » 15年前

解決したのならば解決マークをチェックしてください。


> なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
> 見落としていました。

正常に動作するプログラムAと、何故か正常に動作しないプログラムBがあり、
Bのデバッグをする、という状況はよくあります。

Aは正常・Bは異常という状態を保ったまま、両者を近づけていくことで、
Bが異常になってしまう原因を絞り込むことができます。
例えば今回の場合は、AのmainからBのdigを呼んだり、その逆を試すことで、
原因はmainにあることがすぐに分かります。

今回のような小さなプログラムでは、慣れれば困難はないのですが、
もっと大きなプログラムの場合は、DF.exeというファイル比較の
フリーウェアを使ったりしながら、地道な作業を行うことになります。
原理的には必ず解決します。

「Aは正常・Bは異常という状態を保ったまま両者を近づける」ということが重要で、
少し近づけては実行して状態を確認するということを繰り返します。
i++と++iの違いとか、for(とfor (の違いとか、原因でないことが明らかなものも、
直していきます。もし可能ならば、ついでにプログラム全体を小さくすることで、
作業も楽になります。

五反田

Re:穴掘り法による迷路作成アルゴリズムに関する質問

#9

投稿記事 by 五反田 » 15年前

>>たいちうさん
解決マーク忘れてました。たびたびすいません。

なるほど、正常動作するものと異常動作するものは、そうやって比較していくんですね。
プログラム全体を小さくするのはなかなか難しいんですが、頑張って正常動作するように近づけたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る