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;