/* Tic-Tac-Toe 超簡易版 */ // ver.5 構造体版(上級:記述効率のさらなる改善) #include #include // #define N 3 /* ゲーム盤の静的2次元配列のサイズ */ typedef struct { int size; int *cell; } Board; /* タイトルを表示する関数 */ void Title() { printf("+-----------------------------+\n"); printf("| The Most Simple TIC-TAC-TOE |\n"); printf("+-----------------------------+\n"); printf("\n"); printf(" 位置の指定は行番号y,列番号x の順ね.\n"); printf(" (番号は 0 から数えるよ.)\n"); printf(" 勝敗については自分達で判定すれや.\n"); printf(" 終了するには [Ctrl]+[D].\n"); printf("\n"); } /* 以下のゲーム盤関連の関数群に共通する変数 * bd:ゲーム盤の静的2次元配列 * y, x:ゲーム盤のマスの行番号,列番号 * v:プレーヤ番号 */ void Free(Board *bd) { if (bd == NULL) return; free(bd->cell); free(bd); } Board *New(int n) { Board *bd; bd = (Board *)malloc(sizeof(Board)); if (bd == NULL) return (NULL); bd->size = n; bd->cell = (int *)malloc(sizeof(int)*n*n); if (bd->cell == NULL) { free(bd); return (NULL); } return (bd); } /* ゲーム盤のプレーヤ番号を調べる関数 * return:プレーヤ番号 */ int Get(Board *bd, int y, int x) { if (x < 0) return (-1); /* ハミ出し禁止 */ if (x >= bd->size) return (-1); /* (バッファオーバラン防止) */ if (y < 0) return (-1); if (y >= bd->size) return (-1); return (bd->cell[y*bd->size + x]); } /* ゲーム盤にプレーヤ番号を書き込む関数 */ void Set(Board *bd, int y, int x, int v) { if (x < 0) return; /* ハミ出し禁止 */ if (x >= bd->size) return; /* (バッファ−バラン防止) */ if (y < 0) return; if (y >= bd->size) return; bd->cell[y*bd->size + x] = v; } /* ゲーム盤を初期化する関数 */ void Clear(Board *bd) { int y, x; for (y = 0; y < bd->size; y++) { for (x = 0; x < bd->size; x++) { bd->cell[y*bd->size + x] = 0; } } } /* ゲーム盤を表示する関数 */ void Draw(Board *bd) { int y, x; printf("\n"); for (y = 0; y < bd->size; y++) { for (x = 0; x < bd->size; x++) { printf("%2d", bd->cell[y*bd->size + x]); } printf("\n"); } printf("\n"); } int main(void) { int n; Board *bd; // int bd[N][N]; /* ゲーム盤の静的2次元配列 * 各マスのコマのプレーヤ番号(1 or 2)を記録するよ * 空白のマスはゼロね */ int y, x, player; /* 行番号,列番号,プレーヤ番号(1 or 2) */ Title(); printf("ゲーム盤のサイズ > "); scanf("%d", &n); bd = New(n); if (bd == NULL) goto ERROR; Clear(bd); player = 1; while (1) { Draw(bd); while (1) { printf("%dP の番 > ", player); if (scanf("%d %d", &y, &x) == EOF) goto END; if (Get(bd, y, x) == 0) break; printf("そこには置けません!!\nもう一度 "); } Set(bd, y, x, player); player = player%2 + 1; /* 1→ 2,2→ 1 */ } END: Free(bd); return (0); ERROR: printf("メモリ確保失敗\n"); return (1); }