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

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

В предыдущей статье мы рассмотрели основные процедуры программы игры в крестики нолики на Си

В этой статье мы рассмотрим алгоритм  работы компьютера  в игре крестики нолики.  

Процедура hodkomp(n), где n – номер игрока-компьютера.

Сначала мы должны определить за кого играет человек, чтобы в дальнейшем учитывать его ходы и ходить против него.

if (n==1) {nv=2;}

if (n==2) {nv=1;}

Процедура ищет  выигрышный ход, по всем столбцам строкам и диагоналям.

Подробно о работе с мтарицами можно познакомится в уроке Матрицы в Си.

Введем специальную перемнную k, которая фиксирует выбран ли ход компьютера. Если k=0 ход компьютера не выбран, если k=1 ход компьютера выбран. Если не ввести эту перменную, то лучший вариант хода будет замещаться последним вариантом.

// проверяем все столбцы и выбираем оптимальный ход для компьютера

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

{

    if (a[1][i]==n && a[2][i]==n && a[3][i]==0 && k==0) {a[3][i]=n; k=1;}

    if (a[1][i]==0 && a[2][i]==n && a[3][i]==n && k==0) {a[1][i]=n; k=1;}

    if (a[1][i]==n && a[2][i]==0 && a[3][i]==n && k==0) {a[2][i]=n; k=1;}

}

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

{

    if (a[i][1]==n && a[i][2]==n && a[i][3]==0 && k==0) {a[i][3]=n; k=1;}

    if (a[i][1]==0 && a[i][2]==n && a[i][3]==n && k==0) {a[i][1]=n; k=1;}

    if (a[i][1]==n && a[i][2]==0 && a[i][3]==n && k==0) {a[i][2]=n; k=1;}

}

Если выигрышной ситуации не оказалось, процедура пытается заблокировать выигрышные ситуации человека, перебирая все строки и столбцы

// блокируем противника

// проверяем все строки и выбираем оптимальный ход для компьютера

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

{

    if (a[1][i]==nv && a[2][i]==nv && a[3][i]==0 && k==0) {a[3][i]=n; k=1;}

    if (a[1][i]==0 && a[2][i]==nv && a[3][i]==nv && k==0) {a[1][i]=n; k=1;}

    if (a[1][i]==nv && a[2][i]==0 && a[3][i]==nv && k==0) {a[2][i]=n; k=1;}

}

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

{

    if (a[i][1]==nv && a[i][2]==nv && a[i][3]==0 && k==0) {a[i][3]=n; k=1;}

    if (a[i][1]==0 && a[i][2]==nv && a[i][3]==nv && k==0) {a[i][1]=n; k=1;}

    if (a[i][1]==nv && a[i][2]==0 && a[i][3]==nv && k==0) {a[i][2]=n; k=1;}

}

 Если и после этого не выбран ход для компьютера, то выбираем  случайно в свободную клетку. Приоритет отдается центру и угловым клеткам.

Функция proverka().

Процедура проверяет, победил ли какой-нибудь игрок, или нет. Сначала она проверяет все строки, столбцы и диагонали у ноликов,  на предмет их заполнения  ноликами Аналогично для крестиков.i – переменная для цикла. res – переменная, возвращаемая при выполнении функции.

Сначала мы перебираем все строки.

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

    {

        // проверка, все ли в строке нолики

        if (a[i][1]==1 && a[i][2]==1 && a[i][3]==1 ) {res=1;}

    }

Затем переберём все столбцы.

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

    {

        // проверка все ли в столбце нолики

        if (a[1][i]==1 && a[2][i]==1 && a[3][i]==1 ) {res=1;}

    }

Затем переберём все диагонали.

// проверка диагоналей

      if (a[1][1]==1 && a[2][2]==1 && a[3][3]==1 )  {res=1;}

      if (a[1][3]==1 && a[2][2]==1 && a[3][1]==1 )  {res=1;}

 

//------------------ Проверка. Если ни один игрок не выиграл то 0, если выиграл нолик то 1 если выиграл крестик то 2

int proverka()

{   int i;

    int res; // значение функции. Если ни один игрок не выиграл то 0, если выиграл нолик то 1, если выиграл крестик то 2

    res=0;

   // проверям выигрыш первого игрока

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

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

    {

        // проверка  все ли в строке нолики

        if (a[i][1]==1 && a[i][2]==1 && a[i][3]==1 ) {res=1;}

    }

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

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

    {

        // проверка все ли в столбце нолики

        if (a[1][i]==1 && a[2][i]==1 && a[3][i]==1 ) {res=1;}

    }

    // проверка диагоналей

      if (a[1][1]==1 && a[2][2]==1 && a[3][3]==1 )  {res=1;}

      if (a[1][3]==1 && a[2][2]==1 && a[3][1]==1 )  {res=1;}

    

   // проверям выигрыш второго игрока

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

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

    {

    // проверка  все ли встроке крестики

        if (a[i][1]==2 && a[i][2]==2 && a[i][3]==2 ) {res=2;}

    }

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

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

    {

     // проверка все ли в столбце крестики 

        if (a[1][i]==2 && a[2][i]==2 && a[3][i]==2 ) {res=2;}

    }

      // проверка диагоналей

      if (a[1][1]==2 && a[2][2]==2 && a[3][3]==2 )  {res=2;}

      if (a[1][3]==2 && a[2][2]==2 && a[3][1]==2 )  {res=2;} 

      // условие ничьи

      if (a[1][1]*a[1][2]*a[1][3]*a[2][1]*a[2][2]*a[2][3]*a[3][1]*a[3][2]*a[3][3]>0 && res==0){res=3;} 

    return res;

}

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

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

Поделиться:

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

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