Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач / Курсовая / Курсач.doc
Скачиваний:
91
Добавлен:
09.12.2013
Размер:
176.64 Кб
Скачать

Исходный текст программы:

#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];}} // Очистка памяти

Рисунок 5 – Иерархия объектов.

Соседние файлы в папке Курсовая