Игра Хonix

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

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. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

ЗАКЛЮЧЕНИЕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВВЕДЕНИЕ

В данном курсовом поекте разрабатывается игровая программа Xonix. В ходе разработки проанализирована литература в области компьютерных игр (как пользовательские обзоры, так и публикации разработчиков); проработаны источники по проектированию и программированию. Построены модели предметной области и программной системы, разработана архитектура программы и проведено кодирование на языке C++.

В результате разработки получено устойчиво фукционирующее приложение, соответствующее заданию.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. АНАЛИТИЧЕСКАЯ ЧАСТЬ

 

Программа-игра XONIX способствует развитию логического мышления и скорости реакции. В игре есть условия выигрыша и проигрыша, а также таблица рекордов, что вводит игрока в стремление победить и добиться определенного рекорда, чтобы быть рекордсменом.

Разработка  мини игр является трудоемким процессом, помогающим усовершенствовать навыки работы в разработке приложений. Для создания мини игры необходимо продумать всевозможные компоненты игры и ее логику, а именно процесс взаимодействия игры с пользователем, условия выигрыша, фиксации результатов и т.п.

Это обеспечивает актуальность тематики.

Целью данной курсовой работы является написание полнофункционального приложения-игры, эмулирующей процесс работы мини-игры XONIX.

Объектом данной курсовой работы является процесс игры XONIX.

Предметом является логическая игра XONIX

Для достижения поставленной цели были поставлены следующие задачи:

1. Изучить  предметную область игры;

2. Приобрести теоретические сведения и практические навыки по работе с языком программирования;

3. Разработать классы для проекта

4. Разработать удобный и понятный для пользователя интерфейс программы;

 

 

 

 

2.КОНСТРУКТОРСКАЯ ЧАСТЬ

Данный проект состоит непосредственно из файла проекта xonix.prj,

а также вспомогательных классов  и функций.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

Листинг программы

Xonix.cpp

 

#include <conio.h>

#include <stdio.h>

#include <bios.h>

#include <iostream.h>

#include <fstream.h>

#include <iomanip.h>

#include <dos.h>

#include <graphics.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

 

//КЛАССЫ//

#include <c:\borland\xonix\vrag_cls.cpp>  //класс врага

#include <c:\borland\xonix\gero_cls.cpp>  //класс глвного героя

#include <c:\borland\xonix\mous_cls.cpp>  //класс для работы с мышью

#include <c:\borland\xonix\butt_cls.cpp>  //класс кнопки

#include <c:\borland\xonix\mess_cls.cpp>  //класс сообщение

#include <c:\borland\xonix\list_cls.cpp>  //класс списка сохранений

//ФУНКЦИИ//

 

mouse *m;

#include <c:\borland\xonix\sort_fun.cpp>  //функции сортировки списка сохранений

#include <c:\borland\xonix\fun_fun.cpp>   //функции

#include <c:\borland\xonix\game_fun.cpp>  //функция игры

 

 

void main(void)

{

if(grOk!=opengraph()) return;

 

///////////////заставка/////////////////////

cleardevice();

setcolor(1);                               //рамка

setfillstyle(1,2); bar3d(0,0,639,479,0,0); //поле

 

setpalette(10,2);   //меняем 10  на 2

 

setcolor(15);settextstyle(4,0,9);

outtextxy(150,150,"XONIX");

 

vrag *v;v=NULL; v=add_vrag(v,100,109,1);

  add_vrag(v,50,309 ,2);

  add_vrag(v,70,309 ,3);

  add_vrag(v,40,249 ,4);

  add_vrag(v,210,349,1);

  add_vrag(v,410,470,2);

  add_vrag(v,400,109,3);

  add_vrag(v,440,50 ,4);

  add_vrag(v,354,350,1);

  add_vrag(v,444,349,2);

  add_vrag(v,333,470,3);

  add_vrag(v,567,109,4);

  add_vrag(v,561,50 ,1);

  add_vrag(v,254,399,2);

  add_vrag(v,344,349,3);

  add_vrag(v,193,470,4);

  add_vrag(v,197,90 ,1);

  add_vrag(v,191,59 ,3);

 

while(!bioskey(1)) //цикл движений объектов заставки

     {

     delay(1);

     v->pos();

     }

delete(v); cleardevice();

///////////////////////////////////////////////////////////

 

m=new mouse(); //объект для рабоы с мышью

 

button_1 *s,*e,*l,*h;

int i,k=0,key=0;

 

char name[15]; int level,life; long score,time; //исп для загрузки уровня

//аргументы//x,y,размер,цв.кнопки,цв.акт,кнопки,цв.текста,цв.акт.текста

s=new button_1 ("NEW GAME", 100,350,15,7,15,8,4); s->SHOV_PL();

l=new button_1 ("LOAD SAVE",250,350,15,7,15,8,4); l->SHOV_PL();

h=new button_1 ("info",     400,350,15,7,15,8,4); h->SHOV_PL();

e=new button_1 ("exit",     550,350,15,7,15,8,4); e->SHOV_PL();

 

while(bioskey(1)) getch(); //очистим буфер клавиатуры

setcolor(15);settextstyle(4,0,11);

outtextxy(100,120,"XONIX");

m->MOUSEshov();            //показать стрелку мыши

 

 

for(;k==0;) //цикл опроса кнопок

  {

  switch(s->BUT_STATUS(m)) //опрос кнопки "start"

{

case 0:break;

case 1:

case 7181: m->MOUSEhide();

       GAME_FUN("unknown",1,skill(),0,0); //(имя,уровень,жизнь,очки)

 

       setcolor(15);settextstyle(4,0,11);

       outtextxy(100,120,"XONIX");

       e->SHOV_PL(); //показать кнопки в обратном порядке

       h->SHOV_PL();

       l->SHOV_PL();

       s->SHOV_PL();

       m->MOUSEshov();

       break;

 

case 283: k=1;break;

 

default:m->MOUSEset(l->x,l->y);

break;

}

 

 

  switch(l->BUT_STATUS(m)) //опрос кнопки "load"

{

case 0:break;

case 1:

case 7181:m->MOUSEhide();

       cleardevice();

 

       if(1==open(name,&level,&life,&score,&time))

  GAME_FUN(name,level,life,score,time);

 

       setcolor(15);settextstyle(4,0,11);

       outtextxy(100,120,"XONIX");

 

       e->SHOV_PL();

       s->SHOV_PL();

       h->SHOV_PL();

       l->SHOV_PL();

       m->MOUSEshov();

       break;

 

case 283: k=1;break;

 

default:m->MOUSEset(h->x,h->y);

break;

}

 

  switch(h->BUT_STATUS(m)) //опрос кнопки "info"

{

case 0:break;

case 1:

case 7181: m->MOUSEhide();

   cleardevice();

   settextstyle(1,0,3);

   for(i=8;;)

   {

   setcolor(i);

   outtextxy(190,100,"КУРСОВОЙ ПРОЕКТ");

    delay(100);

   outtextxy(60,120,"по предмету Программирование на тему: игра XONIX");

    delay(100);

   outtextxy(30,140,"студента 1-го курса гр.3-11ИВТ2 БГТУ");

    delay(100);

   outtextxy(170,160,"специальности ИВТ");

    delay(100);

   outtextxy(100,180,"Арсюкова Василия Николаевича.");

    delay(100);

   outtextxy(80,400,"г.Брянск 2012. ");

    delay(100);

   if(i==15)break;

   if(i==7)i=15;

   if(i==8)i=7;

   }

   e->SHOV_PL();

   while(bioskey(1)) getch(); //очистим буфер клавиатуры

 

   m->MOUSEshov();

 

   for(i=0;i<1;)

   {

   switch(e->BUT_STATUS(m)) //опрос кнопки "exit"

{

 case  0: break;

 default: m->MOUSEhide();

  cleardevice();

  setcolor(15);settextstyle(4,0,11);

  outtextxy(100,120,"XONIX");

  s->SHOV_PL();

  l->SHOV_PL();

  h->SHOV_PL();

  e->SHOV_PL();

  m->MOUSEshov();

  i=1; //выход из цикла опроса "exit"

}

 

   if(bioskey(1))      //опрос клавиши

     {

     bioskey(0);

     m->MOUSEhide();

     cleardevice();

     setcolor(15);settextstyle(4,0,11);

     outtextxy(100,120,"XONIX");

     s->SHOV_PL();

     l->SHOV_PL();

     h->SHOV_PL();

     e->SHOV_PL();

     m->MOUSEshov();

     i=1;

     }

   }

   break;

 

case  283: k=1; break; //esc

default:m->MOUSEset(e->x,e->y);

break;

}

 

  switch(e->BUT_STATUS(m)) //опрос кнопки "exit"

{

case    0: break;

case    1:

case 7181:

case  283: k=1; break;

 

default: m->MOUSEset(s->x,s->y);

 break;

}

 

 

  if(bioskey(1))     //опрос клавиши esc

    {

    key=bioskey(0);

    switch(key)

  {

  case 283: k=1;break;

  default : m->MOUSEset(s->x,s->y);

  }

 

      }

  };//f конец цикла опроса кнопок

 

m->MOUSEhide();

cleardevice();

 

setcolor(1); settextstyle(1,0,3);

outtextxy(220,400,"г.Брянск 2012. БГТУ");

delay(2000);

closegraph();

delete(m);delete(s);delete(e);delete(l);delete(h);

return;

}

 

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

VRAG_CLS

class vrag

   {

   void *temp,*img;    //указатель на память

   int color_s;

 

  public:

   int x,y,di;            //координаты

   vrag *next;         //указатель на следующий объект

 

   vrag(int a,int b,int c)         //конструктор

{

 x=a;

 y=b;

 di=c;                            //направление движения

 next=NULL;                       //на данный момент последний

 

 unsigned int size;               //содержит размер изображения

 size=imagesize(x-4,y-4,x+4,y+4); //размер

 

 color_s=getpixel(x,y);           //поставили на ? цвет

 

 if(color_s==1)                   //на синий

   {

   temp=malloc(size);             //выделить память под изоброжения

    img=malloc(size);

 

   getimage(x-4,y-4,x+4,y+4,temp);   //пишем почву в память

   setcolor(5);

   circle(x,y,4);

   setfillstyle(1,13); floodfill(x,y,5);

 

   getimage(x-4,y-4,x+4,y+4,img); //запомнить образ врага

   }

else                              //на не синий тоесть зелёный

   {

   temp=malloc(size);                //выделить память под изоброжения

    img=malloc(size);

 

   getimage(x-4,y-4,x+4,y+4,temp);   //пишем почву в память

 

   setcolor(10);

   bar3d(x-4,y-4,x+4,y+4,0,0);

   setcolor(15);

   circle(x,y,4);

   setcolor(7);

   circle(x,y,3);

   setfillstyle(1,14); floodfill(x,y,7);

 

   getimage(x-4,y-4,x+4,y+4,img);    //запоминаем образ врага

   }

}

 

  ~vrag(void)                      //деструктор

{

free(temp);

free(img );

if(next) delete(next);   //удаляет всех врагов

}

 

    int vrag::pos(void);           //измнть позицию объкта

   void vrag::VRAG_HIDE(void);     //стереть

   void vrag::VRAG_SHOV(void);     //покозать

   void vrag::VRAG_LYAP(int color);//закрасить

   };

 

void vrag::VRAG_HIDE(void)

     {

     putimage(x-4,y-4,temp,0); //рисуем почву по старым координатам

     };

 

 

void vrag::VRAG_SHOV(void)

     {

     getimage(x-4,y-4,x+4,y+4,temp);

     putimage(x-4,y-4,img,0);

     };

 

void vrag::VRAG_LYAP(int color)

     {

     if(color_s==2) //если создан на зелени то может закрашивать свою область

       {

       setfillstyle(1,color); floodfill(x,y,BLUE); //враг закрашивает под собой

       }

     if(next) next->VRAG_LYAP(color);

     }

 

 

int vrag::pos(void)           //измнть позицию объкта

     {

 

     VRAG_HIDE();

 

     switch(di)

       {

       case 1:if(getpixel(x,y+6)!=color_s)

   {

   if((getpixel(x,y+6)==0)||(getpixel(x,y+6)==3)) {VRAG_SHOV();return 1;}

   di=4;

   break;

   }

      if(getpixel(x-6,y)!=color_s)

 

   {

   if((getpixel(x-6,y)==0)||(getpixel(x-6,y)==3)) {VRAG_SHOV();return 1;}

   di=2;

   break;

   }

      if(getpixel(x-5,y+5)!=color_s)

 

   {

   if((getpixel(x-5,y+5)==0)||(getpixel(x-5,y+5)==3)) {VRAG_SHOV();return 1;}

   di=3;

   break;

   }

      x--;

      y++;

      break;

 

 

       case 2:if(getpixel(x,y+6)!=color_s)

   {

   if((getpixel(x,y+6)==0)||(getpixel(x,y+6)==3)) {VRAG_SHOV();return 1;}

   di=3;

   break;

   }

      if(getpixel(x+6,y)!=color_s)

 

  {

  if((getpixel(x+6,y)==0)||(getpixel(x+6,y)==3)) {VRAG_SHOV();return 1;}

  di=1;

  break;

  }

      if(getpixel(x+5,y+5)!=color_s)

 

  {

  if((getpixel(x+5,y+5)==0)||(getpixel(x+5,y+5)==3)) {VRAG_SHOV();return 1;}

  di=4;                                              break;

  }

      x++;

      y++;

      break;

   //

       case 3:if(getpixel(x,y-6)!=color_s)

 

   {

   if((getpixel(x,y-6)==0)||(getpixel(x,y-6)==3)) {VRAG_SHOV();return 1;}

   di=2;

   break;

   }

      if(getpixel(x+6,y)!=color_s)

 

   {

   if((getpixel(x+6,y)==0)||(getpixel(x+6,y)==3)) {VRAG_SHOV();return 1;}

   di=4;

   break;

   }

      if(getpixel(x+5,y-5)!=color_s)

 

   {

   if((getpixel(x+5,y-5)==0)||(getpixel(x+5,y-5)==3)) {VRAG_SHOV();return 1;}

   di=1;

   break;

   }

      x++;

      y--;

      break;

 

       case 4:if(getpixel(x-6,y)  !=color_s)

 

   {

   if((getpixel(x-6,y)==0)||(getpixel(x-6,y)==3)) {VRAG_SHOV();return 1;}

   di=3;

   break;

   }

      if(getpixel(x,y-6)  !=color_s)

 

   {

   if((getpixel(x,y-6)==0)||(getpixel(x,y-6)==3)) {VRAG_SHOV();return 1;}

   di=1;

   break;

   }

      if(getpixel(x-5,y-5)!=color_s)

 

   {

   if((getpixel(x-5,y-5)==0)||(getpixel(x-5,y-5)==3)) {VRAG_SHOV(); return 1;}

   di=2;

   break;

   }

      x--;

      y--;

      break;

       };

     if(next)

       {

       VRAG_SHOV();

       return next->pos();

       }

 

     VRAG_SHOV();

     return 0;  //шаг успешный

     }

 

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

MOUS_CLS

 

class mouse

     {

 

     union REGS inregs, outregs;

 

 

   public:

     int x,y,buttons;

 

     mouse()

  {

  inregs.x.ax = 0x00; // подфункция 0 - инициализация

  int86(0x33, &inregs, &outregs);

  };  //0x33 номер прерывания мыши.

 

     void MOUSEshov()

   {

   inregs.x.ax = 0x01; // подфункция 1 - показать курсор

   int86(0x33, &inregs, &outregs);

   };

 

     void MOUSEhide()

   {

   inregs.x.ax = 0x02;   //УБРАТЬ КУРСОР;

   int86(0x33, &inregs, &outregs);

   }

 

     void MOUSEstatus()

     {

     inregs.x.ax = 0x03; // подфункция 3 - получить статус мыши

     int86(0x33, &inregs, &outregs);

   x=outregs.x.cx;  //извлечь информацию

   y=outregs.x.dx;

     buttons=outregs.x.bx;

     }

 

     void MOUSEset(int x,int y)

     {

     inregs.x.ax=0x04;

     inregs.x.cx=x;

     inregs.x.dx=y;

     int86(0x33,&inregs, &outregs);

     }

 

    };

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

MESS_CLS

 

class message

    {

    int x,y,key;

    unsigned int size;

    void *image;

    button_1 *button;

    char text[20],text1[20];

   public:

 

    message(int a,int b,char *t,char *t1)

   {

   x=a;

   y=b;

   strcpy(text,t);

   strcpy(text1,t1);

   button=new button_1 ("",x,y+20,18,5,3,15,4);

   size=imagesize(x-91,y-61,x+91,y+61);   //размер

   image=malloc(size);

   }

    ~message()

   {

   delete(button);

   free(image);

   }

 

    int shov(void)

{

getimage(x-91,y-61,x+91,y+61,image);  //пишем изображения в память

 

setcolor(15); setfillstyle(1,0);

for(key=0;key<61;key++)

   {

   bar3d(x-90,y-key,x+90,y+key,0,0);

   delay(5);

   }

setcolor(7);

rectangle(x-91,y-61,x+91,y+61);

 

setcolor(15);

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

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