За счет меню заставить рисунок двигаться в стороны - Turbo Pascal

Формулировка задачи:

Используя Процедуры нужно с помощью меню заставить рисунок двигаться влево, вправо, вверх, вниз. Как это реализовать? Не понимаю как работают процедуры ( и рисунок готов )
program zachetka;
uses crt, graph;
procedure move(x,y,a,c);
var gd,gm,k:integer;
    begin
    clrscr;
    writeln ('        ------------------------------------------------------------------------------------');
    writeln ('        і 1 - move to the left і 2 - moveto the right і 3 - move up і 4 - move down і ');
    writeln ('        ------------------------------------------------------------------------------------і ');
    writeln ('        і                                           0 - exit                        і' );
    writeln ('        -------------------------------------------------------------------------------------');
    writeln ('Please choose the option...');
    readln(k);
   
 
    {graphic}
    Detectgraph (gd,gm);
    initgraph(gd,gm,'C:tp7');
 
    {table}
    bar (120,330,360,360);
    bar (188,360,330,480);
 
    {PC}
    Line (180,240,180,330);
    Line (180,270,210,330);
    Line (172,210,202,300);
    Line (180,210,210,300);
    Line (210,300,202,300);
    Line (180,210,17,1210);
    Line (270,322,270,330);
    Line (270,322,330,330);
 
    {Chair}
    bar (420,405,510,420);
    bar (456,420,480,480);
 
    {developer}
    Line (510,405,540,300);
    Line (334,480,390,390);
    Line (390,390,510,390);
    Line (360,480,420,405);
    Line (510,390,450,240);
    Line (450,270,330,300);
    Line (330,300,310,310);
    Circle (435,195,40);
 
    ReadLN
    end.

Код к задаче: «За счет меню заставить рисунок двигаться в стороны - Turbo Pascal»

textual
uses crt,graph;
type Point=record{для центра курсора}
           x,y,x1,y1:integer;
           end;
const r=8;
var x,y:integer;
procedure Smail(c1,c2,c3:integer);
begin
setfillstyle(1,c1);
fillellipse(x,y,r,r);
setcolor(c1);
circle(x,y,r);
setcolor(c2);
setfillstyle(1,c2);
fillellipse(x-3,y-3,2,2);
fillellipse(x+3,y-3,2,2);
setcolor(c3);
Arc(x,y+5,0,180,3);
end;
 
procedure Left;
begin
repeat
delay(100);
Smail(0,0,0);
x:=x-5;
Smail(14,9,8);
until keypressed or (x<r+10);
end;
 
procedure Up;
begin
repeat
delay(100);
Smail(0,0,0);
y:=y-5;
Smail(14,9,8);
until keypressed or (y<r+40);
end;
 
procedure Right;
begin
repeat
delay(100);
Smail(0,0,0);
x:=x+5;
Smail(14,9,8);
until keypressed or (x>getmaxX-r-10);
end;
 
procedure Down;
begin
repeat
delay(100);
Smail(0,0,0);
y:=y+5;
Smail(14,9,8);
until keypressed or (y>getmaxY-r-10);
end;
 
procedure menyu;
{создание кнопок, курсора, его перемещение и условия выполнения процедур}
var x1,y1:integer;
    i,c:byte;
    a:Point; {центр курсора}
    move:boolean;
    k:char;
begin
{создание кнопок}
y1:=10;{верхний левый угол первой кнопки}
for i:=1 to 5 do
 begin
  x1:=140+80*(i-1);
  Setcolor(i+1);
  Rectangle(x1,y1,x1+80,y1+20);
  Setfillstyle(1,i+1);
  Bar(x1,y1,x1+80,y1+20);
 end;
{надписи на кнопках}
Setcolor(0);
outtextxy(165,15,'LEFT');
outtextxy(245,15,' UP');
outtextxy(325,15,'RIGHT');
outtextxy(405,15,'DOWN');
outtextxy(485,15,'Exit');
{создание и движение курсора}
a.x:=70;a.y:=20;{начало}
move:=true;
repeat
if keypressed then
 begin
  k:=readkey;
  if k=#77 then
   begin
    a.y1:=a.y;
    a.x1:=a.x;
    a.x:=a.x+80;
    if a.x>=550 then a.x:=150;
    move:=true;
   end;
  if k=#75 then
    begin
     a.y1:=a.y;
     a.x1:=a.x;
     a.x:=a.x-80;
     if a.x<=70 then a.x:=470;
     move:=true;
    end;
  if (k=#13)and (a.x=150) then Left; {knoka 1 + Enter}
  if (k=#13)and (a.x=230) then Up;
  if (k=#13)and (a.x=310) then Right;
  if (k=#13)and (a.x=390) then Down;
  if (k=#13)and (a.x=470) then k:=#27;
 end;
if move then
 begin
  if a.x1=150 then c:=2
  else if a.x1=230 then c:=3
  else if a.x1=310 then c:=4
  else if a.x1=390 then c:=5
  else if a.x1=470 then c:=6
  else c:=0;
  Setcolor(c);
  Circle(a.x1,a.y1,5);
  Setfillstyle(1,c);
  Fillellipse(a.x1,a.y1,5,5);
  Setcolor(12);
  Circle(a.x,a.y,5);
  Setfillstyle(1,12);
  Fillellipse(a.x,a.y,5,5);
  move:=false;
 end;
until k=#27;
end;
 
var gd,gm:integer;
begin
gd:=detect;
initgraph(gd,gm,'');
x:=getmaxX div 2;
y:=getmaxY div 2;
Smail(14,9,8);
menyu;
end.

13   голосов, оценка 3.769 из 5


СОХРАНИТЬ ССЫЛКУ