Программа "Крестики-нолики"

Характеристика методики написания компьютерной программы по правилам процедурного программирования. Изучение навыков использования языка Си для создания игры с искусственным интеллектом "Крестики-нолики". Реализация программного кода с комментариями.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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

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