Разработка программы для реализации консольной игры "Крестики-нолики"

Разработка функции проверки игрока и искусственного интеллекта на победу в консольной игре "Крестики-нолики". Анализ основных элементов интерфейса программного приложения. Достоинства языка Си как универсального метода системного программирования.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.02.2019
Размер файла 46,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Введение

Си - универсальный язык программирования. Он тесно связан с системой UNIX, так как был разработан в этой системе, которая как и большинство программ, работающих в ней, написаны на Си. Однако язык не привязан жестко к какой - то одной операционной системе или машине. Хотя он и назван "языком системного программирования", поскольку удобен для написания компиляторов и операционных систем, оказалось, что на нем столь же хорошо писать большие программы другого профиля.

Си - язык сравнительно "низкого уровня". Однако это вовсе не умаляет его достоинств, просто Си имеет дело с теми же объектами, что и большинство компьютеров, т. е. с символами, числами и адресами. С ними, можно оперировать при помощи арифметических и логических операций, выполняемых реальными машинами.

В продолжение сказанного следует отметить, что Си предоставляет средства лишь последовательного управления ходом вычислений: механизм ветвления по условиям, циклы, составные инструкции, подпрограммы - и не содержит средств мультипрограммирования, параллельных процессов, синхронизации и организации сопрограмм.

Курсовая работа является примером использования языка Си.

1. Правила игры

"Крестики - нолики" - логическая игра между двумя противниками на квадратном поле 10 на 10 клеток. Один из игроков играет "крестиками", второй -- "ноликами". Первый ход делает игрок, ставящий крестики. Выигрывает тот, кто быстрее подряд по горизонтали, вертикали или диагонали расположит пять своих фигур.

2. Реализация программного кода с комментариями

программный консольный интерфейс игрок

В программе используются библиотеки:

#include <stdio.h> // библиотека ввода-вывода

#include <stdlib.h> // библиотека функций общего назначения

#include <time.h> // библиотека, содержащая типы и функции для работы с датой и временем

В начале кода игры приведены различные функции для упрощения реализации работы.

Функция, которая печатает на экран текущее состояние игрового поля:

void print()

{

int i,j,k,b=-1;

printf(" 0 1 2 3 4 5 6 7 8 9\n");

printf(" _____________________\n");

for(i=0;i<10;i++)

{

for(k=0;k<1;k++)

{

b=b+1;

printf("%2i",b);

}

for(j=0;j<10;j++)

{

printf("|");

if (a[i][j] == 1)

printf("X");

else if(a[i][j] == -1)

printf("O");

else printf(" ");

}

printf("|\n _____________________\n");

}

Функция проверки корректности вводимых данных игроком при ходе:

int proverka_koordinat_chisla(int i,int j)

{

if(i<0 || i>9 || j<0 || j>9 || a[i][j]==1 || a[i][j]==-1 )

return 1;

else

return 0;

}

Функция проверки игрока и искусственного интеллекта на победу:

int proverka(int r)

{

int i,j,z,k;

int x=0;

for(j=0;j<10;j++)//цикл проверки вертикалей

{

for(i=0;i<10;i++)

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)//цикл проверки горизонталей

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

i=0,j=0;

for(z=0;z<10;z++)//цикл проверки всех диагоналей слева направо

{

for(k=0;k<10;k++)

{

for(i=z, j=k; i<10, j<10; i++, j++)

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

}

i=0,j=0;

for(z=0;z<10;z++)//цикл проверки всех диагоналей справа налево

{

for(k=9;k>=0;k--)

{

for(i=z,j=k;i<10,j>=0;i++,j--)

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

}

}

Функция проверки ничьи для игроков и искусственного интеллекта:

int nichya()

{

int c=0,i,j;

for(i=0;i<10;i++)//цикл проходящий все элементы массива

{

for(j=0;j<10;j++)

{

if(a[i][j]!=0)

c++;

else

c=0;

if(c==100)

return 1;

else

return 0;

}

}

}

Функция хода искусственного интеллекта рандомом:

int rand_step_computer(int i, int j, int r1)

{

int z,k,p,x,y;

for(z=0;z<10;z++)//цикл на проверку присутствия в массиве пустого индекса

{

for(k=0;k<10;k++)

{

if(a[z][k]==0)

p++;

}

}

if(p>0)//если пустой индекс есть, то выполняется рандомный ход {

srand(time(NULL));//изменение рандомного числа с течением времени

x=rand()%9+0;//9-максимальное значение, 0-минимальное

y=rand()%9+0;//9-максимальное значение, 0-минимальное

if(a[x][y]==0)//если рандомные x и y не равны i и j, и индекс массива равен нулю, то выполняется ход с координатами x и y

a[x][y]=r1;//ход компьютера

else if(a[x][y]!=0)//если рандомные x и y указывают на индекс массива не равный нулю, то производиться рандомный ход, пока не будет найдей нулевой индекс массива

{

while(a[x][y]!=0)//цикл, реализующий поиск пустого индекса массива

{

srand(time(NULL));

x=rand()%9+0;

y=rand()%9+0;

}

a[x][y]=r1;//ход компьютера

}

}

}

Функция реализации хода искусственного интеллекта, блокирующего игрока:

int step_computer(int r, int r1)

{

int z=0,k=0,l=0,i=0,j=0,m;

for(z=0;z<10;z++)//цикл на подсчет количества X по горизонтали и выполнения блокировки хода

{

for(k=0;k<10;k++)

{

if (a[z][k]==r)

l++;

else

l=0;

if(l==3 && a[z][k+1]==0 && k+1<=9)

{

a[z][k+1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[z][k-3]==0 && k-3>=0)

{

a[z][k-3]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z][k+1]==0 && k+1<=9)

{

a[z][k+1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z][k-4]==0 && k-4>=0)

{

a[z][k-3]=r1;

m=1;

return 1;

}

}

}

for(k=0;k<10;k++)//цикл на подсчет количества Х по вертикали

{

for(z=0;z<10;z++)

{

if(a[z][k]==r)

l++;

else

l=0;

if(m!=1 && l==3 && a[z+1][k]==0 && z+1<=9)

{

a[z+1][k]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[z-3][k]==0 && z-3>=0)

{

a[z-3][k]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z+1][k]==0 && z+1<=9)

{

a[z+1][k]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z-4][k]==0 && z-4>=0)

{

a[z-4][k]=r1;

m=1;

return 1;

}

}

}

for(k=0;k<10;k++)//на подсчет количества Х по диагонали слева направо

{

for(z=0;z<10;z++)

{

for(i=z,j=k;i<10,j<10;i++,j++)

{

if(a[i][j]==r)

l++;

else

l=0;

if(m!=1 && l==3 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)

{

a[i+1][j+1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[i-3][j-3]==0 && i-3>=0 && j-3>=0)

{

a[i-3][j-3]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i-4][j-4]==0 && i-4>=0 && j-4>=0)

{

a[i-4][j-4]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)

{

a[i+1][j+1]=r1;

m=1;

return 1;

}

}

}

}

for(z=0;z<10;z++)//проверка всех диагоналей справа налево

{

for(k=9;k>=0;k--)

{

for(i=z,j=k;i<10,j>=0;i++,j--)

{

if(a[i][j]==r)

l++;

else

l=0;

if(m!=1 && l==3 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)

{

a[i+1][j-1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[i-3][j+3]==0 && i-3>=0 && j+3<=9)

{

a[i-3][j+3]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)

{

a[i+1][j-1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i-4][j+4]==0 && i-4>=0 && j+4<=9)

{

a[i-4][j+4]=r1;

m=1;

return 1;

}

}

}

}

}

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

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

void game_player()

{

int i,j;//введенные координаты

int c=0,x,m,p,r;

printf("\nПервым ходит Х:\n");

for(;p!=1;c++)//основной цикл, работающий пока до тех пор, пока кто-то не победит или не будет ничья

{

printf("\nВведите координаты от 0 до 9, через Enter:\n");

m=scanf("%i %i", &i, &j);// ввод координат; m==2, если i и j целые положительные числа, иначе m==1

while(getchar()!='\n');//проверка на ввод символа

if(m==2)

{

if(proverka_koordinat_chisla(i,j) == 1)//проверка ввода координат

{

if(c%2==0 || c%2!=0)

c++;//сохранение хода игрока

printf("\nДопущенна ошибка при вводе координат! Исправьте и попробуйте еще раз;)\n");

}

else

{

if(c%2==0)

r=1;

else r=-1;

if(c%2==0)//ход первого игрока

{

a[i][j]=r;

printf("Ход первого игрока:\n");

print();//функция печати игрового поля

if(proverka(r)==1)//проверка на победу первого игрока

{

printf("Первый игрок одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

else

{

if(c%2==0)

r=1;

else r=-1;

a[i][j]=r;//ход второго игрока

printf("Ход второго игрока:\n");

print();//функция печати игрового поля

if(proverka(r)==1)//проверка на победу второго игрока

{

printf("Второй игрок одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

if(nichya()==1)//проверка на ничью

{

printf("Ничья!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

}

else

{

printf("\nДопущенна ошибка при вводе координат! Исправьте и попробуйте еще раз;)\n");//если игрок ввел символ, а не число

c++;//для сохранение хода

}

}

}

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

void computer_game()

{

int i,j;//координаты игрока

int c,m,p,r,v,r1;

for(;p!=1;)

{

printf("\nИгрок должен выбрать, кто ходит первым, он или компьютер. Если он, то нажать 1, если компьютер, то 2.\n");

v=scanf("%i", &m);//если v положительное и целое число, то v==1

while(getchar()!='\n');//проверка на ввод символа

if(v==1)//условие верности в веденого игроком выбора за кем первый ход

{

if(m==1 || m==2)//если m==1, игрок ходит первым, иначе искусственный интеллект

{

if(m==1)

{

c=0;

r=1;//r=1 - "крестик"

r1=-1;//r1=-1 - "нолик"

}

if(m==2)

{

c=1;

r=-1;//r=-1 - "нолик"

r1=1;//r1=1 - "крестик"

}

for(;p!=1;c++)

{

if(c%2==0)//ход игрока

{

printf("\nВведите координаты от 0 до 9, через Enter:\n");

m=scanf("%i %i", &i, &j);// ввод координат; m==2, если i и j целые положительные числа, иначе m==1

while(getchar()!='\n');//проверка на ввод символа

if(m==2)

{

if(proverka_koordinat_chisla(i,j) == 1)//проверка ввода координат

{

c++;//сохранение хода игрока

printf("\nДопущенна ошибка при вводе координат! Исправьте и попробуйте еще раз;)\n");

}

if(proverka_koordinat_chisla(i,j) == 0)

{

a[i][j]=r;

printf("\nХод игрока:\n");

print();//функция печати игрового поля

}

if(proverka(r)==1)//проверка на победу игрока

{

printf("\nИгрок одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

else

{

printf("\nВы ввели неправильно!\n");

c++;//сохранение хода

}

}

else if(c%2!=0)//ход искусственного интеллекта

{

if(step_computer(r,r1)==1)//проверка на выбор блокировки игрока или рандомного хода искусственного интеллекта

{

step_computer(r,r1);

print();//функция печати игрового поля

}

else

{

rand_step_computer(i, j, r1);//ход второго игрока

printf("\nХод искусственного интеллекта:\n");

print();//функция печати игрового поля

}

if(proverka(r1)==1)//проверка на победу искусственного интеллекта

{

printf("\nИскусственный интелект одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

if(nichya()==1)//проверка на ничью

{

printf("\nНичья!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

}

else printf("\nВы ввели неправильно!\n");

}

else printf("\nВы ввели неправильно!\n");

}

}

3. Инструкция пользователя

При запуски игры игрок попадает в главное меню. Игроку предлагают выбрать режим игры и прочитать правила.

Рисунок 1 - Главное меню игры

При выборе режима игры "Игра с компьютером" выводится сообщение, где игроку предоставляется возможность выбора за кем первый ход. В режиме "Игрок против игрока" ход осуществляется по правилам игры - "крестиком"

Рисунок 2 - Начало игры с компьютером: выбор хода

При ходе игрока выводиться сообщение о вводе координат.

Рисунок 3 - Ввод координат

После чего они отображаются на выведенном игровом поле.

Рисунок 4 - Игровой процесс

Игрок с игроком или с компьютером ходят по очереди, стараясь составить комбинацию из 5 своих фишек по вертикали, горизонтали и диагонали.

Рисунок 5 - Игровой процесс

При достижении терминального состояния (победа игрока, компьютера или ничья) на экран выводится соответствующее сообщение.

Рисунок 6 - Сообщение о конце игры

При вводе некорректных данных выводится сообщение об ошибки.

Рисунок 7 - Сообщение об ошибки

Заключение

Во время выполнения курсовой работы были изучены принципы программирования на языке Си, были освоены основные концепции и стратегии по созданию консольного приложения «Крестики - нолики», которое является результатом выполнения курсовой работы.

Литература

1. Керниган Б. Язык программирования Си 2-е издание / Б. Керниган Д. Ричи М.: Издательский дом "Вильямс", 2012. 272 с.

2. Википедия. Свободная энциклопедия [Электронный ресурс] / Режим доступа: https:// ru.wikipedia.org/wiki/Крестики-нолики

3. Википедия. Свободная энциклопедия [Электронный ресурс] / Режим доступа: https://ru.wikipedia.org/wiki/Си_(язык_программирования)

4. Tproger. Информационный портал [Электронный ресурс] / Режим доступа: https://tproger.ru/translations/tic-tac-toe-minimax/

Приложение

#include <stdio.h>//библиотека ввода-вывода

#include<stdlib.h>//библиотека функций общего назначения

#include<time.h>//библиотека, содержащая типы и функции для работы с датой и временем

int a[10][10]={{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0}};//двумерный массив, в котором хранится текущее состояние игрового поля

void print()//функция печати игрового поля

{

int i,j,k,b=-1;

printf(" 0 1 2 3 4 5 6 7 8 9\n");

printf(" _____________________\n");

for(i=0;i<10;i++)

{

for(k=0;k<1;k++)

{

b=b+1;

printf("%2i",b);

}

for(j=0;j<10;j++)

{

printf("|");

if (a[i][j] == 1)

printf("X");

else if(a[i][j] == -1)

printf("O");

else printf(" ");

}

printf("|\n _____________________\n");

}

int proverka_koordinat_chisla(int i,int j) //Функция проверки ввода данных при ходе игрока{

if(i<0 || i>9 || j<0 || j>9 || a[i][j]==1 || a[i][j]==-1 )

return 1;

else

return 0;

}

int proverka(int r) //Функция проверки игрока и искусственного интеллекта на победу

{

int i,j,z,k;

int x=0;

for(j=0;j<10;j++)//цикл проверки вертикалей

{

for(i=0;i<10;i++)

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)//цикл проверки горизонталей

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

i=0,j=0;

for(z=0;z<10;z++)//цикл проверки всех диагоналей слева направо

{

for(k=0;k<10;k++)

{

for(i=z, j=k; i<10, j<10; i++, j++)

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

}

i=0,j=0;

for(z=0;z<10;z++)//цикл проверки всех диагоналей справа налево

{

for(k=9;k>=0;k--)

{

for(i=z,j=k;i<10,j>=0;i++,j--)

{

if(a[i][j]==r)

x++;

else

x=0;

if(x==5)

return 1;

}

}

}

}

int nichya()

{

int c=0,i,j;

for(i=0;i<10;i++)//цикл проходящий все элементы массива

{

for(j=0;j<10;j++)

{

if(a[i][j]!=0)

c++;

else

c=0;

if(c==100)

return 1;

else

return 0;

}

}

}

void game_player()//функция игры на двоих

{

int i,j;//введенные координаты

int c=0,x,m,p,r;

printf("\nПервым ходит Х:\n");

for(;p!=1;c++)//основной цикл, работающий пока до тех пор, пока кто-то не победит или не будет ничья

{

printf("\nВведите координаты от 0 до 9, через Enter:\n");

m=scanf("%i %i", &i, &j);// ввод координат; m==2, если i и j целые положительные числа, иначе m==1

while(getchar()!='\n');//проверка на ввод символа

if(m==2)

{

if(proverka_koordinat_chisla(i,j) == 1)//проверка ввода координат

{

if(c%2==0 || c%2!=0)

c++;//сохранение хода игрока

printf("\nДопущенна ошибка при вводе координат! Исправьте и попробуйте еще раз;)\n");

}

else

{

if(c%2==0)

r=1;

else r=-1;

if(c%2==0)//ход первого игрока

{

a[i][j]=r;

printf("Ход первого игрока:\n");

print();//функция печати игрового поля

if(proverka(r)==1)//проверка на победу первого игрока

{

printf("Первый игрок одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

else

{

if(c%2==0)

r=1;

else r=-1;

a[i][j]=r;//ход второго игрока

printf("Ход второго игрока:\n");

print();//функция печати игрового поля

if(proverka(r)==1)//проверка на победу второго игрока

{

printf("Второй игрок одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

if(nichya()==1)//проверка на ничью

{

printf("Ничья!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

}

else

{

printf("\nДопущенна ошибка при вводе координат! Исправьте и попробуйте еще раз;)\n");//если игрок ввел символ, а не число

c++;//для сохранение хода

}

}

int rand_step_computer(int i, int j, int r1)//функция рандомного хода компьютера

{

int z,k,p,x,y;

for(z=0;z<10;z++)//цикл на проверку присутствия в массиве пустого индекса

{

for(k=0;k<10;k++)

{

if(a[z][k]==0)

p++;

}

}

if(p>0)//если пустой индекс есть, то выполняется рандомный ход {

srand(time(NULL));//изменение рандомного числа с течением времени

x=rand()%9+0;//9-максимальное значение, 0-минимальное

y=rand()%9+0;//9-максимальное значение, 0-минимальное

if(a[x][y]==0)//если рандомные x и y не равны i и j, и индекс массива равен нулю, то выполняется ход с координатами x и y

a[x][y]=r1;//ход компьютера

else if(a[x][y]!=0)//если рандомные x и y указывают на индекс

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

{

while(a[x][y]!=0)//цикл, реализующий поиск пустого индекса массива

{

srand(time(NULL));

x=rand()%9+0;

y=rand()%9+0;

}

a[x][y]=r1;//ход компьютера

}

}

}

int step_computer(int r, int r1) //функция реализации хода компьютера, блокирующего игрока

{

int z=0,k=0,l=0,i=0,j=0,m;

for(z=0;z<10;z++)//цикл на подсчет количества X по горизонтали и выполнения блокировки хода

{

for(k=0;k<10;k++)

{

if (a[z][k]==r)

l++;

else

l=0;

if(l==3 && a[z][k+1]==0 && k+1<=9)

{

a[z][k+1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[z][k-3]==0 && k-3>=0)

{

a[z][k-3]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z][k+1]==0 && k+1<=9)

{

a[z][k+1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z][k-4]==0 && k-4>=0)

{

a[z][k-3]=r1;

m=1;

return 1;

}

}

}

for(k=0;k<10;k++)//цикл на подсчет количества Х по вертикали

{

for(z=0;z<10;z++)

{

if(a[z][k]==r)

l++;

else

l=0;

if(m!=1 && l==3 && a[z+1][k]==0 && z+1<=9)

{

a[z+1][k]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[z-3][k]==0 && z-3>=0)

{

a[z-3][k]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z+1][k]==0 && z+1<=9)

{

a[z+1][k]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[z-4][k]==0 && z-4>=0)

{

a[z-4][k]=r1;

m=1;

return 1;

}

}

}

for(k=0;k<10;k++)//на подсчет количества Х по диагонали слева направо

{

for(z=0;z<10;z++)

{

for(i=z,j=k;i<10,j<10;i++,j++)

{

if(a[i][j]==r)

l++;

else

l=0;

if(m!=1 && l==3 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)

{

a[i+1][j+1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[i-3][j-3]==0 && i-3>=0 && j-3>=0)

{

a[i-3][j-3]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i-4][j-4]==0 && i-4>=0 && j-4>=0)

{

a[i-4][j-4]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)

{

a[i+1][j+1]=r1;

m=1;

return 1;

}

}

}

}

for(z=0;z<10;z++)//проверка всех диагоналей справа налево

{

for(k=9;k>=0;k--)

{

for(i=z,j=k;i<10,j>=0;i++,j--)

{

if(a[i][j]==r)

l++;

else

l=0;

if(m!=1 && l==3 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)

{

a[i+1][j-1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==3 && a[i-3][j+3]==0 && i-3>=0 && j+3<=9)

{

a[i-3][j+3]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)

{

a[i+1][j-1]=r1;

m=1;

return 1;

}

else if(m!=1 && l==4 && a[i-4][j+4]==0 && i-4>=0 && j+4<=9)

{

a[i-4][j+4]=r1;

m=1;

return 1;

}

}

}

}

}

void computer_game()//функция игры с компьютером

{

int i,j;//координаты игрока

int c,m,p,r,v,r1;

for(;p!=1;)

{

printf("\nИгрок должен выбрать, кто ходит первым, он или компьютер. Если он, то нажать 1, если компьютер, то 2.\n");

v=scanf("%i", &m);//если v положительное и целое число, то v==1

while(getchar()!='\n');//проверка на ввод символа

if(v==1)//условие верности в веденого игроком выбора за кем первый ход

{

if(m==1 || m==2)//если m==1, игрок ходит первым, иначе искусственный интеллект

{

if(m==1)

{

c=0;

r=1;//r=1 - "крестик"

r1=-1;//r1=-1 - "нолик"

}

if(m==2)

{

c=1;

r=-1;//r=-1 - "нолик"

r1=1;//r1=1 - "крестик"

}

for(;p!=1;c++)

{

if(c%2==0)//ход игрока

{

printf("\nВведите координаты от 0 до 9, через Enter:\n");

m=scanf("%i %i", &i, &j);// ввод координат; m==2, если i и j целые положительные числа, иначе m==1

while(getchar()!='\n');//проверка на ввод символа

if(m==2)

{

if(proverka_koordinat_chisla(i,j) == 1)//проверка ввода координат

{

c++;//сохранение хода игрока

printf("\nДопущенна ошибка при вводе координат! Исправьте и попробуйте еще раз;)\n");

}

if(proverka_koordinat_chisla(i,j) == 0)

{

a[i][j]=r;

printf("\nХод игрока:\n");

print();//функция печати игрового поля

}

if(proverka(r)==1)//проверка на победу игрока

{

printf("\nИгрок одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

else

{

printf("\nВы ввели неправильно!\n");

c++;//сохранение хода

}

}

else if(c%2!=0)//ход искусственного интеллекта

{

if(step_computer(r,r1)==1)//проверка на выбор блокировки игрока или рандомного хода искусственного интеллекта

{

step_computer(r,r1);

print();//функция печати игрового поля

}

else

{

rand_step_computer(i, j, r1);//ход второго игрока

printf("\nХод искусственного интеллекта:\n");

print();//функция печати игрового поля

}

if(proverka(r1)==1)//проверка на победу искусственного интеллекта

{

printf("\nИскусственный интелект одержал победу!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

if(nichya()==1)//проверка на ничью

{

printf("\nНичья!\n");

p=1;

break;//в случае победы - выход из цикла

}

}

}

else printf("\nВы ввели неправильно!\n");

}

else printf("\nВы ввели неправильно!\n");

}

}

void main()//основная функция игры

{

int x,m;

printf("Привет! Добро пожаловать в игру Крестики - нолики!\n");

for(;m!=1;)

{

printf("\nВыберете режим игры:\n");

printf("1 - Игра с компьютером.\n");

printf("2 - Игрок против игрока.\n");

printf("3 - Правила.\n");

printf("4 - Выход.\n");

m=scanf("%i", &x);

while(getchar()!='\n');

if(m==1)

{

if(x==1)

{

computer_game();//функция игры: игрок против искусственного интеллекта

break;

}

if(x==2)

{

game_player();//функция игры: игрок против игрока

break;

}

if(x==3)//инструкция к игре

{

printf("\nКрестики - нолики - логическая игра между двумя противниками на квадратном поле 10 на 10 клеток. Один из игроков играет <крестиками>, второй - <ноликами>. Первый ход делает игрок, ставящий крестики. Цель игры - расположить раньше противника подряд по горизонтали, вертикали или диагонали пять своих фигур.\n");

m=2;

}

if(x==4)//выход из меню игры

break;

if(x!=1 && x!=2 && x!=3 && x!=4)

{

m=2;

printf("\nВы ввели неправильно!\n");

}

}

else printf("\nВы ввели неправильно!\n");

}

}

Размещено на Allbest.ru

...

Подобные документы

  • Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.

    контрольная работа [380,0 K], добавлен 28.04.2014

  • Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.

    курсовая работа [74,6 K], добавлен 20.12.2009

  • Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.

    курсовая работа [235,8 K], добавлен 05.12.2009

  • Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.

    курсовая работа [34,6 K], добавлен 19.05.2014

  • Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

    курсовая работа [821,5 K], добавлен 13.02.2012

  • Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.

    курсовая работа [2,5 M], добавлен 27.05.2014

  • Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.

    курсовая работа [236,5 K], добавлен 27.01.2014

  • Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.

    методичка [819,6 K], добавлен 12.05.2013

  • Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.

    курсовая работа [281,5 K], добавлен 30.01.2018

  • Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.

    курсовая работа [352,8 K], добавлен 14.04.2011

  • Составление программы искусственного интеллекта в среде программирования Delphi 7, осуществляющую игру "крестики-нолики" с пользователем. Данная программа имеет возможность запоминания ходов и на основе них ходить так, чтобы не оказаться в проигрыше.

    контрольная работа [787,7 K], добавлен 16.01.2011

  • Анализ предметной области разрабатываемого программного продукта. Разработка интерфейса пользователя и структурной схемы игровой программы "Крестики-нолики". Отладка и тестирование. Проведение исследования компонентов программной среды Borland Delphi 6.0.

    курсовая работа [660,4 K], добавлен 08.03.2015

  • Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.

    курсовая работа [1,8 M], добавлен 05.03.2013

  • Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.

    курсовая работа [944,7 K], добавлен 14.03.2015

  • Архитектура и тестирование программного комплекса. Описание реализованного протокола данных. Обработка входящих подключений. Работа пользовательского потока и потока отправки. Выбор языка программирования. Структура серверного и клиентского приложений.

    курсовая работа [999,1 K], добавлен 20.12.2012

  • Обзор известных программ, которые выполняют аналогичные функции. Выбор инструментальных средств разработки. Проектирование пользовательского интерфейса и структур данных (во внешней и оперативной памяти). Выбор стандартных визуальных компонентов.

    курсовая работа [1,1 M], добавлен 13.10.2015

  • Анализ правил выбора хода на шахматной доске К. Шеннона. Характеристика программного модуля искусственного интеллекта для игры в шахматы. Контроль времени, поиск лучшего хода в шахматных алгоритмах. Разработка программы для игры с компьютерным оппонентом.

    дипломная работа [3,7 M], добавлен 07.07.2012

  • Структура математической модели линейной задачи, алгоритм симплекс-метода. Разработка программы: выбор языка программирования, входные и выходные данные, пользовательский интерфейс. Описание программы по листингу, тестирование, инструкция по применению.

    курсовая работа [1,2 M], добавлен 31.05.2013

  • Исследование базовых концепций программирования приложений под операционную систему Windows. Изучение истории создания универсального языка программирования Си. Разработка графического пользовательского интерфейса. Обзор правил игры и алгоритма работы.

    курсовая работа [58,2 K], добавлен 09.11.2012

  • Проектирование интеллектуальной логической игры "Галочки-нолики". Описание составляющих программы. Объявление переменных, Command1 по Command18. Основные кнопки, проектирование и проверка работы таймеров. Руководство по использованию, тестирование.

    контрольная работа [444,2 K], добавлен 17.04.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.