Вместо двух независимых values
и memory
используйте массив enum
для представления игровой карты.
enum Square { VACANT, X, O } squares[3][3], move = X;
Инициализируется согласно Инициализация статических переменных в C .
Возможно, вам нужна функция, чтобы определить, выиграл ли игрок,
/* Checks if the player who's move it was won. */
static int is_win(void) {
return (squares[0][0]==move && squares[0][1]==move && squares[0][2]==move)||
(squares[1][0]==move && squares[1][1]==move && squares[1][2]==move)||
(squares[2][0]==move && squares[2][1]==move && squares[2][2]==move);
/* Etc. */
}
А также функция печати на плате
static const char letters[] = { '/', 'X', 'O' };
static void print_board(void) {
printf("%c %c %c\n%c %c %c\n%c %c %c\n",
letters[squares[0][0]], letters[squares[0][1]], letters[squares[0][2]],
letters[squares[1][0]], letters[squares[1][1]], letters[squares[1][2]],
letters[squares[2][0]], letters[squares[2][1]], letters[squares[2][2]]);
}
Код, который у вас есть, затеняет глобальное состояние с помощью параметров функций. Это очень запутанно. Подумайте, нужен ли вам параметр для работы функции. Когда у вас сложные состояния, которые определены в нескольких файлах, вероятно, лучше всего иметь игровой объект с агломерацией, но для простых игр я думаю, что хорошо иметь глобальное состояние.
Вместо того, чтобы играть до 7 ходов, используйте простой конечный автомат, чтобы отслеживать состояние игры. Можно typedef
функции ( Как работают указатели функций в C? ) player
и opponent
и помещать их в статический массив, чтобы значительно упростить игровой цикл. Рассмотрим,
/* Move returns whether we should continue. */
typedef int (*Move)(void);
/* Implements Move. */
static int player(void) {
printf("player:\n");
/* FIXME: player move. */
return is_win() ? 0 : (move = O, 1);
}
/* Implements Move. */
static int opponent(void) {
printf("opp:\n");
/* FIXME: Chose randomly from all of it's allowed moves? */
return is_win() ? 0 : (move = X, 1);
}
static const Move states[] = { 0, &player, &opponent };
Тогда твой главный просто,
int main(void) {
while(states[move]()) print_board();
printf("%c wins.\n", letters[move]);
return 0;
}
Редактировать: Определенно есть состояние, где это ничья, возможно, когда не осталось ходов.