Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
09.12.2013
Размер:
4.98 Кб
Скачать
#include <math.h>
#include <grx20.h>
#include <grxkeys.h>
#include <time.h>
#include <stdlib.h>
#define M 1000
// Объект змейка
struct TSnake
{int L,x[10],y[10],color,i,a;
double vy[10],vx[10],r[10],ugl[10],s;
TSnake(int ix,int iy,int icolor);
virtual void Draw(int icolor);
virtual void Hide(int icolor);
void Show();
void MoveXY(int ix, int iy);};
//Объект точка
struct TPoint: public TSnake
{TPoint(int ix, int iy, int icolor);
virtual void Draw(int icolor);
virtual void Hide(int icolor);};
// Объект прямоугольник
struct TBox: public TSnake
{int w,h;
TBox(int ix,int iy,int iw,int ih,int icolor);
virtual void Draw(int icolor);
virtual void Hide(int icolor);};
// Объект круг
struct TCircle: public TSnake
{int a;
TCircle(int ix,int iy,int ia,int icolor);
virtual void Draw(int icolor);
virtual void Hide(int icolor);};
// Объект элипс
struct TEllipse: public TSnake
{int xa,ya;
TEllipse(int ix,int iy,int ixa,int iya,int icolor);
virtual void Draw(int icolor);
virtual void Hide(int icolor);};
// Методы работы со змейкой
TSnake::TSnake(int ix,int iy,int icolor)
{s=1;L=3+rand()%4;
x[0]=ix;y[0]=iy;color=icolor;
vx[0]=rand()%51-25;vy[0]=rand()%51-25;
r[0]=(sqrt(pow(vx[0],2)+pow(vy[0],2)))/4;
ugl[0]=(atan(vx[0]/vy[0])*180/M_PI)*10;
for(i=0;i<L;i++)
{x[i+1]=x[i]+vx[i];y[i+1]=y[i]+vy[i];
r[i+1]=r[i];ugl[i+1]=ugl[i];
vx[i+1]=vx[i];vy[i+1]=vy[i];}}
void TSnake::Draw(int icolor)
{for(i=0;i<L;i++)
{GrCircleArc(x[i]+vx[i]/4,y[i]+vy[i]/4,r[i],ugl[i]-900,ugl[i]+900,GR_ARC_STYLE_OPEN,icolor);
GrCircleArc(x[i]+vx[i]*3/4,y[i]+vy[i]*3/4,r[i],ugl[i]+900,ugl[i]-900,GR_ARC_STYLE_OPEN,icolor);}}
void TSnake::Hide(int icolor)
{GrCircleArc(x[0]+vx[0]/4,y[0]+vy[0]/4,r[0],ugl[0]-900,ugl[0]+900,GR_ARC_STYLE_OPEN,icolor);
GrCircleArc(x[0]+vx[0]*3/4,y[0]+vy[0]*3/4,r[0],ugl[0]+900,ugl[0]-900,GR_ARC_STYLE_OPEN,icolor);}
void TSnake::Show(){Draw(color);}
void TSnake::MoveXY(int ix,int iy)
{Hide(0);
for(i=0;i<L;i++)
{x[i]=x[i+1];y[i]=y[i+1];
r[i]=r[i+1];ugl[i]=ugl[i+1];
vx[i]=vx[i+1];vy[i]=vy[i+1];}
if (ix > GrMaxX()-1 || ix < 1){vx[L] = -vx[L];}
else if (iy > GrMaxY()-1 || iy < 1){vy[L] = -vy[L];}
else{x[L]=ix;y[L]=iy;
r[L-1]=(sqrt(pow(vx[L],2)+pow(vy[L],2)))/4;
ugl[L-1]=(atan(vx[L]/vy[L])*180/M_PI)*10;}
Draw(color);}
//Методы работы с точкой
TPoint::TPoint(int ix,int iy,int icolor):
TSnake(ix,iy,icolor){}
void TPoint::Draw(int icolor)
{GrFilledCircle(x[0],y[0],2,icolor);}
void TPoint::Hide(int icolor)
{Draw(icolor);}
//Методы работы с прямоугольником
TBox::TBox(int ix,int iy,int iw,int ih,int icolor):
TSnake(ix,iy,icolor)
{w=iw; h=ih;}
void TBox::Draw(int icolor)
{GrBox(x[0]-w/2,y[0]-h/2,x[0]+w/2,y[0]+h/2,icolor);}
void TBox::Hide(int icolor)
{Draw(icolor);}
//Методы работы с кругом
TCircle::TCircle(int ix,int iy,int ia,int icolor):
TSnake(ix,iy,icolor)
{a=ia;}
void TCircle::Draw(int icolor)
{GrCircle(x[0],y[0],a,icolor);}
void TCircle::Hide(int icolor)
{Draw(icolor);}
//Методы работы с элипсом
TEllipse::TEllipse(int ix,int iy,int ixa,int iya,int icolor):
TSnake(ix,iy,icolor)
{xa=ixa;ya=iya;}
void TEllipse::Draw(int icolor)
{GrEllipse(x[0],y[0],xa,ya,icolor);}
void TEllipse::Hide(int icolor)
{Draw(icolor);}
//Главная функция
main()
{srand(time(0));
//Открытие библиотеки GRX
GrSetMode(GR_width_height_color_graphics,1280,1024,0x1000000);
GrFilledBox(0,0,GrMaxX(),GrMaxY(),0);
// Объявления пременных
TSnake *obj[M];
GrKeyType k;
int i,j,N=0,c;
//Создание объектов
do
{switch(k)
{case GrKey_Space:
    if (N<M)
    {j=5;j=1+rand()%5;
    c=GrAllocColor(rand()%256,rand()%256,rand()%256);
    switch(j)
    {case 1:
    obj[N]=new TPoint((GrMaxX()/2),(GrMaxY()/2),c);
    obj[N]->Show();break;
    case 2:
    obj[N]=new TBox((GrMaxX()/2),(GrMaxY()/2),10+rand()%20,10+rand()%20,c);
    obj[N]->Show();break;
    case 3:
    obj[N]=new TCircle((GrMaxX()/2),(GrMaxY()/2),3+rand()%10,c);
    obj[N]->Show();break;
    case 4:
    obj[N]=new TEllipse((GrMaxX()/2),(GrMaxY()/2),3+rand()%10,3+rand()%10,c);
    obj[N]->Show();break;
    case 5:
    obj[N]=new TSnake((GrMaxX()/2),(GrMaxY()/2),c);
    obj[N]->Show();break;}N++;}break;
    case GrKey_Delete:
    if (N>0)
    {obj[N-1]->Draw(0);delete obj[N-1]; N--;}break;}
//Движение объектов
while(!GrKeyPressed())
{GrSleep(20);
for(i=0;i<N;i++){
//Границы
GrHLine(1,GrMaxX()-1,1,GrAllocColor(255,255,255));
GrHLine(1,GrMaxX()-1,GrMaxY()-1,GrAllocColor(255,255,255));
GrVLine(1,1,GrMaxY()-1,GrAllocColor(255,255,255));
GrVLine(GrMaxX()-1,1,GrMaxY()-1,GrAllocColor(255,255,255));
//Частота изменения скорости
if(rand()%30==10){obj[i]->vx[obj[i]->L]=rand()%51-25;
obj[i]->vy[obj[i]->L]=rand()%51-25;
obj[i]->color=GrAllocColor(rand()%256,rand()%256,rand()%256);}
obj[i]->MoveXY(obj[i]->x[obj[i]->L]+obj[i]->vx[obj[i]->L],
obj[i]->y[obj[i]->L]+obj[i]->vy[obj[i]->L]);}}
k=GrKeyRead();}
while(k!=GrKey_Escape);
for(i=0;i<N;i++){delete obj[i];}} // Очистка памяти
Соседние файлы в папке Курсовая