ですが再帰自体があまり理解できず、取り敢えず作ってみたんですが…
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3
#define ROAD 4
#define WALL 5
#define SMAX 17
#define ENTRANCE 6
#define EXIT 7
void init();
void randnum();
void go();
void stop();
int exca(int);
int x, y, xx, yy, dir, px, py;
char M[SMAX][SMAX];
int main(void){
init();
while(M[y][x] != EXIT){
randnum();
xx = x + px * 2;
yy = y + py * 2;
if(M[yy][xx] == WALL) exca(dir);
else if(M[yy][xx] == ROAD) stop(dir);
}
for(y = 0; y < SMAX; y++){ // 配列の表示
for(x = 0; x < SMAX; x++){
if(M[y][x] == ENTRANCE) printf("▽");
else if(M[y][x] == EXIT) printf("▽");
else if(M[y][x] == ROAD) printf(" ");
else if(M[y][x] == WALL) printf("■");
}
printf("\n");
}
return 0;
}
void init(){
for(y = 0; y < SMAX; y++){ // 配列の初期化
for(x = 0; x < SMAX; x++){
M[y][x] = WALL; // 全部『壁』のフラグを立てる。
M[0][x] = ROAD; // 一番上の横1行を『道』のフラグを立てる。
M[SMAX - 1][x] = ROAD; // 一番下の横1行を『道』のフラグを立てる。
M[y][0] = ROAD; // 一番左の縦1列を『道』のフラグを立てる。
M[y][SMAX - 1] = ROAD; // 一番右の縦1列を『道』のフラグを立てる。
M[1][2] = ENTRANCE; // スタート位置のフラグを立てる。
M[SMAX-2][SMAX-3] = EXIT; // ゴール位置のフラグを立てる。
}
}
x = 2;
y = 2;
px = 0;
py = 0;
M[y][x] = ROAD; // 起点
}
void randnum(){
srand((unsigned)time(NULL)); // 乱数
dir = rand();
dir = dir % 4;
go(dir);
}
int exca(dir){
if((dir == UP) || (dir == DOWN)){ // 穴掘り作業
M[yy][xx] = ROAD;
M[yy - 1][xx] = ROAD;
y = yy;
x = xx;
}
else if(dir == RIGHT){
M[yy][xx] = ROAD;
M[yy][xx - 1] = ROAD;
y = yy;
x = xx;
}
else{
M[yy][xx] = ROAD;
M[yy][xx - 1] = ROAD;
y = yy;
x = xx;
}
}
void stop(dir){ // 2マス先が『道』だったので、計算されたyy・xxの添え字を戻す。
yy = y;
xx = x;
randnum();
exca(dir);
}
void go(dir){ // 2マス先の値
if(dir == UP) py = -1;
else if(dir == RIGHT) px = 1;
else if(dir == DOWN) py = 1;
else px = -1;
}
というソースを作りました。
一応、コンパイルは出来るのですが…いざ起動させてみよう!とすると表示されません。
全体的におかしいと思いますが、『どこが どうで 動かない』のかが分かりません。
親切な回答をお願いします。