Графика: Как сделать так, чтобы персонаж не мог проходить, пересекать стены? - Pascal ABC
Формулировка задачи:
Пожалуйста, помогите с примером хотя бы для 1 стены, дальше я сам по аналогии сделаю.
Код:
Код весь, просто некоторые буквы сначала прозрачные. Не знаю почему так. Выделите код и убедитесь, что он нормальный и полный.
- Program Labirint;
- Uses GraphABC, Crt;
- Procedure Pers(x,y,r:integer);
- Begin
- SetPenColor(clRed);
- SetPenWidth(2);
- Circle(x,y,r);
- FloodFill(x,y,clRed);
- End;
- Procedure Lab;
- Begin
- SetPenWidth(1);
- SetPenColor(clBlack);
- Rectangle(50,0,100,150);
- Rectangle(0,200,100,250);
- Rectangle(0,300,50,450);
- Rectangle(50,400,100,450);
- Rectangle(50,500,100,700);
- Rectangle(100,550,200,600);
- Rectangle(150,0,350,50);
- Rectangle(250,50,300,100);
- Rectangle(150,100,200,350);
- Rectangle(200,150,400,200);
- Rectangle(350,100,400,300);
- Rectangle(400,0,450,150);
- Rectangle(250,250,300,450);
- Rectangle(150,400,300,450);
- Rectangle(150,400,200,500);
- Rectangle(250,500,350,550);
- Rectangle(150,650,300,700);
- Rectangle(250,600,450,650);
- Rectangle(350,350,450,400);
- Rectangle(400,350,450,550);
- Rectangle(450,450,600,500);
- Rectangle(500,0,650,50);
- Rectangle(500,100,550,250);
- Rectangle(450,200,500,300);
- Rectangle(550,200,600,400);
- Rectangle(500,350,600,400);
- Rectangle(500,550,550,700);
- Rectangle(550,600,600,650);
- Rectangle(600,100,750,150);
- Rectangle(650,100,700,250);
- Rectangle(700,50,850,100);
- Rectangle(700,200,750,400);
- Rectangle(650,350,700,500);
- Rectangle(700,450,750,700);
- Rectangle(650,550,700,600);
- Rectangle(650,650,700,700);
- Rectangle(950,0,1000,50);
- Rectangle(900,50,1000,100);
- Rectangle(900,50,950,200);
- Rectangle(800,150,950,200);
- Rectangle(900,250,950,400);
- Rectangle(800,350,1000,400);
- Rectangle(800,350,850,450);
- Rectangle(750,500,950,550);
- Rectangle(900,450,950,550);
- Rectangle(800,600,1000,650);
- Rectangle(750,250,850,300);
- Rectangle(100,300,150,350);
- SetPenColor(clGreen);
- Rectangle(0,0,50,50);
- Rectangle(950,650,1000,700);
- FloodFill(75,30,clBlack);
- FloodFill(75,430,clBlack);
- FloodFill(75,230,clBlack);
- FloodFill(75,530,clBlack);
- FloodFill(30,370,clBlack);
- FloodFill(375,170,clBlack);
- FloodFill(375,375,clBlack);
- FloodFill(375,625,clBlack);
- FloodFill(170,30,clBlack);
- FloodFill(170,230,clBlack);
- FloodFill(170,430,clBlack);
- FloodFill(170,580,clBlack);
- FloodFill(170,680,clBlack);
- FloodFill(420,75,clBlack);
- FloodFill(420,420,clBlack);
- FloodFill(470,250,clBlack);
- FloodFill(470,470,clBlack);
- FloodFill(270,80,clBlack);
- FloodFill(270,160,clBlack);
- FloodFill(270,300,clBlack);
- FloodFill(270,430,clBlack);
- FloodFill(270,530,clBlack);
- FloodFill(270,630,clBlack);
- FloodFill(530,25,clBlack);
- FloodFill(530,150,clBlack);
- FloodFill(530,150,clBlack);
- FloodFill(530,480,clBlack);
- FloodFill(530,630,clBlack);
- FloodFill(580,300,clBlack);
- FloodFill(580,480,clBlack);
- FloodFill(580,630,clBlack);
- FloodFill(630,130,clBlack);
- FloodFill(670,130,clBlack);
- FloodFill(670,440,clBlack);
- FloodFill(670,580,clBlack);
- FloodFill(670,670,clBlack);
- FloodFill(730,75,clBlack);
- FloodFill(730,130,clBlack);
- FloodFill(730,300,clBlack);
- FloodFill(730,550,clBlack);
- FloodFill(830,180,clBlack);
- FloodFill(830,400,clBlack);
- FloodFill(830,530,clBlack);
- FloodFill(830,630,clBlack);
- FloodFill(930,100,clBlack);
- FloodFill(930,170,clBlack);
- FloodFill(930,300,clBlack);
- FloodFill(930,380,clBlack);
- FloodFill(930,500,clBlack);
- FloodFill(970,30,clBlack);
- FloodFill(970,80,clBlack);
- FloodFill(560,380,clBlack);
- FloodFill(800,270,clBlack);
- FloodFill(125,325,clBlack);
- FloodFill(1,1,clGreen);
- FloodFill(980,680,clGreen);
- End;
- Var x,y,r,d:integer; k:char;
- Begin
- SetWindowSize(1000,700);
- Hidecursor;
- x:=25;
- y:=25;
- r:=10;
- Lab;
- Pers(x,y,r);
- Lockdrawing;
- Repeat
- If Keypressed then
- Begin
- k:=readkey;
- If k=#80 then
- Begin
- Clearwindow;
- If y>Windowheight-2*r then d:=0
- else d:=15;
- y:=y+d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- End;
- If k=#72 then
- Begin
- Clearwindow;
- If y<2*r then d:=0
- else d:=15;
- y:=y-d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- End;
- If k=#75 then
- Begin
- Clearwindow;
- If x>windowwidth-2*r then d:=0
- else d:=15;
- x:=x+d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- End;
- If k=#77 then
- Begin
- Clearwindow;
- If x<2*r then d:=0
- else d:=15;
- x:=x-d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- End;
- if k=#27 then Exit;
- End;
- Until k=#27;
- End.
Решение задачи: «Графика: Как сделать так, чтобы персонаж не мог проходить, пересекать стены?»
- program Labirint;
- uses GraphABC, Crt;
- Procedure Pers(x,y,r:integer);
- Begin
- SetPenColor(clRed);
- SetBrushColor(clRed);
- Circle(x,y,r);
- End;
- procedure Lab;
- begin
- SetPenColor(clBlack);
- SetBrushColor(clBlack);
- Rectangle(50,0,100,150);
- Rectangle(0,200,100,250);
- Rectangle(0,300,50,450);
- Rectangle(50,400,100,450);
- Rectangle(50,500,100,700);
- Rectangle(100,550,200,600);
- Rectangle(150,0,350,50);
- Rectangle(250,50,300,100);
- Rectangle(150,100,200,350);
- Rectangle(200,150,400,200);
- Rectangle(350,100,400,300);
- Rectangle(400,0,450,150);
- Rectangle(250,250,300,450);
- Rectangle(150,400,300,450);
- Rectangle(150,400,200,500);
- Rectangle(250,500,350,550);
- Rectangle(150,650,300,700);
- Rectangle(250,600,450,650);
- Rectangle(350,350,450,400);
- Rectangle(400,350,450,550);
- Rectangle(450,450,600,500);
- Rectangle(500,0,650,50);
- Rectangle(500,100,550,250);
- Rectangle(450,200,500,300);
- Rectangle(550,200,600,400);
- Rectangle(500,350,600,400);
- Rectangle(500,550,550,700);
- Rectangle(550,600,600,650);
- Rectangle(600,100,750,150);
- Rectangle(650,100,700,250);
- Rectangle(700,50,850,100);
- Rectangle(700,200,750,400);
- Rectangle(650,350,700,500);
- Rectangle(700,450,750,700);
- Rectangle(650,550,700,600);
- Rectangle(650,650,700,700);
- Rectangle(950,0,1000,50);
- Rectangle(900,50,1000,100);
- Rectangle(900,50,950,200);
- Rectangle(800,150,950,200);
- Rectangle(900,250,950,400);
- Rectangle(800,350,1000,400);
- Rectangle(800,350,850,450);
- Rectangle(750,500,950,550);
- Rectangle(900,450,950,550);
- Rectangle(800,600,1000,650);
- Rectangle(750,250,850,300);
- Rectangle(100,300,150,350);
- SetPenColor(clGreen);
- SetbrushColor(clGreen);
- Rectangle(0,0,50,50);
- Rectangle(950,650,1000,700);
- end;
- Var x,y,r,d:integer;
- k:char;
- Begin
- SetWindowSize(1000,700);
- CenterWindow;
- Hidecursor;
- x:=25;
- y:=25;
- r:=25;
- d:=5;
- Lab;
- Pers(x,y,r);
- Lockdrawing;
- repeat
- k:=readkey;
- if k=#0 then k:=readkey; //если первый код символа=0, то определяем второй
- //коды стрелок 075,077,072,080, 72,75,77.80 это H,K,M,P
- case k of
- #80:begin
- Clearwindow;
- if (y=Windowheight-r)or (GetPixel(x,y+2*r)=clBlack) then d:=0//если край или впереди черный цвет
- else d:=50;
- y:=y+d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- end;
- #72:begin
- Clearwindow;
- If (y=r) or (Getpixel(x,y-2*r)=clBlack) then d:=0
- else d:=50;
- y:=y-d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- end;
- #75:begin
- Clearwindow;
- if (x=windowwidth-r)or (GetPixel(x+2*r,y)=clBlack)then d:=0
- else d:=50;
- x:=x+d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- end;
- #77:begin
- Clearwindow;
- if (x=r)or (GetPixel(x-2*r,y)=clBlack)then d:=0
- else d:=50;
- x:=x-d;
- Lab;
- Pers(x,y,r);
- Delay(1);
- Redraw;
- end;
- #27:exit;
- end;
- until k=#27;
- End.
Объяснение кода листинга программы
В представленном коде используется графический интерфейс GraphABC для создания окна и рисования фигур. Процесс начинается с объявления переменных x, y и r, которые представляют координаты и радиус круга, который будет нарисован. Переменная d используется для определения направления движения персонажа. Затем следует процедура Lab, которая создает прямоугольники на экране с помощью функций SetPenColor и SetBrushColor из библиотеки GraphABC. Эти прямоугольники образуют границы лабиринта, в котором будет перемещаться персонаж. Далее идет процедура Pers, которая рисует круг с заданными координатами и радиусом. Если персонаж пытается пересечь стену (то есть если его текущие координаты равны координатам границы лабиринта или если на границе есть черный цвет), то переменная d устанавливается в 0, что означает, что персонаж не может двигаться в этом направлении. В основной части программы происходит цикл, в котором считывается символ с клавиатуры. В зависимости от этого символа выполняются различные действия: перемещение влево, вправо, вверх или вниз. Если считанный символ - это символ выхода (#27), то программа завершается. Таким образом, данный код реализует игру, в которой персонаж перемещается по лабиринту, избегая пересечения стен.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д