• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите доделать программу на C++, пожалуйста!

brokilone

Новые
Регистрация
3 Янв 2012
Сообщения
21
Реакции
0
Баллы
0
Помогите доделать программу на C++, пожалуйста!

Язык C++, среда CodeBlocks
Суть задания:
1. Сначала разработать программу графической заставки, в процессе выполнения которой по графическому окну случайным образом перемещаются точки, окружности и прямоугольники.Реализовать перемещение графических объектов по прямым траекториям с разными случайными векторами скоростей. При выполнении программы на экране по прямым траекториям с разными случайными векторами скоростей должны перемещаться графические объекты, при этом векторы скоростей иногда случайным образом должны меняться. Обеспечить возможность добавления очередного объекта и удаления последнего добавленного объекта в ходе выполнения программы.
2. А дальше идет вот такое задание:
Пусть «ведущий» объект будет окружностью с радиусом, равным 2, и с цветом с кодом 10, то есть ярко-зеленый. Указатель на этот объект может быть obj[0], тогда оставшиеся объекты (со 1-го по (N-1)-й) будут «ведомыми». Поэтому «ведущий» объект должен создаваться сначала, а потом создание остальных объектов можно делать в цикле от 1 до N-1. Также надо сделать так, чтобы «ведущий» объект нельзя было удалить, и чтобы значение N всегда было не меньше 1.
Перемещение «ведущего» объекта остается без изменений, а перемеще-ние «ведомых» объектов для начала можно сделать следующим образом. Перед вызовом obj->MoveXY при i>0 надо изменять значения obj->vx и obj->vy так, чтобы вектор скорости был направлен к «ведущему» объекту. Например, obj->vx можно установить равным 10-й части разности между координатой x «ведущего» объекта и координатой x объекта obj (аналогично для obj->vy). После этого «ведомые» объекты будут следовать за «ведущим», но не будет требуемой случайности и «распределенности».
Для привнесения элемента случайности в перемещения «ведомых» объ-ектов надо к значениям obj->vx и obj->vy прибавлять небольшие случай-ные значения, например, rand()%7-3.
Для обеспечения «распределенности» надо, чтобы при вычислении obj->vx и obj->vy выполнялось деление не на фиксированное число (например, на 10), а на некоторое значение, свойственное объекту obj, то есть каждый «ведомый» объект будет приближаться на свое расстояние к «ведущему» объекту. Для этого в объект 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=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),10,2);
for(i=1;i<N;i++){
count=rand()%3;
switch(count)
{case 1:
obj=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,rand()%10,rand()%10);break;
case 2:
obj=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,rand()%20);break;
default:
obj=new TPoint(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15);};
obj->Show();
}
GrKeyType key;
int s;
do{
while (!GrKeyPressed()){
GrSleep(30);
for(i=0;i<N;i++){
s=rand()%100;
if (s=50)
{ obj->MoveXY(obj->x+obj->vx,obj->y+obj->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,rand()%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->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;
}
}
 
Кой-чего сама доделала, а именно вот этот пункт:
Перемещение «ведущего» объекта остается без изменений, а перемеще-ние «ведомых» объектов для начала можно сделать следующим образом. Перед вызовом obj->MoveXY при i>0 надо изменять значения obj->vx и obj->vy так, чтобы вектор скорости был направлен к «ведущему» объекту. Например, obj->vx можно установить равным 10-й части разности между координатой x «ведущего» объекта и координатой x объекта obj (аналогично для obj->vy). После этого «ведомые» объекты будут следовать за «ведущим», но не будет требуемой случайности и «распределенности».
Для привнесения элемента случайности в перемещения «ведомых» объ-ектов надо к значениям obj->vx и obj->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=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),10,2);
for(i=1;i<N;i++){
count=rand()%3;
switch(count)
{case 1:
obj=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,rand()%10,rand()%10);break;
case 2:
obj=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,rand()%20);break;
default:
obj=new TPoint(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15);};
obj->Show();
}
GrKeyType key;
int s;
do{
while (!GrKeyPressed()){
GrSleep(30);
for(i=0;i<N;i++){
s=rand()%100;
if (s=50)
{ obj->MoveXY(obj->x+obj->vx,obj->y+obj->vy);;}
}
for (i=1;i<N;i++){
obj->vx=((obj[0]->x-obj->x)/10+rand()%7-3);
obj->vy=((obj[0]->y-obj->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,rand()%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->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;
}
}
 
Почему-то Draw c двоеточиями распознается как смайл(( не обращаем внимание
 
УФФ, я все-таки ее дописала, вопрос снят :tehnari_ru_288:
 
Здравствуйте! А мог бы кто-нибудь переделать эту программу таким образом, чтобы:
1) добавился графический объект спираль;
2) Графические объекты имеют случайные размеры и перемещаются по прямым линиям со случайными скоростями, при этом
направление и скорость перемещения каждого объекта время от времени меняется случайным образом. Кроме того, каждая спираль в ходе своего перемещения плавно изменяет количество витков от минимального к максимальному и обратно, то есть постепенно закручивается, а потом постепенно раскручивается. При этом для каждой спирали скорость изменения количества витков время
от времени меняется случайным образом.
3) Любой объект при выходе за пределы экрана появляется с противоположной стороны.

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