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

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

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

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





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

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


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

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

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


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 10.05.2007 17:29
Сообщение #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 
 К началу страницы 
+ Ответить 
Sto
сообщение 10.05.2007 18:46
Сообщение #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 
 К началу страницы 
+ Ответить 
klem4
сообщение 10.05.2007 18:48
Сообщение #4


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

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

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


Sto

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

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


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


Пионер
**

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

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


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

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


Гость






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

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


Пионер
**

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

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


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

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

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


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 10.05.2007 19:19
Сообщение #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 
 К началу страницы 
+ Ответить 
Чужак
сообщение 10.05.2007 21:42
Сообщение #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).
Понятно, как?

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


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


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

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


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

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

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


оффтоп

Внимание !

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

Поехали !

dry.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Чужак
сообщение 11.05.2007 21:21
Сообщение #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.

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


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


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

После странствий и скитаний настают другие времена.
Старая волна уходит и приходит новая волна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DeeNR
сообщение 12.05.2007 10:16
Сообщение #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 килобайт ) Кол-во скачиваний: 292
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sto
сообщение 12.05.2007 14:31
Сообщение #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

 

- Текстовая версия 20.07.2025 11:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"