Функции в Си. Игра "крестики-нолики" - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста разобраться с назначениями функций, т.е. для чего они:
if (isdigit(*k) && a[CharToPos(*k)])
 
int CheckWin(const char* a)
 
unsigned
fflush(stdin) - я так понял это очистка буфера перед scanf... while (isPlay)

Решение задачи: «Функции в Си. Игра "крестики-нолики"»

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;
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • i, static const int, значение 49
    • Field, статический массив символов, представляющий игровое поле
    • a, массив символов для представления игрового поля
    • k, указатель на текущий символ в массиве Field
    • notUsed, переменная для хранения количества неиспользуемых ячеек в массиве a
    • player, переменная для отслеживания текущего игрока (0 - игрок 1, 1 - игрок 2)
    • k, символ, введенный пользователем
    • isPlay, флаг для контроля процесса игры
  2. Функция PField(): Выводит игровое поле на экран. В данном случае поле представлено статическим массивом символов Field. Если символ в поле уже заполнен (т.е. его значение не равно 0), то на его место выводится символ, введенный пользователем. Если символ в поле еще не заполнен, то на его место выводится символ из массива Field.
  3. Функция SetValue(): Устанавливает значение переданного символа в указанную ячейку массива a. Если ячейка пуста, то в нее записывается переданный символ. Функция возвращает TRUE, если символ был успешно записан, и FALSE в противном случае.
  4. Функция CheckWin(): Проверяет, есть ли в массиве a последовательность из трех одинаковых символов, расположенных в строке или столбце. Если такая последовательность найдена, то функция возвращает TRUE, иначе - FALSE.
  5. Основная функция main(): Создает массив a для представления игрового поля. Изначально все ячейки массива пусты. Запускает цикл игры, в котором пользователи по очереди вводят символы и помещают их в соответствующие ячейки массива a. После каждого хода проверяется, достигнут ли выигрыш, и выводится на экран соответствующее сообщение. Если все ячейки массива заполнены, выводится сообщение об окончании игры.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы