すみません、間違いが多かったので、先ほどの投稿消しました。
プログラム修正しました。
しかし、、すごく無駄な処理をしています・・。
必ずもっとスマートにかけると思います。。。
angleという向きを設定して、今の進行方向に対して
・左 進行方向 右
の順番にいけるかどうか調査し、いけなかったら戻ります。
いけるかどうかはその配列要素が0か1かで判断します。
常に進行方向に対して左から調査しているので、
同じいきどまりでうろうろすることはありません。
とうとう再起関数では書きませんでした。
一応できたので、これでいいか見てください。
ans関数の中はどうにもなりません・・。
これ以上スマートに書く方法自分では思いつきません。
ごめんなさい。
とりあえず修正版アップします。
迷路はもっと複雑にしました。
始点はi,jの宣言に代入してください。
終点の設定はいりません。一番下に来れば自動的に終了します。
これでやりたいことがあってるか確認してください。
汚いソースですみません・・・。
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define R1 16
#define R2 16
int ans(int *angle,int **road,int *i,int *j){//angel 1=上 2=右 3=下 4=左
if(*angle==1){//上向きだったら
if(road[(*i)][(*j)-1]==1)//左にいけたら
(*j)-- , *angle=4;//左に進む
else if(road[(*i)-1][(*j)]==1)//上にいけたら
(*i)--;//上に進む
else if(road[(*i)][(*j)+1]==1)//右にいけたら
(*j)++ , *angle=2;//右に進む
else{//行き止まりなら
(*i)++;//来た方向へ戻る
*angle=3;//方向を変える。
}
}
else if(*angle==2){//右向きだったら
if(road[(*i)-1][(*j)]==1)//上にいけたら
(*i)-- , *angle=1;//上に進む
else if(road[(*i)][(*j)+1]==1)//右にいけたら
(*j)++;//右に進む
else if(road[(*i)+1][(*j)]==1)//下にいけたら
(*i)++ , *angle=3;//下に進む
else{//行き止まりなら
(*j)--;
*angle=4;
}
}
else if(*angle==3){//下向きだったら
if(road[(*i)][(*j)+1]==1)//右にいけたら
(*j)++ , *angle=2;//右に進む
else if(road[(*i)+1][(*j)]==1)//下にいけたら
(*i)++;//下に進む
else if(road[(*i)][(*j)-1]==1)//左にいけたら
(*j)-- , *angle=4;//左に進む
else{//行き止まりなら
(*i)--;
*angle=1;
}
}
else{//左向きだったら
if(road[(*i)+1][(*j)]==1)//下にいけたら
(*i)++ , *angle = 3;//下に進む
else if(road[(*i)][(*j)-1]==1)//左にいけたら
(*j)--;//左に進む
else if(road[(*i)-1][(*j)]==1)//上にいけたら
(*i)-- , *angle = 1;//上に進む
else{//行き止まりなら
(*j)++;
*angle=2;
}
}
if((*i)==R2-1)//一番下まで来たら
return 0;
else
return 1;
}
void disp(int **road,int i,int j){//表示関数
for(int s=0;s<R1;s++){
for(int t=0;t<R2;t++){
if(s==i && t==j)//今いる位置なら
printf("●");
else if(road[t]==0)
printf("■");
else
printf(" ");
}
printf("\n");
}
printf("\n\n\n");
return ;
}
int main(){
int road[R1][R2]={
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,0,0,1,0,1,0,1,1,0},
{0,1,0,1,0,0,1,1,1,1,1,1,1,1,0,0},
{0,1,0,1,1,0,1,0,0,1,0,1,0,1,0,0},
{0,1,0,1,0,0,1,0,1,0,0,0,0,1,0,0},
{0,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0},
{0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0},
{0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,0},
{0,1,0,1,1,1,0,1,0,0,0,0,0,0,1,0},
{0,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0},
{0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,0},
{0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,0,1,0,1,1,1,1,1,1,1,0},
{0,1,1,0,1,1,1,1,1,0,0,0,0,0,1,0},
{0,0,1,1,1,0,1,0,0,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}
};
int *ptr[R2];
for(int s = 0; s < R2; s++)//別にこんな事しなくてもいいですが、一応2次元配列が**で受け取れるように
ptr = road;
int **pp = &ptr[0];
{
int i=0,j=1,angle=3;
while(1){
system("cls");//画面クリア
if(ans(&angle,pp,&i,&j)==0)
break;
disp(pp,i,j);
Sleep(17*12);//17というのは60fpsの1fあたりの時間
}
disp(pp,i,j);
}
return 0;
}