IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача про передвижение в пределах экрана, Turbo Pascal
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Народ хэлп!
Нужно в паскале заставить фигуру двигаться в пределах экрана по определенной траектории(траектория показана на рисунке). Как делать передвижение? С помощью циклов или условий? Как сделать, чтобы двигалось в пределах экрана? Две недели мучаюсь ничего не выходит! mega_chok.gif Покопался в темах - толком ничего не нашел. Выручите плиз!!!

p.s. Фигура двигается так: из точки 0,0 по диагонали вниз (45 градусов), как только доходит до низа экрана "отскакивает" вверх, и всегда как только доходит до низа отскакивает вверх. Далее всегда как только доходит до верха опять идет по диагонали до правого предела экрана "отскакивает" и идет по горизонтали до левого предела экрана. После этого опять по диагонали. И так до бесконечности.

Сообщение отредактировано: DeeNR -


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


uses crt,graph;
var
gd, gm, x, y, dx, dy: Integer;

begin
gd := detect;
initgraph(gd, gm, '');

x := 0; y := 0;

repeat
if (y = 0) or (x = 0) then begin dx := 1; dy := 1; end
else if (y = GetMaxY) then begin dx := 0; dy := -1 end
else if (x = GetMaxX) then begin dx := -1; dy := 0; end;

inc(x, dx); inc(y, dy);

PutPixel(x, y, white); Delay(2);
until keypressed;

closegraph;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 70
Пол: Мужской
Реальное имя: Илья

Репутация: -  2  +


Вот программа которая показывает на примере движения окружности как реализовать движение в пределах экрана.
Uses
Graph, Crt;
Var
gr, gm: Integer;
MaxX, MaxY, i, x, y, dx, R :Integer;
Begin
gr := Detect;
InitGraph(gr, gm, '');
MaxX := GetMaxX;
MaxY := GetMaxY;
x := MaxX div 2;
y := MaxY div 2;
R := 20;
dx := 1;
SetColor(White);
Rectangle(0,0,MaxX,MaxY);
SetFillStyle(SolidFill,Black);
For i := 1 To 2*MaxX Do
Begin
x := x + 3*dx;
Circle(x,y,R);
Delay(15);
SetFillStyle(SolidFill,Black);
Bar(1,1,MaxX-1,MaxY-1);
If (x >= (MaxX-R)) or (x <= R) Then dx := dx*(-1);
End;
ReadKey;
CloseGraph;
End.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Sto

Ты картинку присоединенную видел ? Может пора начинать нормально читать все условия задачи ? В моем варианте осталось заменить putpixel на отрисовку нужного объекта

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 70
Пол: Мужской
Реальное имя: Илья

Репутация: -  2  +


klem4
Конечно видел.
Я показал как сделать чтобы фигура отбивалась от границ экрана, а не решенную программу.
Недумаю что изменить траэкторию будет огромной проблемой.

Сообщение отредактировано: Sto -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Недумаю что изменить траэкторию будет огромной проблемой.
Тогда почему бы не написать, скажем:
var gd, gm: integer;
begin
initgraph(gd, gm);
{ Здесь добавляем отрисовку }
readln;
closegraph;
end.
F что, я же показал, как инициализировать графику. Что, добавление траектории - проблема? Я даже показал, где надо добавлять...

Вот ты, Sto, хотел бы получить подобный ответ? А теперь будешь получать, это я тебе обещаю...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 70
Пол: Мужской
Реальное имя: Илья

Репутация: -  2  +


Цитата(DeeNR @ 10.05.2007 14:09) *

Народ хэлп!
Нужно в паскале заставить фигуру двигаться в пределах экрана по определенной траектории(траектория показана на рисунке). Как делать передвижение? С помощью циклов или условий? Как сделать, чтобы двигалось в пределах экрана? Две недели мучаюсь ничего не выходит! mega_chok.gif Покопался в темах - толком ничего не нашел. Выручите плиз!!!

p.s. Фигура двигается так: из точки 0,0 по диагонали вниз (45 градусов), как только доходит до низа экрана "отскакивает" вверх, и всегда как только доходит до низа отскакивает вверх. Далее всегда как только доходит до верха опять идет по диагонали до правого предела экрана "отскакивает" и идет по горизонтали до левого предела экрана. После этого опять по диагонали. И так до бесконечности.


Я дал ответы на эти вопросы?

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Только ты чуть-чуть упустил вот это : p.s. Фигура двигается так: из точки 0,0 по диагонали вниз (45 градусов), как только доходит до низа экрана "отскакивает" вверх, и всегда как только доходит до низа отскакивает вверх. Далее всегда как только доходит до верха опять идет по диагонали до правого предела экрана "отскакивает" и идет по горизонтали до левого предела экрана. После этого опять по диагонали. И так до бесконечности.

Настоятельно рекомендую тебе прекратить этот бессмысленный флуд. А в следующий раз думать прежде чем что-то отвечать.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


меркантильный
***

Группа: Пользователи
Сообщений: 161
Пол: Мужской

Репутация: -  6  +


Цитата(DeeNR @ 10.05.2007 15:09) *

Народ хэлп!
Нужно в паскале заставить фигуру двигаться в пределах экрана по определенной траектории(траектория показана на рисунке). Как делать передвижение? С помощью циклов или условий? Как сделать, чтобы двигалось в пределах экрана? Две недели мучаюсь ничего не выходит! mega_chok.gif Покопался в темах - толком ничего не нашел. Выручите плиз!!

Порробуй вот такой код. Не для этой задачи,
но для похожих. Переделать под твою не сложно-просто
чуть измени логику, убери часть значений пременной Napr, введи нужные тебе координаты...
program Sharik;
uses graph,crt;
var Gd, Gm, X, Y, R: Integer; Napr: string;
begin
Gd := Detect; InitGraph(Gd, Gm, ' ');
X:=320; Y:=240; R:=10; Napr:='NP';
repeat
setcolor(15);
Line(20, 40,20, 440); Line(20,40,620,40);
Line(620,40,620,440); Line(620,440,20,440);
Circle(X,Y,R);
delay(500);
setcolor(0);
Circle(X,Y,R);
if Napr='VP' then begin
X:=X+1; Y:=Y-1;
end;
if Napr='NP' then begin
X:=X+1; Y:=Y+1;
end;
if Napr='NL' then begin
X:=X-1; Y:=Y+1;
end;
if Napr='VL' then begin
X:=X-1; Y:=Y-1;
end;
if Y=40 then begin
if Napr='VP' then Napr:='NP';
if Napr='VL' then Napr:='NL';
end;
if X=620 then begin
if Napr='VP' then Napr:='VL';
if Napr='NP' then Napr:='NL';
end;
if Y=440 then begin
if Napr='NP' then Napr:='VP';
if Napr='NL' then Napr:='VL';
end;
if X=20 then begin
if Napr='VL' then Napr:='VP';
if Napr='NL' then Napr:='NP';
end;
until keypressed;
CloseGraph
end.

Да, и сделать движение вверх, вниз,
вправо, влево здесь не сложно, меняй не сразу X и Y,
а только X или только Y (X+1, Y+1, X-1, Y-1).
Понятно, как?

Сообщение отредактировано: Чужак -


--------------------
Смысл откроется тебе. Красками играя
Жизнь предстанет как поток без конца и края.


В этом мире порой разбиваютсямечты
Но чтобы он стал другой Вдруг в него приходишь ТЫ...

После странствий и скитаний настают другие времена.
Старая волна уходит и приходит новая волна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


оффтоп

Внимание !

в этой теме проводится конкурс: "Кто выложит решение максимально отдаленное от того что требуется в задании получает -2 в рейтинг !"

Поехали !

dry.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


меркантильный
***

Группа: Пользователи
Сообщений: 161
Пол: Мужской

Репутация: -  6  +


Цитата(klem4 @ 10.05.2007 23:03) *

оффтоп

Не в тему твой оффтоп.
Ты надеюсь не пользуешься нелицезионным ПО?
В любом случае тебе нужно срочно апгейтиться.
Поставь на свой компьютер лицензионные программы "OffTopMaster 6",
"ФлеймМАстер" (лучше лаборатории Рогатого-бока порет поменьше, а косорезит примерно, как у тебя) и "FloodExpert"(версия 1.6) компании "Bla Bla Bla Techocom Inc. (USA)".
Их вместе с деньгами можно скачать
с сайта www.nagimaesh_ety_ssilky_polyshaesh_lesopilky.vru.

Сообщение отредактировано: Чужак -


--------------------
Смысл откроется тебе. Красками играя
Жизнь предстанет как поток без конца и края.


В этом мире порой разбиваютсямечты
Но чтобы он стал другой Вдруг в него приходишь ТЫ...

После странствий и скитаний настают другие времена.
Старая волна уходит и приходит новая волна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


всем кто участвовал в решении этой задачи большое спасибо!!! good.gif

отдельное спасибо klem4!

появилась другая проблема. у меня не получается сделать так, чтобы код(взял код klem4) работал у меня в программе.то идет по диагонали, не "видя" нижнего предела экрана, то вообще не двигается.раньше думал, что проблема в условиях. теперь вроде все правильно, но все равно не работает. mega_chok.gif
Вообщем выкладываю листинг проги(вернее модуля) с которым проблемы. Может кто-нибудь разбереться.


unit ULABRAB;
interface
uses Graph,Crt,UVIDEO,UDIAGRAM;
type

{здесь все работает(убрал для уменьшения объема)}

PMyFigure4=^TMyFigure4;
TMyFigure4=object(TMyFigure3)
private
s:boolean; xf,yf:integer;
public
constructor init(axf,ayf:integer; ar:word; acolor_fig:byte);
procedure moveTraject(at:integer);
procedure dx_dy(dxfig,dyfig:integer); virtual;
end;

implementation
{здесь все работает(убрал для уменьшения объема)}

constructor TMyFigure4.init(axf,ayf:integer; ar:word; acolor_fig:byte);
begin
if (axf<0) or (axf>Video.getXmax) then xf:=(Video.getXmax div 2)
else xf:=axf;
if (ayf<0) or (ayf>Video.getYmax) then yf:=(Video.getYmax div 2)
else yf:=ayf;
inherited init(xf,yf,ar,acolor_fig);
s:=true
end;

procedure TMyFigure4.moveTraject(at:integer);

{здесь расчет передвижения}

procedure TMyFigure4.dx_dy(dxfig,dyfig:integer);
begin
inherited dx_dy(dxfig,dyfig);
end;
end.




поясню: xf,yf - координаты "старта" прорисовки фируры, r - радиус, at - скорость передвижения фигуры. Эти параметры и цвет задает пользователь.

p.s. на всякий случай выкладываю всю прогу.









Прикрепленные файлы
Прикрепленный файл  прога.txt ( 7.96 килобайт ) Кол-во скачиваний: 496
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 70
Пол: Мужской
Реальное имя: Илья

Репутация: -  2  +


Можеш посмотреть как на примере окружности можно сделать движение по заданой тобой траэктории.
Uses
Graph, Crt;
Var
gr, gm: Integer;
MaxX, MaxY, i, x, y, dx, dy, R :Integer;
Begin
gr := Detect;
InitGraph(gr, gm, '');
MaxX := GetMaxX;
MaxY := GetMaxY;
R := 20;
x := R;
y := R;
dx := 3;
dy := 3;
SetColor(White);
Rectangle(0,0,MaxX,MaxY);
SetFillStyle(SolidFill,Black);
For i := 1 To 2000 Do
Begin
x := x + dx;
y := y + dy;
Circle(x,y,R);
Delay(5);
SetFillStyle(SolidFill,Black);
Bar(1,1,MaxX-1,MaxY-1);
If (x >= (MaxX-R)) Then Begin dx := dx*(-1); dy := 0; End;
If (x <= R) Then Begin dx := dx*(-1); dy := 3; End;
If (y >= (MaxY-R)) Then Begin dy := dy*(-1); dx := 0; End;
If (y <= R) Then Begin dy := dy*(-1); dx := 3; End;
End;
ReadKey;
CloseGraph;
End.

Код не сложный думаю сможеш разобратся, если возникнут вопросы спрашивай.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 6:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name