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

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

Федеральное агентство железнодорожного транспорта

Омский государственный университет путей сообщения

Кафедра «Автоматика и системы управления»

ПРОГРАММА «КРЕСТИКИ-НОЛИКИ»

Пояснительная записка к курсовой работе

по дисциплине «Программирование»

ИНМВ.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");