Федеральное агентство железнодорожного транспорта
Омский государственный университет путей сообщения
Кафедра «Автоматика и системы управления»
Программа «НАБОРЩИК»
Пояснительная записка к курсовой работе
по дисциплине «Программирование и основы алгоритмизации»
ИНМВ.411000.000 ПЗ
игра компьютерный программа
Студент гр. 23ф
А.К.Кучук
«__»________2014 г.
Руководитель -
доцент кафедры АиСУ
А. С. Окишев
«__»________2014 г.
Омск 2014
Пояснительная записка к курсовой работе содержит 20 страниц, 5 рисунков, 4 использованных источника, 2 приложения.
Игра «Наборщик», функция, программа, «Си», «Notepad++»
Объектом исследования является игра «Наборщик».
Цель курсовой работы - систематизация, углубление и активное применение знаний по системному программированию, закрепление знаний, полученных в лекционном курсе, а также на практических и лабораторных занятиях.
Игра «Наборщик» разработана с использованием компилятора MinGW. Исходный текст программы написан на языке «Си».
В процессе разработки игры была изучена лексика языка «Си».
Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2007.
Задание
В курсовой работе нужно реализовать игру. Игра являются пошаговой с интерфейсом командной строки. Компьютер выводит в текстовом виде информацию о состоянии игры и ходе компьютера. Пользователь делает свой ход, вводя с клавиатуры нужные данные
Игра «Наборщик». На поле 8*8 игрок располагает n лис. Другой игрок должен подстрелить всех лис. При каждом выстреле он называет клетку поля. При этом другой игрок сообщает, попал ли выстрел в лису, и сколько лис в сумме находится в одном столбце и строке с выстрелом. Выигрывает тот, кто быстрее найдет всех лис.
Содержание
Введение
Основная часть
Заключение
Библиографический список
Приложение А
Введение
Данная курсовая работа написана на языке «Cи», компилируемом, статически типизированном языке программирования общего назначения. В ней реализована задача игры «Бергсона». «Cи» - стандартизированный процедурный язык программирования.
Язык «Cи» был разработан в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как наследник языка «B».
«Cи» был создан для использования в операционной системе UNIX, в том числе и для написания ядра системы. С тех пор он был портирован на многие другие операционные системы и стал одним из самых широко используемых языков программирования.
В 1978 году была опубликована книга «Язык программирования Cи» Ритчи и Кернигана; описанный в ней язык стал неформальным стандартом языка, известным как K&R «Cи».
Первый официальный стандарт языка был создан в 1989 году ANSI X3.159-1989 и в следующем году с незначительными изменениями принят как ISO/IEC 9899:1990; он известен как ANSI C. Следующими стандартами стали ISO 9899:1999 (C99) и ISO/IEC 9899:2011 (C11).
«Cи» ценят за его эффективность; он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ.
Особенности языка:
- минимальное количество ключевых слов;
-большинство возможностей языка вынесено в библиотек; использование препроцессора для определения макросов, включения исходных кодов других файлов и условной компиляции;
- статическая слабая типизация: у всех данных есть фиксированные типы, но неявные преобразования разрешены;
- разрешено определение пользовательских типов и составных типов;
-предоставляется низкоуровневый доступ к памяти (через преобразование машинных адресов в типизированные указатели);
- процедуры являются частным случаем функции, возвращающей специальный тип «void»;
- файлы можно компилировать отдельно и линковать друг с другом, контролируя видимость функций и данных ключевыми словами «static» и «extern».
Написанная игра является пошаговой, игрок вводит данные с клавиатуры, а компьютер выводит на экран результаты его хода.
Основная часть
В коде программы используется структура данных и присутствует 6 функций. Рассмотрим поочередно назначение и принцип работы каждой из них.
Структура данных.
struct state //структура данных
{
int f1[8][8];//игровое поле 1 игрока
int f2[8][8];//игровое поле 2 игрока
char f1v[8][8];//выводимое игровое поле 1 игрока в процессе
char f2v[8][8];//выводимое игр. поле 2 игрока в процессе игр
int x,y; // координаты
int fox1; // количество лис 1 игрока
int fox2; // количество лис 2 игрока
int pl;// режим игры
};
Функция вывода игрового поля на экран.
За вывод игрового поля на экран отвечает функция «void».На экран выводиться поле в соответствии состоянию игры, процесс реализован так, что игроки не знают расположения лис противника. Результат работы функции приведен на рисунке 1.
Вывод полей:
void pech_gl(int *b, int n, int *d) //вывод полей
int i,j;
printf("\n");
printf(" | 1");
for(i=2;i<9;i++)printf("%5i",i);
printf("\t\t | 1");
for(i=2;i<9;i++)printf("%5i",i);
printf("\n");
printf("----------------------------------------\t\t--------------------------------------\n");
for(i=0;i<8;i++)
{
printf("%i | ",i+1);
for(j=0;j<8;j++)
if(b[i*n+j]!=120)
if(b[i*n+j]>15)
printf("%1c%c%i ",76,47,b[i*n+j]-20);
else
printf("%1i ",b[i*n+j]);
else
printf("%1c ",b[i*n+j]);
printf("\t\t%i | ",i+1);
for(j=0;j<8;j++)
printf("%1c ",d[i*n+j]);
printf("\n\n");
}
Рисунок 1 - Результат работы функции «void»
Заполнение игрового поля и выбор типа игры. Для начала игры нужно выбрать режим игры и соответственно заполнить игровое поле. Эти действия реализованы в функции «while». После выбора режима игры, игроки поочередно заполняют игровое поле (ввод координат лис через пробел), при игре с компьютером его лисы расставляются случайно. Все действия осуществляются с клавиатуры.
while(er<1) //заполнение игрового поля
{
printf("vvedite coord lisi ");
scanf("%i%i",&str1,&sto1); str1--;sto1--;
if((str1<0)||(str1>7)||(sto1<0)||(sto1>7))
{printf("\n nevernaya koordinata\n");}
else er=1;
if((er==1)&&(d[str1*n+sto1]!=45))
{ printf("\n vi suda yzhe stavili\n"); er=0;}
}
w[str1*n+sto1]=1; d[str1*n+sto1]=76;
system("cls"); u++;
Функция подсчета лис в данном столбце и строке. Для осуществления игрового процесса нам требуется, чтобы после каждого хода в клетке, по которой стрелял игрок, выводилось количество лис находящихся в данном столбце и данной строке. В функцию передаются координаты выстрела , и массив хранящий игровое поле. Функция считает лис в столбце выстрела и строке выстрела. Полученное число переводиться в типа «char».
Процесс игры, ходы игроков.
Сам процесс игры, ходы игроков и компьютера реализованы в функции «void». Стратегия игры компьютера не идеальна, но вполне позволяет посоревноваться человеку и машине.
Так как игра пошаговая то игроки поочередно вводят координаты выстрела, после того как оба игрока совершили выстрелы, на экран выводится игровое поле с внесенными изменениями и сообщение о состоянии игры. После выстрела каждого игрока выводиться сообщение о том, было ли попадание или нет. На рисунке 2 представлен режим игры с компьютером, вводим количество лис и заполняем поле.
Ходы компьютера рассчитаны таким образом, что при попадании в пустую клетку, она помечается, и выстрелы по ней больше не производятся. Так же, если количество лис в данном столбце и строке оказывается равным нулю, то компьютер помечает все клетки в данной строке и данном столбце. Таким образом, компьютер быстро сокращает область поиска лис игрока.
Ввод координат:
printf("vvedite coord lisi protivnika "); //ввод координат
scanf("%i%i",&str,&sto); str--;sto--;
if((str<0)||(str>7)||(sto<0)||(sto>7))
{printf("\n nevernaya koordinata\n");}
else z=1;
if((z==1)&&(b[str*n+sto]!=120))
{ printf("\n vi suda yzhe strelyali\n"); z=0;}
Рисунок 2 - Режим игры с компьютером, вводим количество лис и заполняем поле
Управляющая функция «main».
Сам процесс игры будет контролировать главная функция нашей программы. В функции «main» поочередно выполняются вышеописанные функции вывода правил игры, функция заполнения игрового поля и функция контролирующая игровой процесс. На рисунке 3 изображено начало игры.
main() // главная функция
{
int a[64],i,j,n=8,kol,kol1,*c=&a[0],s=0,p,str,sto,shag=0,kol_ybit=0,kolich[64],str_y[64],sto_y[64],str_s[64],sto_s[64],strel[64],kol_strel=0;
int b[64],d[64],*dd=&d[0],w[64],*ww=&w[0],u,str1,sto1, er, par=0, per1=-1,per2=-1, par1=0, par2=0;
int *br=&b[0],ss=0, iskl[64], ii=0, parz=0,par_isk1, par_isk2,par3;
system("cls");
system("title ohota na lis v 1.0");
system("color 21");
printf("Pole na kotorom vi bydete iskat lis nahoditsya sleva a vashe pole sprava. Ydachi!\n");
system("pause");
system("cls");
time_t t;
srand(time(&t));
for(i=0;i<64;i++)
{a[i]=0;b[i]=120;d[i]=45;w[i]=0;}
}
Рисунок 3 - Начало игры
В приложении А содержится код программы, содержащий все пояснительные комментарии.
Заключение
В ходе выполнения задания на курсовую работу, были углублены знания по многим аспектам языка «Си».
Основная цель работы была выполнена, т.е. была написана пошаговая логическая игра Наборщик с псевдографическим интерфейсом.
В результате выполнения курсовой работы разработана программа на языке «Си», в текстовом редакторе «NotePad++», реализующая процесс, описанный в постановке задачи. В ходе написания игры я более подробно изучила этот язык.
В программе реализована возможность игры с компьютером, ходы компьютера осуществляются методом отличным от выбора хода случайным образом.
Считаю, что поставленная задача решена в полном объеме.
Библиографический список
1 Введение в программирование: Методические указания к лабораторным работам / Е. А. Альтман, А. В. Александров, Н. Г. Ананьева, Н. Е. Актаев; Омский гос. ун-т путей сообщения. Омск, 2011. 31 с.
2 Керниган. Б., Ритчи Д., Язык программирования «Си». 2-е издание , 2012.-304 с.
3 СТП ОмГУПС-1.2-2005
4 СТП ОмГУПС-1.2-02
Приложение А
Полный листинг программы:
include "stdio.h"
#include "stdlib.h"
#include "time.h"
int summa(int x, int y, int n, int *c) //сумма элементов в столбце и строке
{
int s=0,i,j;
for(j=0;j<n;j++)
{
s+=c[x*n+j];
}
for(i=0;i<n;i++)
{
s+=c[i*n+y];
}
if (c[x*n+y]==1) s-=1;
return s;
}
void pech_gl(int *b, int n, int *d) //вывод полей { int i,j; printf("\n"); printf(" | 1"); for(i=2;i<9;i++)printf("%5i",i); // формирование верхней строки 1го поля с указанием номеров столбцов printf("\t\t | 1"); for(i=2;i<9;i++)printf("%5i",i); // формирование верхней строки 2го поля с указание номеров столбцов printf("\n"); printf("----------------------------------------\t\t----------------------------------------\n");
// 2 строка обоих полей for(i=0;i<8;i++) { printf("%i | ",i+1); //формирование номеров строк 1го поля for(j=0;j<8;j++) //цикл обновления первого поля
if(b[i*n+j]!=120) //проверка на использование данной ячейки поля, если она не изменена (else) то печатается тот же символ "х"(он имеет код 120 если передавать в переменную типа char) if(b[i*n+j]>15) // если попал в лису то обновит поле, если нет, то покажет сколько лис по вертикале и горизонтали, относящихся к этой ячейке printf("%1c%c%i ",76,47,b[i*n+j]-20); /* выводит ячейку в которой была лиса (попадание игрока) с остатком, (L/2) число 76 - это "L", 47 - это "/". b[i*n+j]-20 показывает остаток лис, вычитается 20 так как в цикле основной программы, выигрышная комбинация была специально увеличена на 20, для реализации условия if*/ else printf("%1i ",b[i*n+j]); // выводит количество лис по вертикале и горизонтали, относящихся к этой ячейке, используется если игрок промазал else printf("%1c ",b[i*n+j]); //выводит символ "х", так как ячейка осталась нетронута printf("\t\t%i | ",i+1); // отступ для второго поля
for(j=0;j<8;j++) //цикл обновления второго поля printf("%1c ",d[i*n+j]); //выводит символы второго поля, по которому стреляет компьютер, коды символов идут в цикле выполнения хода компьютера printf("\n\n"); //новая строчка }
void ybil(int *a,int *b, int n, int str, int sto) //функция попадания в лису
{
a[str*n+sto]=0;
b[str*n+sto]+=19;
}
/*
a-массив для поля компьютера b - массив для прорисовки поля w и d аналогично для нашего поля, c,br,dd,ww соответственные к ним указатели
kol и kol1 - это оставшееся количество лис для нас и компьютера соответственно
i,j переменные для циклов, n - количество элементов в строке, p - переменная для заполнения поля компьютера str и sto - переменные которые соответствуют номеру
строки и столбца для нашего ввода, str1 и sto2 аналогично только для компьютера shag - количество сделанных шагов kol_ybit, kolich, str_y, sto_y -
переменные для запоминания убитых лис, делается для обновления, str_s, sto_s, strel, kol_strel - аналогично предыдущих только для стреляных клеток, где не было лис
u, par,par1,par2, parz,par_isk1,par_isk2, par3 - параметр выполнения цикла while; per1 и per2 переменные участвующие в стратегии компьютера
iskl и ii -это переменные массив исключения и его индексы
*/
main()
{
int a[64],i,j,n=8,kol,kol1,*c=&a[0],s=0,p,str,sto,shag=0,kol_ybit=0,kolich[64],str_y[64],sto_y[64],str_s[64],sto_s[64],strel[64],kol_strel=0;
int b[64],d[64],*dd=&d[0],w[64],*ww=&w[0],u,str1,sto1, er, par=0, per1=-1,per2=-1, par1=0, par2=0;
int *br=&b[0],ss=0, iskl[64], ii=0, parz=0,par_isk1, par_isk2,par3;
system("cls");
system("title ohota na lis v 1.0");
system("color 21");
printf("Pole na kotorom vi bydete iskat lis nahoditsya sleva a vashe pole sprava. Ydachi!\n");
system("pause");
system("cls");
time_t t;
srand(time(&t));
for(i=0;i<64;i++)
{a[i]=0;b[i]=120;d[i]=45;w[i]=0;}