За счет меню заставить рисунок двигаться в стороны - 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.
Решение задачи: «За счет меню заставить рисунок двигаться в стороны»
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
, которая создает кнопки на графическом дисплее и перемещает курсор по ним. - Программа завершается после выхода из цикла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д