2chで質問したのですが、ミスのせいでまともな答えがもらえなさそうなので、こちらで質問させてください。
穴掘り法でコンソールの迷路を作成しようとしたのですが、参考にしたソースと同じ様に動かすつもりで
書いたのに、なぜか、掘られていない壁が残ってしまいます。
ソースを載せますので、自分のソースのどこに問題があるのか指摘してください。
参考にしたもの
ttp://codepad.org/9iaa2YAs
自分で書いたヤツ
ttp://codepad.org/DYLuK5Ca
よろしくお願いします。
穴掘り法による迷路作成アルゴリズムに関する質問
Re:穴掘り法による迷路作成アルゴリズムに関する質問
while(1){ i=0; y=1; while(y<SizeY-1){ x=1; while(x<SizeX-1){とりあえず、↑このように変更したら良いと思う。
forをwhileに変更した際のミスですね。
元のプログラムもそうなってましたが、
srandはプログラムの最初で一回だけ呼べばよいです。
丁寧に見てないので、他にも問題はあるかも。
Re:穴掘り法による迷路作成アルゴリズムに関する質問
int dig(int x,int y){
int dx,dy,r;
c=0;
r=rand();
printf("%d\n",r);
のrって何に使われてるんですか?
同じ数がいっぱい出てくるので気になって…ランダムなのに…
プログラムが動いてるからこれで正常なんでしょうがわかりません
質問スレに質問するのもどうかと思いましたがいいでしょうか?
int dx,dy,r;
c=0;
r=rand();
printf("%d\n",r);
のrって何に使われてるんですか?
同じ数がいっぱい出てくるので気になって…ランダムなのに…
プログラムが動いてるからこれで正常なんでしょうがわかりません
質問スレに質問するのもどうかと思いましたがいいでしょうか?
Re:穴掘り法による迷路作成アルゴリズムに関する質問
srandの使い方を間違えているため、同じ数字になってしまいます。
dig()を呼ぶ直前に、その時の時刻で乱数を初期化してますので、
一瞬で終わるプログラムの場合は、毎回同じ時刻で初期化され、
常に同じ乱数を使うことになってしまいます。
main()の最初に一度だけsrand()を呼ぶように変えて下さい。
dig()を呼ぶ直前に、その時の時刻で乱数を初期化してますので、
一瞬で終わるプログラムの場合は、毎回同じ時刻で初期化され、
常に同じ乱数を使うことになってしまいます。
main()の最初に一度だけsrand()を呼ぶように変えて下さい。
Re:穴掘り法による迷路作成アルゴリズムに関する質問
見ましたが、
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)前に回答されていたのに気付かず同じ回答をしてしまいました... スルーしてください;;
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:穴掘り法による迷路作成アルゴリズムに関する質問
>>たいちうさん
ありがとうございます。
無事に臨むような結果が得られました。
なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
見落としていました。
>>パコネコさん
>>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
もう少し考えてみます。
何はともあれ皆さんアドバイスありがとうございました。
ありがとうございます。
無事に臨むような結果が得られました。
なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
見落としていました。
>>パコネコさん
>>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:穴掘り法による迷路作成アルゴリズムに関する質問
解決したのならば解決マークをチェックしてください。
> なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
> 見落としていました。
正常に動作するプログラムAと、何故か正常に動作しないプログラムBがあり、
Bのデバッグをする、という状況はよくあります。
Aは正常・Bは異常という状態を保ったまま、両者を近づけていくことで、
Bが異常になってしまう原因を絞り込むことができます。
例えば今回の場合は、AのmainからBのdigを呼んだり、その逆を試すことで、
原因はmainにあることがすぐに分かります。
今回のような小さなプログラムでは、慣れれば困難はないのですが、
もっと大きなプログラムの場合は、DF.exeというファイル比較の
フリーウェアを使ったりしながら、地道な作業を行うことになります。
原理的には必ず解決します。
「Aは正常・Bは異常という状態を保ったまま両者を近づける」ということが重要で、
少し近づけては実行して状態を確認するということを繰り返します。
i++と++iの違いとか、for(とfor (の違いとか、原因でないことが明らかなものも、
直していきます。もし可能ならば、ついでにプログラム全体を小さくすることで、
作業も楽になります。
> なぜ異なるのかが、いくら見ても分からなかったのですが、そういうことだったんですね。
> 見落としていました。
正常に動作するプログラムAと、何故か正常に動作しないプログラムBがあり、
Bのデバッグをする、という状況はよくあります。
Aは正常・Bは異常という状態を保ったまま、両者を近づけていくことで、
Bが異常になってしまう原因を絞り込むことができます。
例えば今回の場合は、AのmainからBのdigを呼んだり、その逆を試すことで、
原因はmainにあることがすぐに分かります。
今回のような小さなプログラムでは、慣れれば困難はないのですが、
もっと大きなプログラムの場合は、DF.exeというファイル比較の
フリーウェアを使ったりしながら、地道な作業を行うことになります。
原理的には必ず解決します。
「Aは正常・Bは異常という状態を保ったまま両者を近づける」ということが重要で、
少し近づけては実行して状態を確認するということを繰り返します。
i++と++iの違いとか、for(とfor (の違いとか、原因でないことが明らかなものも、
直していきます。もし可能ならば、ついでにプログラム全体を小さくすることで、
作業も楽になります。
Re:穴掘り法による迷路作成アルゴリズムに関する質問
>>たいちうさん
解決マーク忘れてました。たびたびすいません。
なるほど、正常動作するものと異常動作するものは、そうやって比較していくんですね。
プログラム全体を小さくするのはなかなか難しいんですが、頑張って正常動作するように近づけたいと思います。
解決マーク忘れてました。たびたびすいません。
なるほど、正常動作するものと異常動作するものは、そうやって比較していくんですね。
プログラム全体を小さくするのはなかなか難しいんですが、頑張って正常動作するように近づけたいと思います。