За счет меню заставить рисунок двигаться в стороны - 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.
Объяснение кода листинга программы
Этот код написан на языке Turbo Pascal и выполняет следующие действия:
- Создает графический дисплей и инициализирует его с помощью параметров
gdиgm. - Задает начальные координаты для центра курсора (
x,y). - Вычисляет максимальные координаты по осям X и Y (
getmaxX,getmaxY). - Создает процедуру
Smail, которая рисует эллипс и окружность с заданными параметрами. - Создает процедуры
Left,Up,RightиDown, которые перемещают курсор влево, вверх, вправо и вниз соответственно. Каждая из этих процедур вызывает предыдущие процедуры для обновления положения курсора. - Создает переменную
move, которая отслеживает, был ли выполнен какой-либо ввод с клавиатуры. - В основной части программы вызываются процедуры
Left,Up,RightиDownв цикле, который продолжается до тех пор, пока не будет выполнено действиеk=#27, что означает выход из программы. - После выхода из программы вызывается процедура
menyu, которая создает кнопки на графическом дисплее и перемещает курсор по ним. - Программа завершается после выхода из цикла.