Функции в Си. Игра "крестики-нолики" - 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. После каждого хода проверяется, достигнут ли выигрыш, и выводится на экран соответствующее сообщение. Если все ячейки массива заполнены, выводится сообщение об окончании игры.