Показать сообщение отдельно
Старый 28.05.2012, 10:34   #1 (permalink)
brokilone
Member
 
Регистрация: 03.01.2012
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите доделать программу на C++, пожалуйста!

Язык C++, среда CodeBlocks
Суть задания:
1. Сначала разработать программу графической заставки, в процессе выполнения которой по графическому окну случайным образом перемещаются точки, окружности и прямоугольники.Реализовать перемещение графических объектов по прямым траекториям с разными случайными векторами скоростей. При выполнении программы на экране по прямым траекториям с разными случайными векторами скоростей должны перемещаться графические объекты, при этом векторы скоростей иногда случайным образом должны меняться. Обеспечить возможность добавления очередного объекта и удаления последнего добавленного объекта в ходе выполнения программы.
2. А дальше идет вот такое задание:
Пусть «ведущий» объект будет окружностью с радиусом, равным 2, и с цветом с кодом 10, то есть ярко-зеленый. Указатель на этот объект может быть obj[0], тогда оставшиеся объекты (со 1-го по (N-1)-й) будут «ведомыми». Поэтому «ведущий» объект должен создаваться сначала, а потом создание остальных объектов можно делать в цикле от 1 до N-1. Также надо сделать так, чтобы «ведущий» объект нельзя было удалить, и чтобы значение N всегда было не меньше 1.
Перемещение «ведущего» объекта остается без изменений, а перемеще-ние «ведомых» объектов для начала можно сделать следующим образом. Перед вызовом obj[i]->MoveXY при i>0 надо изменять значения obj[i]->vx и obj[i]->vy так, чтобы вектор скорости был направлен к «ведущему» объекту. Например, obj[i]->vx можно установить равным 10-й части разности между координатой x «ведущего» объекта и координатой x объекта obj[i] (аналогично для obj[i]->vy). После этого «ведомые» объекты будут следовать за «ведущим», но не будет требуемой случайности и «распределенности».
Для привнесения элемента случайности в перемещения «ведомых» объ-ектов надо к значениям obj[i]->vx и obj[i]->vy прибавлять небольшие случай-ные значения, например, rand()%7-3.
Для обеспечения «распределенности» надо, чтобы при вычислении obj[i]->vx и obj[i]->vy выполнялось деление не на фиксированное число (например, на 10), а на некоторое значение, свойственное объекту obj[i], то есть каждый «ведомый» объект будет приближаться на свое расстояние к «ведущему» объекту. Для этого в объект TPoint надо добавить дополнительную переменную, затем подобно переменным vx, vy эту переменную надо инициализировать в конструкторе, а также менять ее значение в случайные моменты времени. При этом значение указанной переменной рекомендуется выбирать случайным образом в диапазоне от 5 до 50.

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

Хелп, ребята. Тут наверняка найдутся добрые люди, для которых доработать программу, да еще с таким подробным заданием, не составит труда. Заранее всем спасибо!
Вот код:
#include <stdlib.h>
#include <time.h>
#include <grx20.h>
#include <grxkeys.h>
#include <stdio.h>
#include <math.h>
struct TPoint{
int x,y,vx,vy;
int color;
TPoint(int ix,int iy,int icolor);
virtual ~TPoint();
virtual void Draw(int icolor);
void Show();
void Hide();
void MoveXY(int ix, int iy);
};
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);
};

struct TCircle: public TPoint{
int r;
TCircle(int ix,int iy,int icolor,int ir);
virtual ~TCircle();
virtual void Draw(int icolor);
};

TPoint::TPoint(int ix,int iy,int icolor)
{
x=ix; y=iy;
color=icolor;
vx=rand()%17-8;
vy=rand()%17-8;
}
TPoint::~TPoint()
{
Hide();
}
void TPoint :: Draw(int icolor)
{
GrPlot(x,y,icolor);
GrPlot(x,y+1,icolor);
GrPlot(x+1,y,icolor);
GrPlot(x+1,y+1,icolor);
}
void TPoint::Show()
{
Draw(color);
}
void TPoint::Hide()
{
Draw(0);
}
void TPoint::MoveXY(int ix,int iy)
{
Hide();
if((rand()%100)==50)
{
vx=rand()%17-8;
vy=rand()%17-8;
}
if(ix>GrMaxX())
{
ix=ix-GrMaxX()-1;
}
if(ix<0)
{
ix=ix+GrMaxX()+1;
}
if(iy>GrMaxY())
{
iy=iy-GrMaxY()-1;
}
if(iy<0)
{
iy=iy+GrMaxY()+1;
}
x=ix;
y=iy;
Show();
}
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);
}

TCircle::TCircle(int ix,int iy,int icolor,int ir):
TPoint(ix,iy,icolor)
{
r=ir;
}

TCircle::~TCircle()
{
Hide();
}

void TCircle :: Draw(int icolor)
{
GrCircle(x,y,r,icolor);
}

#define M 10000
main()
{int N=10;

TPoint *obj[M];
GrSetMode(GR_width_height_graphics,1024,768);
srand(time(0));

int i;
int count;
i=0;
obj[i]=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),10 ,2);
for(i=1;i<N;i++){
count=rand()%3;
switch(count)
{case 1:
obj[i]=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,ra nd()%10,rand()%10);break;
case 2:
obj[i]=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15 ,rand()%20);break;
default:
obj[i]=new TPoint(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15) ;};
obj[i]->Show();
}
GrKeyType key;
int s;
do{
while (!GrKeyPressed()){
GrSleep(30);
for(i=0;i<N;i++){
s=rand()%100;
if (s=50)
{ obj[i]->MoveXY(obj[i]->x+obj[i]->vx,obj[i]->y+obj[i]->vy);;}
}
}
;
key=GrKeyRead();
switch(key){
case GrKey_Insert:
if (N<M){
for(i=0;i<N;i++){
count=rand()%3;
switch(count)
{case 1:
obj[N]=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,ra nd()%10,rand()%10);break;
case 2:
obj[N]=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15 ,rand()%20);break;
default:
obj[N]=new TPoint(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15) ;};
obj[i]->Show();
}

N++;
}
break;
case GrKey_Delete:
if (N>1){
delete obj[N-1];
N--;
}
break;
}

}while(key!=GrKey_Escape);
for(i=0;i<N;i++){
delete obj[i];
}
}
brokilone вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070