Курсовая работа: Программа Крестики-нолики

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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;