/* randomknight.c 中心からスタートする「@」がランダムにチェスのナイトの動きをする。盤から出ると終了。 (盤のふちはセーフ。) */ #include #include /* rand() */ #include /* time() */ #define WIDTH 28 /* 判の幅(の半分)。自由に変えてよい */ #define gotoxy(x, y) printf("\033[%d;%dH", (WIDTH + 4 + (x)), (2 * WIDTH + 5 + 2 * (y))) main() { int i, j; int x, y; /* 位置 */ int dx, dy; /* これだけ移動 */ int count; /* 何ステップ目かを示す数 */ printf("\033[2J"); /* 画面消去 */ printf("\033[1;1H"); /* 左上隅へ */ { /* この中カッコの中(乱数の種の設定)はわからなくてもよい */ unsigned seed = (unsigned)time(NULL); /* 現在時刻を取得して */ printf("乱数の種は %u です.\n", seed); srand(seed); /* それを乱数の種に */ } gotoxy(-WIDTH, -WIDTH); /* 上の端を書く */ printf("+"); for (i = 0; i < 2 * WIDTH - 1; i++) { printf("-"); } printf("+"); for (i = 0; i < 2 * WIDTH - 1; i++) { printf("-"); } printf("+"); for (i = -WIDTH + 1; i < 0; i++) { /* 左右の端を書く */ gotoxy(i, -WIDTH); printf("|"); gotoxy(i, +WIDTH); printf("|"); } gotoxy(0, -WIDTH); printf("+"); gotoxy(0, +WIDTH); printf("+"); for (i = 1; i < WIDTH; i++) { /* 左右の端を書く(続き) */ gotoxy(i, -WIDTH); printf("|"); gotoxy(i, +WIDTH); printf("|"); } gotoxy(WIDTH, -WIDTH); /* 下の端を書く */ printf("+"); for (i = 0; i < 2 * WIDTH - 1; i++) { printf("-"); } printf("+"); for (i = 0; i < 2 * WIDTH - 1; i++) { printf("-"); } printf("+"); count = 0; /* 初期設定 */ x = y = 0; /* 初期位置 */ gotoxy(x, y); printf("@"); for ( ; x >= -WIDTH && x <= WIDTH && y >= -WIDTH && y <= WIDTH; ) { gotoxy(WIDTH + 3, -WIDTH); count++; printf("%d", count); if (rand() % 2 == 0) { dx = 1; dy = 2; } else { dx = 2; dy = 1; } if (rand() % 2 == 0) { dx = -dx; } if (rand() % 2 == 0) { dy = -dy; } x += dx, y += dy; gotoxy(x, y); printf("@"); fflush(stdout); /* 出力フラッシュ */ for (i = 0; i < 10000; i++) { /* 速すぎるとおもしろくないので、時間かせぎのための */ for (j = 0; j < 2000; j++) { /* 空(から)ループ。回る回数を変えれば速度が変わる */ printf(""); } } } gotoxy(WIDTH + 4, -WIDTH - 2); }