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

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

Для порождения объекта «Прямоугольник» от объекта «Точка» для нача­ла необходимо после описания класса TPoint (то есть после фрагмента вида struct{...}) надо добавить следующий фрагмент, реализующий описание класса «Прямоугольник» (TBox).

struct TBox: public TPoint{};

Это фрагмент формирует класс TBox, порожденный от класса TPoint. При этом получается, что объект TBox не отличается от объекта TPoint, так как он наследует все компоненты объекта TPoint, хотя эти компоненты и не отобража­ются явным образом.

Добавим только то, что специфично для прямоугольника, а именно ширину и высоту прямоугольника (переменные w и h), новый виртуаль­ный метод Draw (ведь прямоугольник должен отображаться иначе, чем точка), новый конструктор TBox (так как необходимо задавать ширину и высоту при создании объекта) и новый деструктор ~ TBox (так как необходимо скрывать прямоугольник с экрана при удалении экземпляра объекта). Таким образом, описание класс TBox надо изменить следующим образом.

struct TBox: public TPoint{ int w,h;

TBox(int ix,int iy,int icolor,int iw,int ih);

virtual ~TBox();

virtual void Draw(int icolor);

};

Добавлены новый метод Draw, а также конструктор и деструктор, поэто­му необходимо раскрыть их содержимое. Таким образом, сразу после определе­ния методов класса «Точка» (то есть сразу после определения функции TPoint: :MoveXY) необходимо добавить блок определения методов класса «Пря­моугольник», то есть добавить следующий фрагмент.

TBox::TBox(int ix,int iy,int icolor,int iw,int ih): TPoint(ix,iy,icolor)

{

w=iw; h=ih;

}

TBox::~TBox()

{

Hide();

}

void TBox::Draw(int icolor)

{

GrBox(x-w/2,y-h/2,x+(w-w/2),y+(h-h/2),icolor);

}

После заголовка конструктора TBox::TBox через двоеточие указывается вызов конструктора объекта-предка, то есть конструкто­ра TPoint. Тогда внутри конструктора TBox::TBox остается только инициализи­ровать ширину и высоту прямоугольника, то есть переменные w и h.

Деструктор класса TBox полностью аналогичен деструктору класса TPoint.

Функция TBox::Draw обеспечивает рисование прямоугольника, координа­ты центра которого определяются значениями x и y, а ширина и высота опреде­ляются значениями w и h.

Фрагмент программы, реализующий создание случайных объектов, их случайные перемещения:

main()

{

srand(time(0));

GrSetMode(GR_width_height_graphics,1280,1024); // Размер окна

GrFilledBox(0,0,GrMaxX(),GrMaxY(),0); //Фон

TPoint *obj[M];

GrKeyType k;

int i,j,c=15,N=0;

do

{k=GrKeyRead();

switch(k)

{case GrKey_Space:

if (N<M)

{

j=1+rand()%4;

c=1+rand()%15;

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;

}

N++;

}

break;

case GrKey_Delete:

if (N>0)

{delete obj[N-1]; N--;}

break;}

while (!GrKeyPressed())

{

GrSleep(20);

for(i=0;i<N;i++)

{obj[i]->MoveXY(obj[i]->x+rand()%35-17,obj[i]->y+rand()%35-17);}

}}

while(k!=GrKey_Escape);

for(i=0;i<N;i++){delete obj[i];}}

  1. Создать более сложный графический объект(«змейку») на основе ранее используемых принципов объектно-ориентированного подхода;

Для создания объекта «змейка» используются стандартные функции библиотеки GRX, а именно создание полуокружностей с помощью функции GrCircleArc(). Функция GrCircleArc рисует окружность с заданными углами.

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

Далее необходимо заменить прямые линии на полуокружности и предусмотреть случайное перемещение «головы змейки», а так же изменение размеров. Для этого определение углов полуокружностей и радиусов реализовано с помощью математических функций atan() и sqrt() для который была подключена дополнительная библиотека <math.h>.

Фрагмент программы реализующей добавление объекта TSnake:

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

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

{if(icolor!=0){icolor=GrAllocColor(rand()%256,rand()%256,rand()%256);}

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]/4,y[i]+vy[i]/4,r[i]-s,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);

GrCircleArc(x[i]+vx[i]*3/4,y[i]+vy[i]*3/4,r[i]-s,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);

GrCircleArc(x[0]+vx[0]/4,y[0]+vy[0]/4,r[0]-s,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]-s,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);}

Движение «змейки» основано на принципе повторения каждым из фрагментов змейки, перемещения её «головы».

Так же по варианту задания необходимо добавить лини границ экрана от которых, «змейка» и другие более простые объекты должны «отскакивать».

Рисунок 3 – Пример «змейки».

  1. Изменить иерархию объектов, сделав главным объектом «змейку».

После создания, сложного объекта, необходимо добавить в программу созданные ранее простые графические элементы, но изменив наследование вместо TPoint используется TSnake.

Рисунок 4 – Прежняя иерархия объектов.

Новая иерархия будет приведена в следующем разделе.

Для более красочной графической заставки, в программе так же было добавлено изменение цветов всех объектов, а так же изменение цвета каждого фрагмента «змейки» во время её движения.

В результате выполнения задания была разработана программа описание которой приведено в следующем разделе.

ОПИСАНИЕ РАЗРАБОТАННОЙ ПРОГРАММЫ

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