Я бы создал функцию, единственной задачей которой было напечатать доску, как это (не проверено):
void board_print(const char b[3][3]) }
int i = 1;
printf( " A B C\n"); // NOTE: Letters on top, like a spreadsheet
while (1) {
printf( "%i %c | %c | %c\n", i, b[i][0], b[i][1], b[i][2]);
if (++i <=3) {
printf( " ---+---+---\n");
} else {
break;
}
}
}
А затем создайте доску, подобную этой:
int main(void) {
char board[3][3] =
{{ ' ', ' ', ' ' },
{ ' ', ' ', ' ' },
{ ' ', ' ', ' ' }};
while (1) {
board_print(board);
printf("Place X at : ");
Тогда я бы создал другую функцию, вся задача которой - попытаться поместить X или O в позицию:
int board_place (char char [3] [3], маркер char, строка char, столбец char);
marker
здесь будет либо «x», либо «o».
board_place
может возвращать значение, которое вы можете использовать для определения общего состояния игры. Например, если board_place не может сделать перемещение, потому что в этой позиции уже есть маркер, он должен вернуть отдельный код ошибки, если строка находится вне диапазона. Это также может быть в том случае, если вы определяете, есть ли победитель (потому что текущий ход будет выигрышным (легко, поскольку вам нужно только проверить линии, в том числе текущий квадрат)), или если доска заполнена без победителя и возврата отдельные вещи для каждого из них.
Тогда ваш основной код просто решает, что делать, основываясь на возвращаемом значении board_place (выдайте сообщение об ошибке пользователю и запросите другую позицию, попробуйте сделать ход за O, поздравьте пользователя с победой, сообщите пользователю что этот кот выиграл, ...).
Что касается чтения в позиции, то здесь пользовательский интерфейс встречается с обработкой текста. Простого scanf
вызова может быть достаточно, или, может быть, всего несколько вызовов getchar. Я предлагаю вам по-разному индексировать строки и столбцы (я использовал буквы и цифры), потому что это, вероятно, будет проще для большинства людей. Затем вы можете либо настроить до board_place
, либо просто выполнить настройку индексов внутри board_place.