Разработка программы для реализации консольной игры "Крестики-нолики"
Разработка функции проверки игрока и искусственного интеллекта на победу в консольной игре "Крестики-нолики". Анализ основных элементов интерфейса программного приложения. Достоинства языка Си как универсального метода системного программирования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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