Автор работы: Пользователь скрыл имя, 21 Января 2013 в 10:42, курсовая работа
В данном курсовом поекте разрабатывается игровая программа Xonix. В ходе разработки проанализирована литература в области компьютерных игр (как пользовательские обзоры, так и публикации разработчиков); проработаны источники по проектированию и программированию. Построены модели предметной области и программной системы, разработана архитектура программы и проведено кодирование на языке C++.
ВВЕДЕНИЕ
1. АНАЛИТИЧЕСКАЯ ЧАСТЬ
2. КОНСТРУКТОРСКАЯ ЧАСТЬ
2.1 Листинг программы Xonix.cpp
2.2 Листинг класса VRAG_CLS
2.3 Листинг класса MOUS_CLS
2.4 Листинг класса MESS_CLS
2.5 Листинг класса LIST_CLS
2.6 Листинг класса GERO_CLS
2.7Листинг класса BUTT_CLS
3. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
ЗАКЛЮЧЕНИЕ
settextstyle(0,0,1);
strcpy(button->text,text1);
button->SHOV_PL();
while(bioskey(1)) getch(); //очистим буфер клавиатуры
m->MOUSEshov();
while(0==button->BUT_STATUS(m)
{ //курсор не над кнопкой
if(bioskey(1)) //если нажали клавишу
{ //определяем какую
key=bioskey(0);
if(283 ==key) //esc
{
m->MOUSEhide();
hide();
return 0;
}
if(7181==key) //enter
{
m->MOUSEhide();
hide();
return 1; //от сообщения -> нажали кнопку
}
}
}
m->MOUSEhide();
hide();
return 1;
}
void TEXTS(char *a,char *b)
{
strcpy(text,a);
strcpy(text1,b);
}
void hide(void)
{
putimage(x-91,y-61,image,0);
}
};
Листинг класса
LIST_CLS
class list
{
public:
char name[15];
int level,life,act;
long score,time;
list *next;
list(list *j,char *name_,int *level_,int *life_,long *score_,long *time_)
{
strcpy(name,name_);
level=*level_;
life =*life_;
score=*score_;
time =*time_;
act=0;
next=j;
}
// Деструктурируем
~list()
{
if(next) delete(next);
}
void out(int x,int y)
{
gotoxy(x,y);
cout<<setw(15)<<setfill(' ')<<setiosflags(ios::left )<<name
<<setw(3) <<setfill(' ')<<setiosflags(ios::right)<<
<<setw(2) <<setfill(' ')<<setiosflags(ios::right)<<
<<setw(2) <<setfill('0')<<setiosflags(
<<setw(2) <<setfill('0')<<setiosflags(
<<setw(17) <<setfill(' ')<<setiosflags(ios::right)<<
if(act)//рисуем активность
{
setcolor(14);
rectangle(x*8-14, y*16-16, (x*8-13)+(53*8+6+8), (y*16-18)+16);
}
else //стираем активность
{
setcolor(0);
rectangle(x*8-14, y*16-16, (x*8-13)+(53*8+6+8), (y*16-18)+16);
}
}
void outset(int x,int y,int n,int m)
{
list *t; t=this;
int i;
for(i=1;i<n;i++)
{
if(!t->next) break;//если следующего нет то выходим
t=t->next; //следующий
}
for(i=0;i<m;i++)
{
t->out(x,y+i); //вывод
t=t->next;
if(!t) break;
}
setcolor(9);
rectangle(x*8-16, y*16-19, (x*8-13)+(53*8+6+10), (y*16-18)+(16*m+3));
setcolor(1);
rectangle(x*8-17, y*16-20, (x*8-13)+(53*8+6+11), (y*16-18)+(16*m+4));
}
};
Листинг класса
GERO_CLS
class geroi
{
void *temp,*image; //указатель на временную память,на изобр.героя
public:
int x,y,
t1_x/*наличие цели закраски*/,key,key0,flag;/*
char name[15];
long score,cur_time;
geroi(char *n,int a,int b) //конструктор
{
x=a; y=b; key=0; flag=0; score=0; s=0; cur_time=0; t1_x=0;
strcpy(name,n);
unsigned int size; //содержит размер изображения
size =imagesize(x-5,y-5,x+5,y+5); //размер
temp =malloc(size); //выделить память под изоброжения
image=malloc(size);
getimage(x-5,y-5,x+5,y+5,temp)
setcolor(2);setfillstyle(1,0);
line(x-5,y-5,x-1,y-1); line(x+1,y+1,x+5,y+5);
line(x-5,y+5,x-1,y+1); line(x+1,y-1,x+5,y-5);
sector(x+1,y-1,0,90,3,3);
sector(x-1,y-1,90,180,3,3);
sector(x-1,y+1,180,270,3,3);
sector(x+1,y+1,270,360,3,3);
getimage(x-5,y-5,x+5,y+5,
putimage(x-5,y-5,temp,0);
}
~geroi(void) //деструктор
{
free(temp);
free(image);
}
void RESET() //устанавливает исходное состояние объекта
{
x=8; y=240;
score=0; s=0; flag=0; t1_x=0; cur_time=0;// sTemp=0;
}
void geroi::pos(int n); //измнть позицию объкта
void geroi::GERO_HIDE(void); //стереть
void geroi::GERO_SHOV(void); //покозать
int geroi::GERO_FUN(vrag *v); //обработка героя
int geroi::SQUARE(); //считает площадь,вычисляет очки
void geroi::input_name(void); //запрашивает имя игрока
void geroi::out_time(void); //считает время
};
void geroi::pos(int n)
{
GERO_HIDE(); //стереть объект
if((n==1)&&(y<471)) y++; //вниз //
if((n==2)&&(y> 8)) y--; //вверх 13 //изменяем координаты
if((n==3)&&(x<492)) x++; //вправо //
if((n==4)&&(x> 8)) x--; //влево //
GERO_SHOV(); //нарисовать объект
};
void geroi::GERO_HIDE(void)
{
putimage(x-5,y-5,temp,3); //рисуем почву по старым координатам
}; //3 - чтобы небыло конфликта с белыми
void geroi::GERO_SHOV(void)
{
getimage(x-5,y-5,x+5,y+5,temp)
putimage(x-5,y-5,image,2); //2-позволяет быть невидемым на зелюном цвете
delay(1);
};
int geroi::GERO_FUN(vrag *v)
{
static int t1_y=0,
t2_x=0,t2_y=0;
if(bioskey(1))
key0=bioskey(0);
switch(key0)
{
case 283:key0=key;//чтобы после исчезновения сообщения герой продожал двигатся
return 3; //esc
case 8051:key0=key;//'s'
return 4;
}
if(flag) //защита от реверсивного наезда на хвост
{
switch(key0)
{
case 18432: if(key!=20480)
key=key0;
break;
case 20480: if(key!=18432)
key=key0;
break;
case 19712: if(key!=19200) //если не едем в лево
key=key0; //то можно ехать вправо
break;
case 19200: if(key!=19712) //если не едем в право
key=key0; //то можно ехать влево
break;
}
}
else
key=key0;
switch(key)
{
case 18432: pos(2); //команда - вверх
switch(getpixel(x,y)) //АНАЛИЗ ПОЧВЫ :)
{
case GREEN: putpixel(x,y,0); //ставим точку
if(!flag) flag=1; //пилим
if(getpixel(x-1,y)==GREEN && //если по сторонам зелёные точки
getpixel(x+1,y)==GREEN && !t1_x)
{
t1_x=x-1; t1_y=y; //устанавливаем цель
t2_x=x+1; t2_y=y;
}
else
{
if( (getpixel(t1_x,t1_y)!=2) ||
(getpixel(t2_x,t2_y)!=2) )
t1_x=0;
}
break;
case 0: t1_x=0;flag=0; return 1; //наехал на свой след
case BLUE: if(t1_x && flag) //съезд с зелёного на синий при условии что цель закраски создана
{
GERO_HIDE();
setfillstyle(1,BLUE); floodfill(x,y+1,GREEN);//
v->VRAG_LYAP(10);
if(getpixel(t1_x,t1_y)==2) //закршиваем зелёные области
{
setfillstyle(1,BLUE); floodfill(t1_x,t1_y,BLUE);
}
if(getpixel(t2_x,t2_y)==2)
{
setfillstyle(1,BLUE); floodfill(t2_x,t2_y,BLUE);
}
v->VRAG_LYAP(2);
if(SQUARE()==1)
{
GERO_SHOV();
key0=0;
t1_x=0;flag=0; //закончили
return 2;
}
GERO_SHOV();
t1_x=0;flag=0; //закончили
}
else //съезд с зелёного на синий при условии что цель закраски не создана
if(flag) //необходимо закрасить след
{
GERO_HIDE();
setfillstyle(1,BLUE);
GERO_SHOV();
flag=0;
}
break;
};
break;
case 20480: pos(1); //вниз
switch(getpixel(x,y)) //АНАЛИЗ ПОЧВЫ
{
case GREEN: putpixel(x,y,0); //ставим след
if(!flag) flag=1;
if(getpixel(x-1,y)==GREEN && //если по сторонам зелёные точки
getpixel(x+1,y)==GREEN && !t1_x)
{
t1_x=x-1; t1_y=y; //устанавливаем цель
t2_x=x+1; t2_y=y;
}
else
{
if( (getpixel(t1_x,t1_y)!=2) || (getpixel(t2_x,t2_y)!=2) ) t1_x=0;
}
break;
case 0: t1_x=0;flag=0; return 1; //наехал на свой след
case BLUE: if(t1_x && flag) //съехал с синего
{
GERO_HIDE();
setfillstyle(1,BLUE); floodfill(x,y-1,GREEN);//
v->VRAG_LYAP(10);
if(getpixel(t1_x,t1_y)==
{
setfillstyle(1,BLUE); floodfill(t1_x,t1_y,BLUE);
}
if(getpixel(t2_x,t2_y)==
{
setfillstyle(1,BLUE); floodfill(t2_x,t2_y,BLUE);
}
v->VRAG_LYAP(2);
if(SQUARE()==1)
{
GERO_SHOV();
key0=0;
t1_x=0;flag=0; //закончили
return 2;
}
GERO_SHOV();
t1_x=0;flag=0;
}
else
if(flag)
{
GERO_HIDE();
setfillstyle(1,BLUE);
GERO_SHOV();
flag=0;
}
break;
}
break;
case 19712: pos(3); //вправо
switch(getpixel(x,y))
{
case GREEN:putpixel(x,y,0); //ставим красую точку
if(!flag) flag=1;
if(getpixel(x,y-1)==GREEN && //если по сторонам синие точки
getpixel(x,y+1)==GREEN && !t1_x) //&& )!t1_x) //и цель закраски не установлена то
{
t1_x=x; t1_y=y-1;//устанавливаем цель
t2_x=x; t2_y=y+1;
}
else
{
if( (getpixel(t1_x,t1_y)!=2) || (getpixel(t2_x,t2_y)!=2) ) t1_x=0;
}
break;
case 0:t1_x=0;flag=0; return 1; //наехал на свой след
case BLUE:if(t1_x && flag) //при условии что цель закраски создана
{
GERO_HIDE();
setfillstyle(1,BLUE);
v->VRAG_LYAP(10);
if(getpixel(t1_x,t1_y)==GREEN) //
{
setfillstyle(1,BLUE); floodfill(t1_x,t1_y,BLUE);
}
if(getpixel(t2_x,t2_y)==GREEN)
{
setfillstyle(1,BLUE); floodfill(t2_x,t2_y,BLUE);
}
v->VRAG_LYAP(2);
if(SQUARE()==1)
{
GERO_SHOV();
key0=0;
t1_x=0;flag=0; //закончили
return 2;
}
GERO_SHOV();
t1_x=0;flag=0;
}
else
if(flag)
{
GERO_HIDE();
setfillstyle(1,BLUE);
GERO_SHOV();
flag=0;
}
break;
}
break;
case 19200: pos(4); //влево
switch(getpixel(x,y))
{
case GREEN:putpixel(x,y,0); //ставим красую точку
if(!flag) flag=1;
if(getpixel(x,y-1)==GREEN && //если по сторонам зелёные точки
getpixel(x,y+1)==GREEN && !t1_x)
{
t1_x=x; t1_y=y-1; //устанавливаем цель
t2_x=x; t2_y=y+1;
}
else
{
if( (getpixel(t1_x,t1_y)!=2) || (getpixel(t2_x,t2_y)!=2) ) t1_x=0;
}
break;
case 0:t1_x=0;flag=0;return 1; //наехал на свой след
case BLUE:if(t1_x && flag) //при условии что цель закраски создана
{
GERO_HIDE();
setfillstyle(1,BLUE); floodfill(x+1,y,GREEN);//
v->VRAG_LYAP(10);
if(getpixel(t1_x,t1_y)==GREEN)
{
setfillstyle(1,BLUE); floodfill(t1_x,t1_y,BLUE);
}
if(getpixel(t2_x,t2_y)==GREEN)
{
setfillstyle(1,BLUE); floodfill(t2_x,t2_y,BLUE);
}
v->VRAG_LYAP(2);
if(SQUARE()==1)
{
GERO_SHOV();
key0=0;
t1_x=0;flag=0; //закончили
return 2;
}
GERO_SHOV();
t1_x=0; flag=0;
}
else
if(flag)
{
GERO_HIDE();
setfillstyle(1,BLUE);
GERO_SHOV();
flag=0;
}
break;
}
break;
}
return 0;
};
int geroi::SQUARE()
{
static int i,j;
static long sTemp=0;
for(i=18;i<482;i=i+20)
{
for(j=18;j<462;j=j+20)
if(getpixel(i,j)==BLUE) sTemp++; //сколько отрезано на данный момент
}
score=score+(sTemp-s)*(sTemp-
s=sTemp; // s-сколько было отрезано в прошлый раз 551 - вся площадь
//обновим поле прогресса
setcolor(5);
setfillstyle(1,11); bar(511,429, 511+(123*sTemp/51)/10 ,447);
if(sTemp>510) //предел
{
sTemp=0;
return 1; //complete
}
sTemp=0;
gotoxy(65,19); cout<<setw(15)<<setfill(' ')<<setiosflags(ios::right)
<<score;
return 0;
}
void geroi::input_name(void)
{
char text[]="YOUR NAME ?";
int i, x=320,y=240;
float j;
setcolor(15); setfillstyle(1,1);
for(j=0;j<61;j++)
{
bar3d(x-j*1.5,y-j,x+j*1.5,y+j,
delay(9);
}
settextstyle(1,0,2); outtextxy(x-6*strlen(text)-4,
settextstyle(0,0,1);
gotoxy((x-60)/8,(y+30)/16);
cout<<"Name: ";
*(name)='\0';
for(i=0;;i++)
{
if(i<13) //не более 13 букв
{
*(name+i)=getch();
*(name+i+1)='\0';
if(8==*(name+i)) //есил нажали кнопку назад
{
if(i)
{
i--;
*(name+i) =' ';
*(name+i+1)='\0';
i--;
}
else //если нулевой символ "назад"
{
*(name+i) ='\0'; //то стереть его
i--;
}
}
if(13==*(name+i)) //есил нажали кнопку ENTER
{
*(name+i)='\0';
if(i>0) break;
i--;
}
}
else
{
if(8==getch())
{
i--; *(name+i)=' ';
}
i--;
}
gotoxy(((x-60)/8), (y+30)/16); cout<<"Name:"<<name;
}
}//кон функции
void geroi::out_time(void)
{
static long temp,ntime;
time(&ntime);
if(temp!=ntime) cur_time++;
temp=ntime;
gotoxy(66,23); cout<<setw(2)<<setfill('0')<<
<<cur_time/60<<" min."
<<setw(2)<<setfill('0')<<
<<cur_time%60<<" sec.";
}
Листинг класса
BUTT_CLS
class button_1 // клас кнопка
{
int key,size,color_bar,color_act_
public:
int x,y;
char text[15];
button_1(char *t,int x0,int y0,int size_,int color_bar_, int color_act_bar_,
int color_text_,int color_act_text_) //конструктор
{
strcpy(text,t); //устанавливаем текст кнопки
x=x0;
y=y0; //координаты
size=size_;
color_bar =color_bar_;
color_act_bar =color_act_bar_;
color_text =color_text_;
color_act_text=color_act_text_
}
int BUT_STATUS(mouse *m) //прин. ук. на объект мыыши возвр 1 если мышь над кнопкой
{
m->MOUSEstatus();
if( (m->x) > (x-3*size) && (m->x) < (x+3*size) //если на територии кнопки b
&& (m->y) > (y-size) && (m->y) < (y+size) ) //3- отношене 3:1
{//стрелка над кнопкой - увеличиваем кнопку
size=size+1;
m->MOUSEhide();
SHOV_ACT();
m->MOUSEshov();
delay(40);
size=size+1;
m->MOUSEhide();
SHOV_ACT();
m->MOUSEshov();
while( (m->x) > (x-3*size) && (m->x) < (x+3*size)
&& (m->y) > (y-size) && (m->y) < (y+size) ) //ждём нажаия кнопки пока стрелка над кнопкой
{
m->MOUSEstatus();
if(m->buttons==1) //проверяем нажатия левой
{
m->MOUSEhide();
BUT_HIDE();
size=size-2; // восоновим размер по нажатию
SHOV();
m->MOUSEshov();
while(m->buttons==1) //пока не отпустил
m->MOUSEstatus(); //проверяем не отпустил ли
return 1; //выход на кнопку нажали
};
if(bioskey(1))
{
key=bioskey(0);
m->MOUSEhide();
BUT_HIDE();
size=size-2; // восоновим размер по нажатию
SHOV();
m->MOUSEshov();
return key;
}
};
//востанавливаем размер после съезда с кнопки за два захода
m->MOUSEhide();
BUT_HIDE();
size=size-1;
SHOV();
m->MOUSEshov();
delay(40);
m->MOUSEhide();
BUT_HIDE();
size=size-1;
SHOV();
m->MOUSEshov();
return 0; //просто съехали с кнопки