Федеральное агентство железнодорожного транспорта
Омский государственный университет путей сообщения
Кафедра «Автоматика и системы управления»
ПРОГРАММА «КРЕСТИКИ-НОЛИКИ»
Пояснительная записка к курсовой работе
по дисциплине «Программирование»
ИНМВ.400000.000 ПЗ
Студент гр. 26з
_____________ А.В. Подлипайло
«__»_________ 2017 г.
Руководитель -
преподаватель кафедры АиСУ
_____________ Д.В. Головин
«__»_________ 2017 г.
Омск 2017
Реферат
УДК 004.42
Пояснительная записка к курсовой работе содержит 40 страниц, 7 рисунков, 5 использованных источников.
Объектом курсовой работы является консольная игра «Крестики-нолики».
Цель курсовой работы - получение основных навыков использования языка Си, создание игры с искусственным интеллектом.
Результатом курсовой работы является игра «Крестики-нолики», написанная на языке Си в программе Notepad++.
В процессе создания игры была изучена лексика языка Си.
Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2016.
Введение
Язык программирования Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилам процедурного программирования, не добавляя на итоговый код программ лишних накладных расходов для компилятора.
Си предлагает следующие важные особенности:
– простую языковую базу, из которой вынесены в библиотеки многие существенные возможности;
– ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
– систему типов;
– использование препроцессора;
– непосредственный доступ к памяти компьютера через использование указателей;
– минимальное число ключевых слов;
– передачу параметров в функцию по значению;
– указатели на функции и статические переменные, структуры и объединения;
– средства объектно-ориентированного программирования.
Часть отсутствующих возможностей относительно легко имитируется встроенными средствами, часть добавляется с помощью сторонних библиотек, часть реализуется в некоторых компиляторах в виде расширений языка.
Язык Си остается языком, реализованным на максимальном количестве аппаратных платформ, и одним из самых популярных языков программирования, особенно в мире свободного программного обеспечения.
Курсовая работа является примером использования языка Си.
Содержание
Приложение А
крестик нолик программа
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");