Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2010, 22:46   #1
announcer02
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 4
По умолчанию движение по заданой траектории (Pascal)

Народ, очень нужна ваша помощь
Написана программа, где корабль, движется просто прямо
Преподаватель потребовал что бы была работа со списком, уточнил, я задаю координаты, и кораблик туда двигается, и так несколько раз, то есть несколько раз должен задавать коорд
Помогите пожалуйста кто знает...
вод код
Код:
uses graph,
     crt;
var
 grDriver:integer; {draiver}
 grMode:integer;   {grafi4nuu rejum}
 grPath:string;    {misce rospolojenna drivera}
 ErrCode:integer;  {rezultat inicializacii graf rejumy}
 x, y:integer; {koordinaty korablya}
 color:word;   {kolir korablya}
 bkcolor:word; {kolir fony ekrany}
{korabel}
Procedure Korabl(x,y:integer; {koordunaty bazovoi to4ku}
                 color:word);
const
 dx=5;
 dy=5;
var
 OldColor:word;
begin
 OldColor:=GetColor; {zberegtu danuu colir}
 SetColor(color);    {vstanovutu novuu colir}

   {korpys korabla}
   MoveTo(x,y);
   LineTo(x,y-2*dy);
   LineTo(x+10*dx,y-2*dy);
   LineTo(x+11*dx,y-3*dy);
   LineTo(x+17*dx,y-3*dy);
   LineTo(x+14*dx,y);
   Lineto(x,y);
   {nadstrouka}
   Moveto(x+3*dx,y-2*dy);
   LineTo(x+4*dx,y-3*dy);
   LineTo(x+4*dx,y-4*dy);
   LineTo(x+13*dx,y-4*dy);
   LineTo(x+13*dx,y-3*dy);
   Line(x+5*dx,y-3*dy,x+9*dx,y-3*dy);
   {estakada}
   Rectangle(x+8*dx,y-4*dy,x+11*dx,y-5*dy);
   {tryba}
   Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy);
   {iluminatori}
   Circle(x+12*dx,y-2*dy,Trunc(dx/2));
   Circle(x+14*dx,y-2*dy,Trunc(dx/2));
   {ma4ta}
   Line(x+10*dx,y-5*dy,x+10*dx,y-10*dy);
   {ykrawenuya}
   MoveTo(x+17*dx,y-3*dy);
   LineTo(x+10*dx,y-10*dy);
   LineTo(x,y-2*dy);
   SetColor(OldColor);
end;
begin
grDriver:=VGA;
grMode:=VGAHi;
grPath:='d:\\bp\bgi';
InitGraph(grDriver, grMode,grPath);
ErrCode:=GraphResult;
if Errcode <> grOk then Halt(1);

x:=10;
y:=200;
color:=LightGray;
SetBkColor(Blue);
bkcolor:=GetBkColor;
repeat
 Korabl(x,y,color);
 Delay(100);
 Korabl(x,y,bkcolor);
 PutPixel(x,y,color);
 x:=x+2;
until (x>500);
OutTextXY (10,10, 'PODOROJ ZAVERWENA!))');
readln;
CloseGraph;
end.
announcer02 вне форума Ответить с цитированием
Старый 23.06.2010, 10:07   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

если сделать так, чтобы кораблик двигался к определённой координате не разворачиваясь к ней носом (т.е. как он нарисован, так и двигался вверх, вних, вбок, назад и т.д.), то это просто сделать.
(вот движение от X1, Y1 до X2.Y2:
Код:
var ...
 x1, y1, x2, y2 : extended;
 DeltaX, DeltaY : extended;
...
 {если мы решаем, что до цели кораблик дойдёт за 200 шагов,
    то вычисляем приращение}
 DeltaX := (x2 - x1)/200; 
 DeltaY := (y2 - y1)/200;
repeat
 Korabl(round(x1),round(y1),color);
 Delay(100);
 Korabl(round(x1),round(y1),bkcolor);
 PutPixel(round(x1),round(y1),color);
 x1 := x1 + DeltaX;
 y1 := y1 + DeltaY;
until ((x1>=x2) and (y1>=y2)) or KeyPressed;

{KeyPressed - чтобы по нажатию любой клавиши можно было выйти из цикла}
а вот если нужно изменять графическое изображение кораблика - это много сложнее!


p.s. а почему бы Вам не сделать так, чтобы кораблик после завершения цикла не оставался на экране?
Мне кажется, это было симпотичнее!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.06.2010, 10:52   #3
announcer02
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 4
По умолчанию ds

вообще у меня задание, сделать так, что бы после того как я задал новые координаты кораблик двигался к ним, после этого новые координаты записались в файл (!), и задается вопрос, задать новые координаты, либо выйти, вот сама задача
можно ли это так оформить?
announcer02 вне форума Ответить с цитированием
Старый 23.06.2010, 11:42   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

можно. Например, задавать координаты путём ввода величин (целых чисел X и Y).
А то, как кораблик движется - Вас устраивает?
А файл какого типа нужен? Рискну предположить - текстовый?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.06.2010, 12:28   #5
announcer02
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 4
По умолчанию

Да, координаты должны записываться в текстовый файл
Пусть движется так как и нарисован

Последний раз редактировалось announcer02; 23.06.2010 в 12:38.
announcer02 вне форума Ответить с цитированием
Старый 23.06.2010, 23:35   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

так, без особых красивостей, "в лоб":

Координаты пишутся в текстовый файл COORD.TXT (при каждом запуске перезаписывается заново)

Выход - ввод отрицательной координаты (хоть X, хоть Y).

Код:
uses graph,
     crt;
var
 grDriver:integer; {draiver}
 grMode:integer;   {grafi4nuu rejum}
 grPath:string;    {misce rospolojenna drivera}
 ErrCode:integer;  {rezultat inicializacii graf rejumy}
 x, y:integer; {koordinaty korablya}
 color:word;   {kolir korablya}
 bkcolor:word; {kolir fony ekrany}


var 
 x1, y1, x2, y2 : extended;
 DeltaX, DeltaY : extended;
 f : Text;


{korabel}
Procedure Korabl(x,y:integer; {koordunaty bazovoi to4ku}
                 color:word);
const
 dx=5;
 dy=5;
var
 OldColor:word;
begin
 OldColor:=GetColor; {zberegtu danuu colir}
 SetColor(color);    {vstanovutu novuu colir}

   {korpys korabla}
   MoveTo(x,y);
   LineTo(x,y-2*dy);
   LineTo(x+10*dx,y-2*dy);
   LineTo(x+11*dx,y-3*dy);
   LineTo(x+17*dx,y-3*dy);
   LineTo(x+14*dx,y);
   Lineto(x,y);
   {nadstrouka}
   Moveto(x+3*dx,y-2*dy);
   LineTo(x+4*dx,y-3*dy);
   LineTo(x+4*dx,y-4*dy);
   LineTo(x+13*dx,y-4*dy);
   LineTo(x+13*dx,y-3*dy);
   Line(x+5*dx,y-3*dy,x+9*dx,y-3*dy);
   {estakada}
   Rectangle(x+8*dx,y-4*dy,x+11*dx,y-5*dy);
   {tryba}
   Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy);
   {iluminatori}
   Circle(x+12*dx,y-2*dy,Trunc(dx/2));
   Circle(x+14*dx,y-2*dy,Trunc(dx/2));
   {ma4ta}
   Line(x+10*dx,y-5*dy,x+10*dx,y-10*dy);
   {ykrawenuya}
   MoveTo(x+17*dx,y-3*dy);
   LineTo(x+10*dx,y-10*dy);
   LineTo(x,y-2*dy);
   SetColor(OldColor);
end;

function InputXY(var NewX, NewY : extended; var fOut : Text) : boolean;
var s : string;
    P : Pointer;
    Size : LongInt;
begin
  Size := ImageSize(1, 1, 400, 40);
  GetMem(P, Size);
  GetImage(1, 1, 400, 40, P^);
  PutImage(1, 1, P^, XorPut);

  InputXY := false;
  Str(GetMaxX:1, s);
  repeat
    OutTextXY (1,2, 'INPUT TARGET X: (negative for Exit)     ');
    gotoxy(37,1);
    Readln(NewX);
    if NewX<0 then begin
       PutImage(1, 1, P^, NormalPut);
       Dispose(P);
       Exit;
    end;
    if NewX>GetMaxX then begin
         PutImage(1, 1, P^, NormalPut);
         OutTextXY (10,10, 'Too big! Must be less than '+s);
    end;
  until NewX<=GetMaxX;
  PutImage(1, 1, P^, NormalPut);

  Str(GetMaxY:1, s);
  repeat
    OutTextXY (1,2, 'INPUT TARGET Y: (negative for Exit)     ');
    gotoxy(37,1);
    Readln(NewY);
    if NewY<0 then begin
       PutImage(1, 1, P^, NormalPut);
       Dispose(P);
       Exit;
    end;
    if NewY>GetMaxY then begin
         PutImage(1, 1, P^, NormalPut);
         OutTextXY (10,10, 'Too big! Must be less than '+s);
    end;
  until NewY<=GetMaxY;
  PutImage(1, 1, P^, NormalPut);
  Dispose(P);

  WriteLn(fOut,'X = ',NewX:1:0,'  Y = ',NewY:1:0);

  InputXY := true;
end;

begin
grDriver:=VGA;
grMode:=VGAHi;
grPath:='d:\bp\bgi';
InitGraph(grDriver, grMode,grPath);
ErrCode:=GraphResult;
if Errcode <> grOk then Halt(1);

x1:=10;
y1:=200;
color:=LightGray;
SetBkColor(Blue);
bkcolor:=GetBkColor;

Assign(f,'Coord.txt');
Rewrite(f);
WriteLn(f,'X0 = ',X1:1:0,'  Y0 = ',Y1:1:0);
Korabl(round(x1),round(y1),color);

repeat

 if (x1>=x2) and (y1>=y2)
      or (x1<0) or (y1<0)
       or (x1>GetMaxX) or (y1>GetMaxY)  then
 begin
     Korabl(round(x1),round(y1),color);
     if Not InputXY(x2, y2, f) then Break;
     {до цели кораблик дойдёт 
         за  50 шагов, вычисляем приращение}
     DeltaX := (x2 - x1)/50;
     DeltaY := (y2 - y1)/50;
 end;

 Korabl(round(x1),round(y1),color);
 Delay(50);
 Korabl(round(x1),round(y1),bkcolor);
 PutPixel(round(x1),round(y1),color);
 x1 := x1 + DeltaX;
 y1 := y1 + DeltaY;
until KeyPressed;

Close(f);
OutTextXY (10,10, 'PODOROJ ZAVERWENA!))');
readln;
CloseGraph;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.06.2010, 00:38   #7
announcer02
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 4
По умолчанию

СПАСИБО ОГРОМНОЕ!
announcer02 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение курсора по траектории DarkHacker Помощь студентам 0 19.03.2010 18:05
Pascal Движение в графике bpystep Помощь студентам 5 05.06.2009 06:08
Движение фигуры по траектории Dgohn Общие вопросы Delphi 3 08.01.2009 09:36
движение вокруг тела по заданной траектории PADOCTb Помощь студентам 2 12.10.2008 16:39