Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите доделать программу на C++, пожалуйста! (http://www.tehnari.ru/f41/t74076/)

brokilone 28.05.2012 10:34

Помогите доделать программу на 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 28.05.2012 18:10

Кой-чего сама доделала, а именно вот этот пункт:
Перемещение «ведущего» объекта остается без изменений, а перемеще-ние «ведомых» объектов для начала можно сделать следующим образом. Перед вызовом 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.
Посему выкладываю заново код. Но вот распределенность не могу реализовать. Отзовитесь, прошу! Тут капельку осталось!
#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);;}
}
for (i=1;i<N;i++){
obj[i]->vx=((obj[0]->x-obj[i]->x)/10+rand()%7-3);
obj[i]->vy=((obj[0]->y-obj[i]->y)/10+rand()%7-3);}
}
;
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 28.05.2012 18:11

Почему-то Draw c двоеточиями распознается как смайл(( не обращаем внимание

Vladimir_S 28.05.2012 19:11

Цитата:

Сообщение от brokilone (Сообщение 739453)
Почему-то Draw c двоеточиями распознается как смайл(( не обращаем внимание

Поправил. :D

brokilone 30.05.2012 12:36

УФФ, я все-таки ее дописала, вопрос снят :tehnari_ru_288:

Vladimir_S 30.05.2012 12:41

Вложений: 1
Цитата:

Сообщение от brokilone (Сообщение 740378)
УФФ, я все-таки ее дописала, вопрос снят :tehnari_ru_288:

Поздравляю! Вложение 81277

Goldilocks 07.05.2014 11:05

Здравствуйте! А мог бы кто-нибудь переделать эту программу таким образом, чтобы:
1) добавился графический объект спираль;
2) Графические объекты имеют случайные размеры и перемещаются по прямым линиям со случайными скоростями, при этом
направление и скорость перемещения каждого объекта время от времени меняется случайным образом. Кроме того, каждая спираль в ходе своего перемещения плавно изменяет количество витков от минимального к максимальному и обратно, то есть постепенно закручивается, а потом постепенно раскручивается. При этом для каждой спирали скорость изменения количества витков время
от времени меняется случайным образом.
3) Любой объект при выходе за пределы экрана появляется с противоположной стороны.

Или хотя бы расскажите как реализовать требования к объекту спирали...
Пожалуйста отзовитесь!


Часовой пояс GMT +4, время: 11:23.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.