C言語での迷路ゲーム

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

C言語での迷路ゲーム

#1

投稿記事 by てる » 16年前

極一般的な文字を使った迷路ゲームです。
↓のプログラムなのですが、
実行すると上の画像のように簡単なマップに見える様文字が表示されます
"☆"-現在地
"■"-壁
" "-通路
"●"-スタート地点
"○"-ゴール地点
移動の判定はscanfで数字を入力してもらいdirの値(0-上 1-左 2-下 3-右)に
よって移動方向が変わる、という形にしました。
関数check(dir)で移動先の場所が2(壁)であるか判定しているのですが、
最初スタート地点から下(DOWN)に移動したあと移動できる方向が右(RIGHT)のみになるという
不都合が生じています。
なぜ、右方向以外が壁判定がON(移動不可)になってしまうかが自分なりに数時間検討しましたが
分からなかったので助けを求めての投稿になります。
なぜ壁があると判定されてしまうのか教えていただけると幸いです。
(調べたところ、右方向以外の先は2(壁)の値が帰ってくる様です)

goto文を使ってしまっているのは簡略化のためです、申し訳ない。
#include<stdio.h>

#define TATE	8
#define YOKO	8
#define UP	0
#define LEFT	1
#define DOWN	2
#define RIGHT	3
#define EXIT	0xff
#define START	0xf0

void byouga();
void go(int ido);
void check(int x2);

int map[TATE][YOKO]={
	{2,START,2,2,2,2,2	,2},
	{2,1,1,1,1,2,1,2},
	{2,1,2,1,2,2,1,2},
	{2,1,2,1,2,1,1,2},
	{2,1,2,1,1,1,2,2},
	{2,2,2,1,2,1,2,2},
	{2,1,1,1,2,1,1,2},
	{2,2,2,2,2,2,EXIT,2},
};
int moto;
int x=1;
int y=0;
int key;
int dir;
int kabeflg=0;

int main (void)
{
	while(map[y][x]!=EXIT){
		printf("\n現在地・・・☆\n\n");
		printf(" 0\n1 3\n 2\n\n");
		moto=map[y][x];
		map[y][x]*=0;
		byouga();
		map[y][x]=moto;
jump:
		scanf("%d", &dir);
		check(dir);
		if(kabeflg==1)
		{
			printf("壁があります\n");
			kabeflg=0;
			goto jump;
		}
		if(dir<=3&&0<=dir)
		{
			go(dir);
		}else{
			printf("正しいキー入力をお願いします\n");
			goto jump;
		}
	}
     printf("\nゴール!!");
}
void check(int x2)
{
	switch(x2){
		case UP:
			if(map[y-1][x]==2)//壁がある
			{
				kabeflg=1;
			}
			break;
		case LEFT:
			if(map[y][x-1]==2)//壁がある
			{
				kabeflg=1;			
			}
			break;
		case DOWN:
			if(map[y+1][x]==2)//壁がある
			{
				kabeflg=1;			
			}
			break;
		case RIGHT:
			if(map[y][x+1]==2)//壁がある
			{
				kabeflg=1;			
			}
			break;
		default:
			break;
	}
}
void byouga()
{
	int i,j;
	for(i=0;i<TATE;i++){
		for(j=0;j<YOKO;j++){
			switch(map[j]){
				case 0:
					printf("☆");//現在地
					break;
				case 1:
					printf(" ");//移動可 (通路
					break;
				case 2:
					printf("■");//移動不可(壁
					break;
				case START:	
					printf("●");//スタート地点
					break;
				case EXIT:
					printf("○");//ゴール地点
					break;
			}
			
		}
		printf("\n");
	}
}
void go(int ido)
{
	if	   (ido == UP	)y--;	//0
	else if(ido == LEFT	)x--;	//1	
	else if(ido == DOWN	)y++;	//2
	else if(ido == RIGHT)x++;	//3
}

山崎

Re:C言語での迷路ゲーム

#2

投稿記事 by 山崎 » 16年前

おはようございます。

>最初スタート地点から下(DOWN)に移動したあと移動できる方向が右(RIGHT)のみになるという
不都合が生じています。

とのことですが、こちらのほうでプログラムを試してみたところ、ちゃんと下に動くことができました。
そのときの様子をスクリーンショットにして添付してあります。
ゴールまでは試していませんが、スタート地点周辺は全てちゃんと動けるように見えます。

プログラムをリビルドしたり、パソコンを再起動したりすれば動くようになったりしないでしょうか?

閉鎖

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