↓のプログラムなのですが、
実行すると上の画像のように簡単なマップに見える様文字が表示されます
"☆"-現在地
"■"-壁
" "-通路
"●"-スタート地点
"○"-ゴール地点
移動の判定は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 }