Игра крестики нолики на Си описание

7 декабря 2018 - Администратор

В предыдущей статье был рассмотрен алгоритм игры крестики нолики на Си с компьютером. В этой статье  мы рассмотрим описание процедур , которые используются в программе игра крестик и нолики с компьютером на си .

Процедура nul().

Процедура должна очищать поле для новой игры, то есть, процедура должна убирать со всех клеток ходы игроков.В процедуре исполняются два цикла, один из которых вложен в другой. В данном случае с полем 3×3 клетки, на каждое значение строки i есть по три значения столбца j.Сначала выбираем 1-ую строку, для значения этой строки последовательно выбираем 1-ый, 2-ой и 3-ий столбцы.Аналогично  два оставшихся вложенных цикла for исполняются и для 2-ой, и для 3-ей строки.i, j – переменные для циклов. В этой процедуре они представляют номер строки и столбца каждой клетки.Здесь первый for перебирает все строки на игровом поле, вложенный в него for для каждого значения строки выбирает все значения поля. Все клетки очищаются из-за того, что во вложенном цикле мы вставили строку a[i][j] = 0; - это равносильно тому, что для каждой клетки со строкой i и столбцом j мы очищаем эту клетку. Подробно о работе с мтарицами можно познакомится в уроке Матрицы в Си.

 

void nul()

{ int i,j;

//  пробегаем по всем строкам

 for(i=1; i<=3; i++)

 {

// пробегаем по всем столбцам

  for (j=1;j<=3;j++)

  {

      a[i][j]=0;

  }  

 }

}

схема процедуры

 

Процедура visual()

Процедура должна с помощью текста рисовать поле с уже сделанными ходами на данный момент.Сначала мы нарисуем шапку нашего поля, в ней будут находиться номера столбцов. В начале глобального цикла мы будем печатать номер выделенной циклом строки.В глобальном цикле мы запустим ещё один вложенный  цикл, в котором будем проверять все клетки в строке на наличие или отсутствие хода. Вся информация хранится в матрице Если значение клетки матрицы  0 – на неё не был сделан ход, если 1 – туда был сделан ход ноликами, 2 – крестиками. В итоге, если значение клетки 0 – печатаем только стенку и делаем пробел, 1 – печатаем стену и нолик, 2 – стену и крестик. В конце каждой строки мы делаем переход на новую строку и рисуем линию , разделяющую строки и делаем переход на новую строку, чтобы напечатать новую строку игрового поля.i, j – переменные для цикла, но в этой процедуре их значение определяет номер строки и столбца выбранной клетки.

//------------------ вывод  поля на экран

void visual()

{

int i,j;

printf ("  1 2 3\n ");

//  пробегаем по всем строкам  

 for(i=1; i<=3; i++)

 {

  printf ("%d", i);  

// пробегаем по всем столбцам      

  for (j=1;j<=3;j++)

  {   

      if (a[i][j]==0){printf("| ");};

      if (a[i][j]==1){printf("|O");};

      if (a[i][j]==2){printf("|X");};

  }

// переходим на следующую строку 

  printf ("|\n");   

  printf ("________\n");   

 }      

 }

Процедура hod(n), где n – номер игрока, который делает ход. Если n = 1, играют нолики, если 2 – крестики. Процедура запрашивает номер строки и столбца клетки, на которую хочет сходить игрок. Процедура, проверяет корректность ввода игрока, если ввод неправильный, программа опять запрашивает ввод. Если ввод прошёл проверку, на выбранную клетку делается ход при условии, что клетка  свободна.

  hi – переменная для хранения ввода, сделанного игроком. С помощью неё получаются переменные str и sto.

str, sto - номер строки и столбца.

ver – переменная-флаг, в которой хранится, правилен ли ввод, или нет.

 Сначала обнуляем ver, чтобы цикл while исполнялся, пока не будет получен правильный ввод. Он должен быть введён без пробелов и знаков между номером строки и столбца. Из этого выводим, что номер строки – цифра десятков полученного числа, а цифра единиц – номер столбца. Для получения цифры единицы делим ввод с остатком на 10, после этого цифра единиц будет остатком, а цифра десятков исчезнет, запишем получившееся число в переменную sto. Чтобы получить цифру десятков, из ввода вычтем получившийся остаток и поделим на 10, цифра десятков останется, а цифра единиц исчезнет, запишем получившееся число в переменную str. После получения номера строки и столбца мы проверим корректность ввода. В  условии записаны все возможные варианты ввода. Если ввод игрока не равен никакому допустимому варианту из условия, тогда цикл while будет исполняться заново. Если же ввод корректен, в зависимости от номера игрока делаем соответствующий ход.

 

//------------------------------------ Ход игрока n - номер игрока 

void hod (int n)

{

int hi;// ход игрока

int sto; //  номер столбца в ходе

int str; // номер строки в ходе

int ver; // проверка на корректность хода если нельзя такой ход то 0 , если можно то 1

ver=0;

// запрашиваем ход,  пока не будет введен корректный ход

while (ver==0)

{

// ввод хода

printf ("Ваш ход. Введите номер строки и столбца. ");  

scanf("%d", &hi);

// определяем номер столбца - это последняя цифра в ходе

sto=hi%10;

// определяем номер строки хода - это первая цифра

str=(hi-sto)/10;

// проверка корректности хода, клетка должна быть пуста и номер должен быть один из номеров таблицы 3 на 3

if (a[str][sto]==0 && (hi==11 || hi==12 || hi==13 || hi==21 || hi==22 || hi==23 || hi==31 || hi==32 || hi==33 )) (ver=1);

}

// если  ходил игрок 1  то поле хода  1

if ( n==1) {a[str][sto]=1;}

if ( n==2) {a[str][sto]=2;}

 }

В следующей статье мы расмотрим процедуры ход компьютера и проверки.

Вернуться к содержанию

 
Комментарии (0)

Нет комментариев. Ваш будет первым!