○×ゲームを作ってみたお。
今どちらも手動入力だからVIPPERに優秀なCOMを作って貰うお。
#include <stdio.h>
enum {
NONE = 0,
CIRCLE,
CROSS,
SYMBOLS
};
const char *symbols[] = {" ", "○", "×"};
const char *number[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
int player(int *board, int turn)
{
int n;
while(printf("%s's turn. Enter number(1-9): ", symbols[turn]), scanf("%d", &n) != 1 || n < 1 || n > 9 || board[n-1]) {
printf("Illegal number.\n");
scanf("%*[^\n]");
}
return (n - 1);
}
void print_board(int *board)
{
int i;
printf("┏━┳━┳━┓\n┃");
for(i = 0; i < 9; i++) {
if(i && !(i % 3)) {
printf("\n┣━╋━╋━┫\n┃");
}
printf("%s┃", board[i] ? symbols[board[i]] : number[i]);
}
printf("\n┗━┻━┻━┛\n");
}
int is_gameover(int *board, int last)
{
int i, cnt;
int line = last/3, column = last%3;
int turn = board[last];
/* 横のチェック*/
for(i = 0, cnt = 0; i < 3; i++) {
if(board[line * 3 + i] == turn && ++cnt == 3) return turn;
}
/* 縦のチェック*/
for(i = 0, cnt = 0; i < 3; i++) {
if(board[i * 3 + column] == turn && ++cnt == 3) return turn;
}
/* 左上->右下チェック*/
for(i = 0, cnt = 0; i < 3; i++) {
if(board[i * 4] == turn && ++cnt == 3) return turn;
}
/* 右上->左下チェック*/
for(i = 0, cnt = 0; i < 3; i++) {
if(board[(i + 1) * 2] == turn && ++cnt == 3) return turn;
}
return -1;
}
int main(int argc, char **argv)
{
int board[9] = {0};
int (*players[])(int*, int) = {player, player};
int i, n, turn = CIRCLE;
for(i = 0; i < 9; i++) {
print_board(board);
board[(n = players[turn-1](board, turn))] = turn;
if(is_gameover(board, n) > 0) {
break;
}
turn ^= (CIRCLE | CROSS); /* 交代*/
}
/* 結果出力 */
print_board(board);
printf("winner: %s\n", (i == 9) ? "none. drawn game." : symbols[turn]);
return 0;
}