ですが再帰自体があまり理解できず、取り敢えず作ってみたんですが…
#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; }
というソースを作りました。
一応、コンパイルは出来るのですが…いざ起動させてみよう!とすると表示されません。
全体的におかしいと思いますが、『どこが どうで 動かない』のかが分かりません。
親切な回答をお願いします。