Игра Хonix

Автор работы: Пользователь скрыл имя, 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. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
ЗАКЛЮЧЕНИЕ

Работа состоит из  1 файл

курсовая.docx

— 1.03 Мб (Скачать документ)

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)<<level<<"    "

 

  <<setw(2) <<setfill(' ')<<setiosflags(ios::right)<<life<<"    "

 

  <<setw(2) <<setfill('0')<<setiosflags(ios::right)<<time/60<<':'

  <<setw(2) <<setfill('0')<<setiosflags(ios::right)<<time%60<<"    "

 

  <<setw(17) <<setfill(' ')<<setiosflags(ios::right)<<score<<endl;

 

      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;/*пилим*/long s;

   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,image); //пишем героя

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);floodfill(x,y+1,GREEN);//закрашиваем след

    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)==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);floodfill(x,y-1,GREEN);//закрашиваем след

   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);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);floodfill(x-1,y,GREEN);//закрашиваем след

  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);floodfill(x+1,y,GREEN);//закрашиваем след

  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);

    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,0,0);

   delay(9);

   }

 

settextstyle(1,0,2); outtextxy(x-6*strlen(text)-4,y-6-35,text);

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')<<setiosflags(ios::right)

<<cur_time/60<<" min."

<<setw(2)<<setfill('0')<<setiosflags(ios::right)

<<cur_time%60<<" sec.";

 

     }

 

 

Листинг класса

BUTT_CLS

 

 

class button_1 // клас кнопка

     {

     int key,size,color_bar,color_act_bar,color_text,color_act_text;

 

    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;    //просто съехали с кнопки

Информация о работе Игра Хonix