/* 二次元の酔歩 (random walk) L を自然数とする。x, y 座標がともに -(L-1) ... L-1 の範囲にある格子点の 上を、点(酔人)が、等確率で東西南北に動く。この範囲から出れば終了。 画面制御エスケープシーケンスを使っている。 */ #include #include /* srand() */ #include /* time() */ #define L 16 /* 動く範囲となる正方形の、一辺の長さの約半分 */ void gotoxy(int x, int y); /* 位置 (x, y)(どちらも -(L-1) ... L-1 の範囲にある)を画面上の位置に換算、*/ /* そこへカーソルを移動。(このように main() 以外の関数を先に書いてもよい。)*/ void gotoxy(int x, int y) { printf("\033[%d;%dH", x + L + 1, 2*y + 2*L + 1); } main() { int i, j, x, y; { /* この中カッコの中(乱数の種の設定)はわからなくてもよい */ unsigned seed = (unsigned)time(NULL); /* 現在時刻を取得して */ /* printf("乱数の種は %u です.\n", seed); */ srand(seed); /* それを乱数の種に */ } printf("\033[2J"); /* 画面全体を消去 */ printf("\033[1;1H"); /* 左上すみへカーソルを移動 */ /* まず、枠を書く */ /* 上辺を書く */ printf("+"); /* 上左のすみ */ for (i = -2*L+1; i < 2*L; i++) { /* 上辺 */ printf("-"); } printf("+\n"); /* 上右のすみ */ for (i = -L+1; i < L; i++) { /* 左辺と右辺を書く */ printf("|"); /* これが左辺で */ for (j = -2*L+1; j < 2*L; j++) { /* これは途中の空白 */ printf(" "); } printf("|\n"); /* これが右辺 */ } printf("+"); /* 下辺を書く(上辺と全く同じ) */ for (i = -2*L+1; i < 2*L; i++) { printf("-"); } printf("+\n"); /* それから酔人を書く */ x = 0; y = 0; /* 最初は (0, 0) にいる */ for ( ; -L < x && x < L && -L < y && y < L; ) { gotoxy(x, y); /* 新しい位置に移動 */ printf("p"); /* 人の絵を書く */ printf("\033[%d;1H", 2*L+2); /* カーソルを枠の左下へ移動 */ fflush(stdout); /* ここまでの出力を吐き出させる */ for (i = 0; i < 10000; i++) { /* 時間かせぎの空ループ。回数は */ for (j = 0; j < 5000; j++) { /* マシンによって適宜調整して */ ; /* ください。(二重ループにして */ } /* あるのは、int 型の最大値が */ } /* 32767 のマシンがあるから。) */ gotoxy(x, y); /* さっきの位置に戻って、空白を出力すること */ printf(" "); /* で、いままで表示されていた「p」を消す */ i = rand() % 4; /* 乱数の値 mod 4 で */ if (i == 0) { x--; /* 北へ */ } else if (i == 2) { y++; /* 東へ */ } else if (i == 3) { x++; /* 南へ */ } else { y--; /* 西へ */ } } /* 酔人が枠の上に乗るとここへきて、終わる */ gotoxy(x, y); /* カーソルを移動して */ printf("b"); /* 倒れている人の絵を書いて */ printf("\033[%d;1H", 2*L+2); /* プログラム終了時のカーソル位置へ移動 */ }