Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 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 вне форума   Ответить с цитированием

Старый 28.05.2012, 10:34
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Первым делом нужно ознакомиться с аналогичными топиками

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

Старый 28.05.2012, 18:10   #2 (permalink)
brokilone
Member
 
Регистрация: 03.01.2012
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 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   #3 (permalink)
brokilone
Member
 
Регистрация: 03.01.2012
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Почему-то Draw c двоеточиями распознается как смайл(( не обращаем внимание
brokilone вне форума   Ответить с цитированием
Старый 28.05.2012, 19:11   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,360
Сказал(а) спасибо: 289
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от brokilone Посмотреть сообщение
Почему-то Draw c двоеточиями распознается как смайл(( не обращаем внимание
Поправил.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 30.05.2012, 12:36   #5 (permalink)
brokilone
Member
 
Регистрация: 03.01.2012
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

УФФ, я все-таки ее дописала, вопрос снят
brokilone вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 30.05.2012, 12:41   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,360
Сказал(а) спасибо: 289
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от brokilone Посмотреть сообщение
УФФ, я все-таки ее дописала, вопрос снят
Поздравляю! Название: viannen_28.gif
Просмотров: 335

Размер: 27.9 Кб
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 07.05.2014, 11:05   #7 (permalink)
Goldilocks
Новичок
 
Регистрация: 07.05.2014
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.