Программа "Крестики-нолики"
Характеристика методики написания компьютерной программы по правилам процедурного программирования. Изучение навыков использования языка Си для создания игры с искусственным интеллектом "Крестики-нолики". Реализация программного кода с комментариями.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.02.2019 |
Размер файла | 248,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное агентство железнодорожного транспорта
Омский государственный университет путей сообщения
Кафедра «Автоматика и системы управления»
ПРОГРАММА «КРЕСТИКИ-НОЛИКИ»
Пояснительная записка к курсовой работе
по дисциплине «Программирование»
ИНМВ.400000.000 ПЗ
Студент гр. 26з
_____________ А.В. Подлипайло
«__»_________ 2017 г.
Руководитель -
преподаватель кафедры АиСУ
_____________ Д.В. Головин
«__»_________ 2017 г.
Омск 2017
Реферат
УДК 004.42
Пояснительная записка к курсовой работе содержит 40 страниц, 7 рисунков, 5 использованных источников.
Объектом курсовой работы является консольная игра «Крестики-нолики».
Цель курсовой работы - получение основных навыков использования языка Си, создание игры с искусственным интеллектом.
Результатом курсовой работы является игра «Крестики-нолики», написанная на языке Си в программе Notepad++.
В процессе создания игры была изучена лексика языка Си.
Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2016.
Введение
Язык программирования Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилам процедурного программирования, не добавляя на итоговый код программ лишних накладных расходов для компилятора.
Си предлагает следующие важные особенности:
– простую языковую базу, из которой вынесены в библиотеки многие существенные возможности;
– ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
– систему типов;
– использование препроцессора;
– непосредственный доступ к памяти компьютера через использование указателей;
– минимальное число ключевых слов;
– передачу параметров в функцию по значению;
– указатели на функции и статические переменные, структуры и объединения;
– средства объектно-ориентированного программирования.
Часть отсутствующих возможностей относительно легко имитируется встроенными средствами, часть добавляется с помощью сторонних библиотек, часть реализуется в некоторых компиляторах в виде расширений языка.
Язык Си остается языком, реализованным на максимальном количестве аппаратных платформ, и одним из самых популярных языков программирования, особенно в мире свободного программного обеспечения.
Курсовая работа является примером использования языка Си.
Содержание
- Введение
- Содержание
- 1 Правила игры
- 2 Реализация программного кода с комментариями
- 3 Инструкция пользователя
- Заключение
- Библиографический список
Приложение А
крестик нолик программа
1 Правила игры
«Крестики-нолики» - логическая игра между двумя противниками на квадратном поле 10 на 10 клеток. Один из игроков играет «крестиками», второй - «ноликами». Игроки по очереди ставят на свободные клетки поля 10х10 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 5 своих фигур по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики.
2 Реализация программного кода с комментариями
В программе используются библиотеки:
– #include<stdio.h>//библиотека ввода-вывода;
– #include<windows.h>//библиотека;
– #include<time.h>//библиотека для работы с датой/временем.
Функция смены цвета background - фон и text - текст (Листинг 1).
void SetColor(int background, int text)
{//замена цвета
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,(WORD)((background<<4)|text));
}
Листинг 1 - Функция смены цвета
Функция для вывода игрового поля через консоль на экран (Листинг 2). Если элемент массива равен 1, то выводится крестик, если же равен -1, то нолик, пустым значения соответствует 0.
void print()
{//ввывод игрового поля
int i,j,d=0;
SetColor(0, 15);
printf("\n 1 2 3 4 5 6 7 8 9 10");
SetColor(0, 8);
for(i=0;i<10;i++)
{
printf("\n _________________________________________\n\n");
{
d++;
SetColor(0, 15);
printf("%2i ",d);
SetColor(0, 8);
}
for(j=0;j<10;j++)
{
printf("|");
if (a[i][j]==1)
{
SetColor(0, 11);
printf(" X ");
SetColor(0, 8);
}
else
if(a[i][j]==-1)
{
SetColor(0, 14);
printf(" O ");
SetColor(0, 8);
}
else
printf(" ");
}
printf("|");
}
printf("\n _________________________________________\n");
}
Листинг 2 - Функция вывода игрового поля
Функция проверки координат (Листинг 3), осуществляет проверку значений, которые не должны выйти за границы массива (игрового поля).
int check_coordinat(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;
}
Листинг 3 - Функция проверки координат
Функция проверки на победу (Листинг 4). Проверка проходит по вертикали, горизонтали, диагонали снизу вверх и обратной диагонали.
int check_win(int s1)
{//функция проверки на победу
int i,j,x=0;
for(j=0;j<10;j++)//вертикаль
{
for(i=0;i<10;i++)
{
if(a[i][j]==s1)
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]==s1)
x++;
else
x=0;
if(x>=5)
return 1;
}
}
for(i=0;i<10;i++)//диагональ
{
for(j=0;j<10;j++)
{
while(i<10,j<10)
{
if(a[i][j]==s1)
x++;
else
x=0;
if(x>=5)
return 1;
i++;
j++;
}
}
}
for(i=0;i<10;i++)//диагональ
{
for(j=9;j>=0;j--)
{
while(i<10,j>=0)
{
if(a[i][j]==s1)
x++;
else
x=0;
if(x>=5)
return 1;
i++;
j--;
}
}
}
if(x<5)
return 0;
}
Листинг 4 - Функция проверки на победу
Функция проверки на ничью (Листинг 5).Проверяет весь массив на наличие свободных элементов, в случае отсутствия таких возвращает значение 1, то есть проверяет элементы должны быть равны нулю (пустая клетка).
int dead_heat()
{//функция на ничью
int c=0,i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(a[i][j]!=0)//если элемент не свободен
c++;//прибавляем к счетчику 1
else
c=0;
if(c==100)
return 1;//ничья
else
return 0;
}
}
}
Листинг 5 - Функция проверки на ничью
Функция случайного хода компьютера (Листинг 6). В этой функции используется функции «time», «srand» и «rand», которые необходимы для нахождения случайных чисел изменяющихся после каждого шага.
int random_computer(int s2)
{//функция случайног хода компьютера
int i,j,p,x,y;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(a[i][j]==0)
p++;
}
}
if(p==0)
return 1;
if(p>0)
{
srand(time(NULL));
x=rand()%9+0;//случайные числа от 0 до 9
y=rand()%9+0;//случайные числа от 0 до 9
if(a[x][y]==0)
{
a[x][y]=s2;
}
else
if(a[x][y]!=0)
{
while(a[x][y]!=0)
{
srand(time(NULL));
x=rand()%9+0;//случайные числа от 0 до 9
y=rand()%9+0;//случайные числа от 0 до 9
}
a[x][y]=s2;
}
}
}
Листинг 6 - Функция случайного хода компьютера
Функции блокирования действий игрока (Листинг 7). Функция блокирует если у игрока составлена комбинация из 3 значений подряд.
int block_computer(int s1, int s2)
{//функция блокировки комбинаций игрока
int z=0,k=0,l=0,i=0,j=0,res;
for(z=0;z<10;z++)//вертикаль
{
for(k=0;k<10;k++)
{
if (a[z][k]==s1)
l++;
else
l=0;
if(l==3 && a[z][k+1]==0 && k+1<=9)
{
a[z][k+1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[z][k-3]==0 && k-3>=0)
{
a[z][k-3]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z][k+1]==0 && k+1<=9)
{
a[z][k+1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z][k-4]==0 && k-4>=0)
{
a[z][k-3]=s2;
res=1;
return 1;
}
}
}
for(k=0;k<10;k++)//горизонталь
{
for(z=0;z<10;z++)
{
if(a[z][k]==s1)
l++;
else
l=0;
if(res!=1 && l==3 && a[z+1][k]==0 && z+1<=9)
{
a[z+1][k]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[z-3][k]==0 && z-3>=0)
{
a[z-3][k]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z+1][k]==0 && z+1<=9)
{
a[z+1][k]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z-4][k]==0 && z-4>=0)
{
a[z-4][k]=s2;
res=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]==s1)
l++;
else
l=0;
if(res!=1 && l==3 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)
{
a[i+1][j+1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[i-3][j-3]==0 && i-3>=0 && j-3>=0)
{
a[i-3][j-3]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[i-4][j-4]==0 && i-4>=0 && j-4>=0)
{
a[i-4][j-4]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)
{
a[i+1][j+1]=s2;
res=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]==s1)
l++;
else
l=0;
if(res!=1 && l==3 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)
{
a[i+1][j-1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[i-3][j+3]==0 && i-3>=0 && j+3<=9)
{
a[i-3][j+3]=s2;
res=1;
return 1;
}
if(res!=1 && l==4 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)
{
a[i+1][j-1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[i-4][j+4]==0 && i-4>=0 && j+4<=9)
{
a[i-4][j+4]=s2;
res=1;
return 1;
}
}
}
}
}
Листинг 7 - Функция блокировки комбинаций игрока
Функция игры с компьютером (Листинг 8). В ней используются ранее упомянутые функции блокировки хода игрока и случайного хода. Здесь реализуется выбор чем играть, очередность хода.
int game_computer()
{// функция игрок и компьютер
int i,j,c,res,p,x,s1,s2;
while(p!=1)
{
printf("\nВыбирите кем хотите играть.\nЕсли крестиком, то нажмите 1, если ноликом - 2.\n");
res=scanf("%i", &x);
while(getchar()!='\n');//проверка на ввод чисел
if(res==1)
{
if(x==1 || x==2)
{
if(x==1)
{
c=0;
s1=1;
s2=-1;
}
if(x==2)
{
c=1;
s1=-1;
s2=1;
}
while(p!=1)//выход из цикла если проверки на победу или ничью сработали
{
if(c%2==0)
{
printf("\nВведите координаты от 1 до 10\n");
res=scanf("%i%i", &i, &j);
i-=1;
j-=1;
while(getchar()!='\n');//проверка на ввод чисел
if(res==2)
{
if(check_coordinat(i,j)==1)
{
c++;
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
if(check_coordinat(i,j)==0)
{
a[i][j]=s1;
printf("\nХод игрока:\n");
print();
}
if(check_win(s1)==1)
{
SetColor(0, 11);
printf("-=|ИГРОК ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
else
{
printf("\nВы ввели неправильно!\n");
c++;
}
}
else
if(c%2!=0)
{
if(block_computer(s1,s2)==1)
{
block_computer(s1,s2);
print();
}
else
{
random_computer(s2);
printf("\nХод компьютера:\n");
print();
}
if(check_win(s2)==1)
{
SetColor(0, 14);
printf("-=|КОМПЬЮТЕР ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
if(dead_heat()==1)
{
SetColor(0, 15);
printf("\nНичья!\n");
SetColor(0, 8);
p=1;
}
c++;
}
}
else
printf("\nВы ввели неправильные значения!\n");
}
else
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
}
Листинг 8 - Функция игры с компьютером
Функция 2-х игроков (Листинг 9).
void game_player()
{//функция игрок и игрок
int i,j,c=0,x,res,p,s1;
printf("\nПервым ходит Х:\n");
while(p!=1)//выход из цикла если проверки на победу или ничью сработали
{
printf("\nВведите координаты от 1 до 10\n");
res=scanf("%i %i", &i, &j);
i-=1;
j-=1;
while(getchar()!='\n');//проверка на ввод чисел
if(res==2)
{
if(check_coordinat(i,j)==1)
{
if(c%2==0 || c%2!=0)
c++;
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
else
{
if(c%2==0)
s1=1;
else
s1=-1;
if(c%2==0)
{
a[i][j]=s1;
printf("\nХод 1-го игрока:\n");
print();
if(check_win(s1)==1)
{
SetColor(0, 11);
printf("-=|ПЕРВЫЙ ИГРОК \"X\" ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
else
{
if(c%2==0)
s1=1;
else
s1=-1;
a[i][j]=s1;
printf("\nХод 2-го игрока:\n");
print();
if(check_win(s1)==1)
{
SetColor(0, 14);
printf("-=|ВТОРОЙ ИГРОК \"0\" ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
if(dead_heat()==1)
{
SetColor(0, 15);
printf("-=|НИЧЬЯ|=-\n");
SetColor(0, 8);
p=1;
}
}
}
else
{
printf("Введены некорректные значения\nПопробуйте еще раз\n");
c++;
}
c++;
}
}
Листинг 9 - Функция игры на двух игроков
Функция основного меню (Листинг 10). В теле функции используется функция «system(«cls»)» для очистки консоли. Цикл «while(getchar()!='\n');» не дает пользователю ввести символы, кроме чисел. В этой функции осуществляется выбор режима игры, так же здесь описаны правила игры и реализован выход.
void main()
{//основное меню
int x,res;
system("cls");//очистка консоли
printf("*************************\n");
printf("*****");
SetColor(0, 15);
printf("КРЕСТИКИ-НОЛИКИ");
SetColor(0, 8);
printf("*****\n");
printf("*************************\n");
while (res!=1)
{
SetColor(0, 15);
printf("\nВыберите пункт меню\n");
printf("1 Правила\n");
printf("2 Игрок vs Компьютер.\n");
printf("3 Игрок vs Игрока.\n");
printf("4 Выход.\n");
SetColor(0, 8);
res=scanf("%i", &x);
while(getchar()!='\n');//проверка на ввод чисел
if(res==1)
{
if(x==1)
{
printf("*****\nКрестики-нолики - логическая игра между двумя противниками\nна квадратном поле 10 на 10 клеток.\nОдин из игроков играет \"крестиками\", второй - \"ноликами\".\nИгроки по очереди ставят на свободные клетки поля 10х10 знаки\n(один всегда крестики, другой всегда нолики).\nПервый, выстроивший в ряд 5 своих фигуры по вертикали,\nгоризонтали или диагонали, выигрывает.\nПервый ход делает игрок, ставящий крестики.\n*****");
res=2;
}
if(x==2)
game_computer();
if(x==3)
game_player();
if(x==4)
res=1;
if(x!=1&&x!=2&&x!=3&&x!=4)
{
res=2;
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
}
else
printf("\nВведены некорректные значения\nПопробуйте еще раз\n");
}
}
Листинг 10 - Функция основого меню
3 Инструкция пользователя
После запуска появляется следующее меню, представленное на рисунке ниже (рисунок 1).
Рисунок 1 - Меню игры
После выбора пункта 1, появиться текст с правилами игры (рисунок 2).
Рисунок 2 - Правила игры
Пункт 2 - игра с компьютером. После выбора этого пункта появиться сообщение о выборе за кого играть (рисунок 3).
Рисунок 3 - Ввод координат
После ввода координат символ за кого играет пользователь появиться на игровом поле (рисунок 4).
Рисунок 4 - Вывод
Ход игроков или компьютера осуществляется по очереди, до тех пор, пока поле не будет полностью занято символами «Х» или «0», либо пока крестики или не выстроятся 5 в ряд по вертикали, горизонтали, диагонали и обратной диагонали (рисунок 5 и 6). В этом случае выводится сообщение о победе того или иного игрока или сообщение о ничьей.
Рисунок 5 - Вывод сообщения о победе
Рисунок 6 - Вывод сообщения о победе
Ели при вводе допущены ошибки, то есть, введены буквы, клетка уже занята или координаты выходят за диапазон от 1 до 10, то выведется соответствующее сообщение (рисунок 7). Эти сообщения будут выводиться, пока вводимые значения не будут удовлетворять условиям.
Рисунок 7 - Сообщение о конце игры
Заключение
Во время выполнения курсовой работы были изучены принципы программирования на языке Си, были освоены основные концепции и стратегии по созданию консольного приложения «Крестики - нолики», которое является результатом выполнения курсовой работы.
Библиографический список
1 Керниган Б. Язык программирования Си 2-е издание / Б. Керниган Д. Ричи М.:Издательский дом "Вильямс", 2012. 272 с.
2 Википедия. Свободная энциклопедия [Электронный ресурс] / Режим доступа: https:// ru.wikipedia.org/wiki/Крестики-нолики
3 Википедия. Свободная энциклопедия [Электронный ресурс] / Режим доступа: https://ru.wikipedia.org/wiki/Си_(язык_программирования)
4 CppStudio. Язык программирования Си [Электронный ресурс] / Режим доступа: http://cppstudio.com/cat/271
5 Habrahabr. Игра гомоку (крестики-нолики, 5 в ряд) [Электронный ресурс] / Режим доступа: https://habrahabr.ru/post/278837/
Приложение А
(обязательное)
Код программы
#include<stdio.h>//библиотека ввода-вывода
#include<windows.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 SetColor(int background, int text)
{//замена цвета
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,(WORD)((background<<4)|text));
}
void print()
{//ввывод игрового поля
int i,j,d=0;
SetColor(0, 15);
printf("\n 1 2 3 4 5 6 7 8 9 10");
SetColor(0, 8);
for(i=0;i<10;i++)
{
printf("\n _________________________________________\n\n");
{
d++;
SetColor(0, 15);
printf("%2i ",d);
SetColor(0, 8);
}
for(j=0;j<10;j++)
{
Листинг А.1, лист 1
printf("|");
if (a[i][j]==1)
{
SetColor(0, 11);
printf(" X ");
SetColor(0, 8);
}
else
if(a[i][j]==-1)
{
SetColor(0, 14);
printf(" O ");
SetColor(0, 8);
}
else
printf(" ");
}
printf("|");
}
printf("\n _________________________________________\n");
}
int check_coordinat(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 check_win(int s1)
{//функция проверки на победу
int i,j,x=0;
for(j=0;j<10;j++)//вертикаль
{
for(i=0;i<10;i++)
{
if(a[i][j]==s1)
x++;
else
x=0;
Листинг А.1, лист 2
if(x>=5)
return 1;
}
}
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)//горизонталь
{
if(a[i][j]==s1)
x++;
else
x=0;
if(x>=5)
return 1;
}
}
for(i=0;i<10;i++)//диагональ
{
for(j=0;j<10;j++)
{
while(i<10,j<10)
{
if(a[i][j]==s1)
x++;
else
x=0;
if(x>=5)
return 1;
i++;
j++;
}
}
}
for(i=0;i<10;i++)//диагональ
{
for(j=9;j>=0;j--)
{
while(i<10,j>=0)
{
if(a[i][j]==s1)
x++;
else
x=0;
Листинг А.1, лист 3
if(x>=5)
return 1;
i++;
j--;
}
}
}
if(x<5)
return 0;
}
int dead_heat()
{//функция на ничью
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 random_computer(int s2)
{//функция случайног хода компьютера
int i,j,p,x,y;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(a[i][j]==0)
p++;
}
}
if(p==0)
return 1;
Листинг А.1, лист 4
if(p>0)
{
srand(time(NULL));
x=rand()%9+0;//случайные числа от 0 до 9
y=rand()%9+0;//случайные числа от 0 до 9
if(a[x][y]==0)
{
a[x][y]=s2;
}
else
if(a[x][y]!=0)
{
while(a[x][y]!=0)
{
srand(time(NULL));
x=rand()%9+0;//случайные числа от 0 до 9
y=rand()%9+0;//случайные числа от 0 до 9
}
a[x][y]=s2;
}
}
}
int block_computer(int s1, int s2)
{//функция блокировки комбинаций игрока
int z=0,k=0,l=0,i=0,j=0,res;
for(z=0;z<10;z++)//вертикаль
{
for(k=0;k<10;k++)
{
if (a[z][k]==s1)
l++;
else
l=0;
if(l==3 && a[z][k+1]==0 && k+1<=9)
{
a[z][k+1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[z][k-3]==0 && k-3>=0)
{
Листинг А.1, лист 5
a[z][k-3]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z][k+1]==0 && k+1<=9)
{
a[z][k+1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z][k-4]==0 && k-4>=0)
{
a[z][k-3]=s2;
res=1;
return 1;
}
}
}
for(k=0;k<10;k++)//горизонталь
{
for(z=0;z<10;z++)
{
if(a[z][k]==s1)
l++;
else
l=0;
if(res!=1 && l==3 && a[z+1][k]==0 && z+1<=9)
{
a[z+1][k]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[z-3][k]==0 && z-3>=0)
{
a[z-3][k]=s2;
res=1;
return 1;
}
Листинг А.1, лист 6
else
if(res!=1 && l==4 && a[z+1][k]==0 && z+1<=9)
{
a[z+1][k]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[z-4][k]==0 && z-4>=0)
{
a[z-4][k]=s2;
res=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]==s1)
l++;
else
l=0;
if(res!=1 && l==3 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)
{
a[i+1][j+1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[i-3][j-3]==0 && i-3>=0 && j-3>=0)
{
a[i-3][j-3]=s2;
res=1;
return 1;
}
Листинг А.1, лист 7
else
if(res!=1 && l==4 && a[i-4][j-4]==0 && i-4>=0 && j-4>=0)
{
a[i-4][j-4]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[i+1][j+1]==0 && i+1<=9 && j+1<=9)
{
a[i+1][j+1]=s2;
res=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]==s1)
l++;
else
l=0;
if(res!=1 && l==3 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)
{
a[i+1][j-1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==3 && a[i-3][j+3]==0 && i-3>=0 && j+3<=9)
{
a[i-3][j+3]=s2;
res=1;
return 1;
Листинг А.1, лист 8
}
if(res!=1 && l==4 && a[i+1][j-1]==0 && i+1<=9 && j-1>=0)
{
a[i+1][j-1]=s2;
res=1;
return 1;
}
else
if(res!=1 && l==4 && a[i-4][j+4]==0 && i-4>=0 && j+4<=9)
{
a[i-4][j+4]=s2;
res=1;
return 1;
}
}
}
}
}
int game_computer()
{// функция игрок и компьютер
int i,j,c,res,p,x,s1,s2;
while(p!=1)
{
printf("\nВыбирите кем хотите играть.\nЕсли крестиком, то нажмите 1, если ноликом - 2.\n");
res=scanf("%i", &x);
while(getchar()!='\n');//проверка на ввод чисел
if(res==1)
{
if(x==1 || x==2)
{
if(x==1)
{
c=0;
s1=1;
s2=-1;
}
if(x==2)
{
c=1;
Листинг А.1, лист 9
s1=-1;
s2=1;
}
while(p!=1)//выход из цикла если проверки на победу или ничью сработали
{
if(c%2==0)
{
printf("\nВведите координаты от 1 до 10\n");
res=scanf("%i%i", &i, &j);
i-=1;
j-=1;
while(getchar()!='\n');//проверка на ввод чисел
if(res==2)
{
if(check_coordinat(i,j)==1)
{
c++;
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
if(check_coordinat(i,j)==0)
{
a[i][j]=s1;
printf("\nХод игрока:\n");
print();
}
if(check_win(s1)==1)
{
SetColor(0, 11);
printf("-=|ИГРОК ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
else
{
printf("\nВы ввели неправильно!\n");
c++;
Листинг А.1, лист 10
}
}
else
if(c%2!=0)
{
if(block_computer(s1,s2)==1)
{
block_computer(s1,s2);
print();
}
else
{
random_computer(s2);
printf("\nХод компьютера:\n");
print();
}
if(check_win(s2)==1)
{
SetColor(0, 14);
printf("-=|КОМПЬЮТЕР ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
if(dead_heat()==1)
{
SetColor(0, 15);
printf("\nНичья!\n");
SetColor(0, 8);
p=1;
}
c++;
}
}
else
printf("\nВы ввели неправильные значения!\n");
}
else
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
Листинг А.1, лист 11
}
void game_player()
{//функция игрок и игрок
int i,j,c=0,x,res,p,s1;
printf("\nПервым ходит Х:\n");
while(p!=1)//выход из цикла если проверки на победу или ничью сработали
{
printf("\nВведите координаты от 1 до 10\n");
res=scanf("%i %i", &i, &j);
i-=1;
j-=1;
while(getchar()!='\n');//проверка на ввод чисел
if(res==2)
{
if(check_coordinat(i,j)==1)
{
if(c%2==0 || c%2!=0)
c++;
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
else
{
if(c%2==0)
s1=1;
else
s1=-1;
if(c%2==0)
{
a[i][j]=s1;
printf("\nХод 1-го игрока:\n");
print();
if(check_win(s1)==1)
{
SetColor(0, 11);
printf("-=|ПЕРВЫЙ ИГРОК \"X\" ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
Листинг А.1, лист 12
}
else
{
if(c%2==0)
s1=1;
else
s1=-1;
a[i][j]=s1;
printf("\nХод 2-го игрока:\n");
print();
if(check_win(s1)==1)
{
SetColor(0, 14);
printf("-=|ВТОРОЙ ИГРОК \"0\" ПОБЕДИЛ|=-\n");
SetColor(0, 8);
p=1;
}
}
if(dead_heat()==1)
{
SetColor(0, 15);
printf("-=|НИЧЬЯ|=-\n");
SetColor(0, 8);
p=1;
}
}
}
else
{
printf("Введены некорректные значения\nПопробуйте еще раз\n");
c++;
}c++;
}
}
void main()
{//основное меню
int x,res;
system("cls");//очистка консоли
printf("*************************\n");
printf("*****");
Листинг А.1, лист 13
SetColor(0, 15);
printf("КРЕСТИКИ-НОЛИКИ");
SetColor(0, 8);
printf("*****\n");
printf("*************************\n");
while (res!=1)
{
SetColor(0, 15);
printf("\nВыберите пункт меню\n");
printf("1 Правила\n");
printf("2 Игрок vs Компьютер.\n");
printf("3 Игрок vs Игрока.\n");
printf("4 Выход.\n");
SetColor(0, 8);
res=scanf("%i", &x);
while(getchar()!='\n');//проверка на ввод чисел
if(res==1)
{
if(x==1)
{
printf("*****\nКрестики-нолики - логическая игра между двумя противниками\nна квадратном поле 10 на 10 клеток.\nОдин из игроков играет \"крестиками\", второй - \"ноликами\".\nИгроки по очереди ставят на свободные клетки поля 10х10 знаки\n(один всегда крестики, другой всегда нолики).\nПервый, выстроивший в ряд 5 своих фигуры по вертикали,\nгоризонтали или диагонали, выигрывает.\nПервый ход делает игрок, ставящий крестики.\n*****"); res=2;
}
if(x==2) game_computer();
if(x==3) game_player();
if(x==4) res=1;
if(x!=1&&x!=2&&x!=3&&x!=4)
{
res=2;
printf("Введены некорректные значения\nПопробуйте еще раз\n");
}
}else
printf("\nВведены некорректные значения\nПопробуйте еще раз\n");
}
}
Листинг А.1, лист 14
Размещено на Allbest.ru
Подобные документы
Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.
курсовая работа [235,8 K], добавлен 05.12.2009Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.
курсовая работа [74,6 K], добавлен 20.12.2009Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.
курсовая работа [236,5 K], добавлен 27.01.2014Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.
методичка [819,6 K], добавлен 12.05.2013Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.
контрольная работа [380,0 K], добавлен 28.04.2014Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.
курсовая работа [34,6 K], добавлен 19.05.2014Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.
курсовая работа [2,5 M], добавлен 27.05.2014Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.
курсовая работа [352,8 K], добавлен 14.04.2011Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.
курсовая работа [281,5 K], добавлен 30.01.2018