Функции в Си. Игра "крестики-нолики" - C (СИ)
Формулировка задачи:
Помогите пожалуйста разобраться с назначениями функций, т.е. для чего они:
fflush(stdin) - я так понял это очистка буфера перед scanf...
while (isPlay)
if (isdigit(*k) && a[CharToPos(*k)]) int CheckWin(const char* a) unsigned
Решение задачи: «Функции в Си. Игра "крестики-нолики"»
textual
Листинг программы
#include <stdio.h> #include <string.h> #define TRUE 1 #define FALSE 0 unsigned CharToPos(char k) { static const int i = 49; return (k - i); } void PField(const char* a) { static const char Field[] = " 1 | 2 | 3 \n" "---+---+---\n" " 4 | 5 | 6 \n" "---+---+---\n" " 7 | 8 | 9 \n"; const char* k = Field; while (*k) { if (id(*k) && a[CharToPos(*k)]) { printf("%c", a[CharToPos(*k)]); } else { printf("%c", *k); } k++; } } int SetValue(char* a, char val, unsigned pos) { int isExecute = FALSE; if (a[pos] == 0) { a[pos] = val; isExecute = TRUE; } return isExecute; } int CheckWin(const char* a) { return (a[0] && (a[0] == a[1]) && (a[1] == a[2])) || (a[3] && (a[3] == a[4]) && (a[4] == a[5])) || (a[6] && (a[6] == a[7]) && (a[7] == a[8])) || (a[0] && (a[0] == a[3]) && (a[3] == a[6])) || (a[1] && (a[1] == a[4]) && (a[4] == a[7])) || (a[2] && (a[2] == a[5]) && (a[5] == a[8])) || (a[0] && (a[0] == a[4]) && (a[4] == a[8])) || (a[2] && (a[2] == a[4]) && (a[4] == a[6])); } //---------------------------------------------// int main() { static const char CVal[] = {'x', 'o'}; char a[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned notUsed = sizeof(a) / sizeof(*a); unsigned player = 0; char k; int isPlay = TRUE; PField(a); while (isPlay) { printf("[%c]: ", CVal[player]); scanf("%c", &k); fflush(stdin); printf("\n"); if (isdigit(k) && SetValue(a, CVal[player], CharToPos(k))) { notUsed--; player = !player; } PField(a); if (CheckWin(a)) { isPlay = FALSE; printf("Player '%c' is win!\n", CVal[!player]); } else if (notUsed == 0) { isPlay = FALSE; printf("Game over\n"); } } return 0; }
Объяснение кода листинга программы
- Объявление переменных:
- i, static const int, значение 49
- Field, статический массив символов, представляющий игровое поле
- a, массив символов для представления игрового поля
- k, указатель на текущий символ в массиве Field
- notUsed, переменная для хранения количества неиспользуемых ячеек в массиве a
- player, переменная для отслеживания текущего игрока (0 - игрок 1, 1 - игрок 2)
- k, символ, введенный пользователем
- isPlay, флаг для контроля процесса игры
- Функция PField(): Выводит игровое поле на экран. В данном случае поле представлено статическим массивом символов Field. Если символ в поле уже заполнен (т.е. его значение не равно 0), то на его место выводится символ, введенный пользователем. Если символ в поле еще не заполнен, то на его место выводится символ из массива Field.
- Функция SetValue(): Устанавливает значение переданного символа в указанную ячейку массива a. Если ячейка пуста, то в нее записывается переданный символ. Функция возвращает TRUE, если символ был успешно записан, и FALSE в противном случае.
- Функция CheckWin(): Проверяет, есть ли в массиве a последовательность из трех одинаковых символов, расположенных в строке или столбце. Если такая последовательность найдена, то функция возвращает TRUE, иначе - FALSE.
- Основная функция main(): Создает массив a для представления игрового поля. Изначально все ячейки массива пусты. Запускает цикл игры, в котором пользователи по очереди вводят символы и помещают их в соответствующие ячейки массива a. После каждого хода проверяется, достигнут ли выигрыш, и выводится на экран соответствующее сообщение. Если все ячейки массива заполнены, выводится сообщение об окончании игры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д