Игра крестики нолики на Си с компьютером
В предыдущей статье мы рассмотрели основные процедуры программы игры в крестики нолики на Си
В этой статье мы рассмотрим алгоритм работы компьютера в игре крестики нолики.
Процедура 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;
}
В следующей статье мы приведем пример всей программы на си игры крестики нолики
Поделиться:
Нет комментариев. Ваш будет первым!