迷路の作成

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

迷路の作成

#1

投稿記事 by カリンカ » 14年前

プログラミング初心者のものです。勉強のために
http://aanda.system.to/maze/maze2.html
こちらのサイトを参考に迷路を作ってみようと思ったのですが、どうしてもうまくいきません。どこがおかしいのかご指摘していただけたらと思います。

コード:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int maze[15][15];

void maze_init(){
	short inx,iny;

	for(inx=0; inx<15; inx++){
		for(iny=0; iny<15; iny++){
			if(inx==0 || inx==14 || iny==0 || iny==14)
				maze[inx][iny] = 0;  //0=道
			else if(inx==2 && iny==2)
				maze[inx][iny] = 0;
			else
				maze[inx][iny] = 1;  //1=壁
		}
	}
}

short maze_sub(short x, short y){
	short x1,y1,px,py,r,check,count;
	count = 0;
	x1 = x; y1 = y;  //(x,y)の値を(x1,y1)に
	srand((unsigned)time(NULL));
	
	RANDOM:
	r = rand()%4+1;  //乱数生成

	CHECK:
	switch(r){
	case 1:  //上(0,-1)
		px = 0;
		py = -1;
		check = 1;
		break;
	case 2:  //右(1,0)
		px = 1;
		py = 0;
		check = 2;
		break;
	case 3:  //下(0,1)
		px = 0;
		py = 1;
		check = 3;
		break;
	case 4:  //左(-1,0)
		px = -1;
		py = 0;
		check = 4;
		break;
	}

	if(maze[x1+px*2][y1+py*2] == 1){
		maze[x1+px][y1+py] =0;
		maze[x1+px*2][y1+py*2] = 0;
		  //(x1+px,y1+py),(x1+px*2,y1+py*2)を道に
		x1 = x1+px*2; y1 = y1+py*2;
		  //(x1,y1)を(x1+px*2,y1+py*2)へ移動
		goto RANDOM;
	}else if(check == 1 && count != 4){
		r = 2;
		count = count+1;
		goto CHECK;
	}else if(check == 2 && count != 4){
		r = 3;
		count =count+1;
		goto CHECK;
	}else if(check == 3 && count != 4){
		r = 4;
		count = count+1;
		goto CHECK;
	}else if(check == 4 && count != 4){
		r = 1;
		count = count+1;
		goto CHECK;
	}else{
		return 0;
	}
}

int main(){
	short x,y;
	
	maze_init();

	for(x=2; x<15; x+=2){
		for(y=2; y<15; y+=2){
			maze_sub(x,y);
		}
	}

	for(x=0; x<15; x++){  //画面に表示
		for(y=0; y<15; y++){
			if(maze[x][y] == 0)
				printf("  ");
			else
				printf("■");
		}
		printf("\n");
	}

	return 0;
}
乱数(r)によりチェックする方向をランダムに決定し、countにより4方向を調べたかどうかをチェックしています

WALTER

Re: 迷路の作成

#2

投稿記事 by WALTER » 14年前

まぁまず解読してないが、一言言えるのが
人に読ますにも自分で理解する為にもコメントをちゃんと付けようぜ
後々作っていてわからなくなるし

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 迷路の作成

#3

投稿記事 by ISLe » 14年前

maze_subを呼び出すforループを回し過ぎみたいですよ。

あと、srandは乱数の発生順をリセットする命令なので、main関数で最初に一回呼び出せば良いです。
短時間に何回も呼び出すとリセットして最初の数値を取り出すことになるので同じ数値ばかりになります。

box
記事: 2002
登録日時: 14年前

Re: 迷路の作成

#4

投稿記事 by box » 14年前

とりあえず、あれですね、

>どうしてもうまくいきません。

だけってのは、上手じゃない質問の典型的な例ですね。
何をしたときにどんな風にうまくいかないかってのをちゃんと書いてくれないことには、

>どこがおかしいのかご指摘していただけたら

指摘しようにもむずかしい場合がある、ってことです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

カリンカ

Re: 迷路の作成

#5

投稿記事 by カリンカ » 14年前

質問の仕方が悪かったです、すみません

現状では、本来壁になるはずの外周も道になってしまい迷路の形になっていません。一応道を伸ばして迷路を作る作業自体はできているようです。maze_subの部分に原因があると考えているのですが、自力ではよくわからず誰かのアドバイスがほしくて質問させていただきました。

コメントをつけながら見直してみます

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 迷路の作成

#6

投稿記事 by ISLe » 14年前

#またもやスルーされてしまいましたね。
#もしかしてわたしはこの世界に存在していないのではないかと本気で感じます。

参考にしたページを開いて最初に目に飛び込んでくるコード。
そのforループの終了条件をよーーーーく見てください。

(追記)
インデントはしっかり入っているし、空行の入れ方もセンスが良いと感じました。
読みやすいコードだと思います。

カリンカ

Re: 迷路の作成

#7

投稿記事 by カリンカ » 14年前

>ISLeさん
そこのミスには気づきませんでした!ご指摘ありがとうございます

閉鎖

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