Графика: Как сделать так, чтобы персонаж не мог проходить, пересекать стены? - Pascal ABC

Узнай цену своей работы

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

Приветствую. Нарисовал лабиринт и персонажа (красный круг), который должен дойти до выхода от старта. Так вот, персонаж может проходить через стены лабиринта. Как сделать так, чтобы персонаж не мог проходить, пересекать стены?

Пожалуйста, помогите с примером хотя бы для 1 стены, дальше я сам по аналогии сделаю.

Код:

Код весь, просто некоторые буквы сначала прозрачные. Не знаю почему так. Выделите код и убедитесь, что он нормальный и полный.

Листинг программы
  1. Program Labirint;
  2. Uses GraphABC, Crt;
  3. Procedure Pers(x,y,r:integer);
  4. Begin
  5. SetPenColor(clRed);
  6. SetPenWidth(2);
  7. Circle(x,y,r);
  8. FloodFill(x,y,clRed);
  9. End;
  10. Procedure Lab;
  11. Begin
  12. SetPenWidth(1);
  13. SetPenColor(clBlack);
  14. Rectangle(50,0,100,150);
  15. Rectangle(0,200,100,250);
  16. Rectangle(0,300,50,450);
  17. Rectangle(50,400,100,450);
  18. Rectangle(50,500,100,700);
  19. Rectangle(100,550,200,600);
  20. Rectangle(150,0,350,50);
  21. Rectangle(250,50,300,100);
  22. Rectangle(150,100,200,350);
  23. Rectangle(200,150,400,200);
  24. Rectangle(350,100,400,300);
  25. Rectangle(400,0,450,150);
  26. Rectangle(250,250,300,450);
  27. Rectangle(150,400,300,450);
  28. Rectangle(150,400,200,500);
  29. Rectangle(250,500,350,550);
  30. Rectangle(150,650,300,700);
  31. Rectangle(250,600,450,650);
  32. Rectangle(350,350,450,400);
  33. Rectangle(400,350,450,550);
  34. Rectangle(450,450,600,500);
  35. Rectangle(500,0,650,50);
  36. Rectangle(500,100,550,250);
  37. Rectangle(450,200,500,300);
  38. Rectangle(550,200,600,400);
  39. Rectangle(500,350,600,400);
  40. Rectangle(500,550,550,700);
  41. Rectangle(550,600,600,650);
  42. Rectangle(600,100,750,150);
  43. Rectangle(650,100,700,250);
  44. Rectangle(700,50,850,100);
  45. Rectangle(700,200,750,400);
  46. Rectangle(650,350,700,500);
  47. Rectangle(700,450,750,700);
  48. Rectangle(650,550,700,600);
  49. Rectangle(650,650,700,700);
  50. Rectangle(950,0,1000,50);
  51. Rectangle(900,50,1000,100);
  52. Rectangle(900,50,950,200);
  53. Rectangle(800,150,950,200);
  54. Rectangle(900,250,950,400);
  55. Rectangle(800,350,1000,400);
  56. Rectangle(800,350,850,450);
  57. Rectangle(750,500,950,550);
  58. Rectangle(900,450,950,550);
  59. Rectangle(800,600,1000,650);
  60. Rectangle(750,250,850,300);
  61. Rectangle(100,300,150,350);
  62. SetPenColor(clGreen);
  63. Rectangle(0,0,50,50);
  64. Rectangle(950,650,1000,700);
  65. FloodFill(75,30,clBlack);
  66. FloodFill(75,430,clBlack);
  67. FloodFill(75,230,clBlack);
  68. FloodFill(75,530,clBlack);
  69. FloodFill(30,370,clBlack);
  70. FloodFill(375,170,clBlack);
  71. FloodFill(375,375,clBlack);
  72. FloodFill(375,625,clBlack);
  73. FloodFill(170,30,clBlack);
  74. FloodFill(170,230,clBlack);
  75. FloodFill(170,430,clBlack);
  76. FloodFill(170,580,clBlack);
  77. FloodFill(170,680,clBlack);
  78. FloodFill(420,75,clBlack);
  79. FloodFill(420,420,clBlack);
  80. FloodFill(470,250,clBlack);
  81. FloodFill(470,470,clBlack);
  82. FloodFill(270,80,clBlack);
  83. FloodFill(270,160,clBlack);
  84. FloodFill(270,300,clBlack);
  85. FloodFill(270,430,clBlack);
  86. FloodFill(270,530,clBlack);
  87. FloodFill(270,630,clBlack);
  88. FloodFill(530,25,clBlack);
  89. FloodFill(530,150,clBlack);
  90. FloodFill(530,150,clBlack);
  91. FloodFill(530,480,clBlack);
  92. FloodFill(530,630,clBlack);
  93. FloodFill(580,300,clBlack);
  94. FloodFill(580,480,clBlack);
  95. FloodFill(580,630,clBlack);
  96. FloodFill(630,130,clBlack);
  97. FloodFill(670,130,clBlack);
  98. FloodFill(670,440,clBlack);
  99. FloodFill(670,580,clBlack);
  100. FloodFill(670,670,clBlack);
  101. FloodFill(730,75,clBlack);
  102. FloodFill(730,130,clBlack);
  103. FloodFill(730,300,clBlack);
  104. FloodFill(730,550,clBlack);
  105. FloodFill(830,180,clBlack);
  106. FloodFill(830,400,clBlack);
  107. FloodFill(830,530,clBlack);
  108. FloodFill(830,630,clBlack);
  109. FloodFill(930,100,clBlack);
  110. FloodFill(930,170,clBlack);
  111. FloodFill(930,300,clBlack);
  112. FloodFill(930,380,clBlack);
  113. FloodFill(930,500,clBlack);
  114. FloodFill(970,30,clBlack);
  115. FloodFill(970,80,clBlack);
  116. FloodFill(560,380,clBlack);
  117. FloodFill(800,270,clBlack);
  118. FloodFill(125,325,clBlack);
  119. FloodFill(1,1,clGreen);
  120. FloodFill(980,680,clGreen);
  121. End;
  122. Var x,y,r,d:integer; k:char;
  123. Begin
  124. SetWindowSize(1000,700);
  125. Hidecursor;
  126. x:=25;
  127. y:=25;
  128. r:=10;
  129. Lab;
  130. Pers(x,y,r);
  131. Lockdrawing;
  132. Repeat
  133. If Keypressed then
  134. Begin
  135. k:=readkey;
  136. If k=#80 then
  137. Begin
  138. Clearwindow;
  139. If y>Windowheight-2*r then d:=0
  140. else d:=15;
  141. y:=y+d;
  142. Lab;
  143. Pers(x,y,r);
  144. Delay(1);
  145. Redraw;
  146. End;
  147. If k=#72 then
  148. Begin
  149. Clearwindow;
  150. If y<2*r then d:=0
  151. else d:=15;
  152. y:=y-d;
  153. Lab;
  154. Pers(x,y,r);
  155. Delay(1);
  156. Redraw;
  157. End;
  158. If k=#75 then
  159. Begin
  160. Clearwindow;
  161. If x>windowwidth-2*r then d:=0
  162. else d:=15;
  163. x:=x+d;
  164. Lab;
  165. Pers(x,y,r);
  166. Delay(1);
  167. Redraw;
  168. End;
  169. If k=#77 then
  170. Begin
  171. Clearwindow;
  172. If x<2*r then d:=0
  173. else d:=15;
  174. x:=x-d;
  175. Lab;
  176. Pers(x,y,r);
  177. Delay(1);
  178. Redraw;
  179. End;
  180. if k=#27 then Exit;
  181. End;
  182. Until k=#27;
  183. End.

Решение задачи: «Графика: Как сделать так, чтобы персонаж не мог проходить, пересекать стены?»

textual
Листинг программы
  1. program Labirint;
  2. uses GraphABC, Crt;
  3.  
  4. Procedure Pers(x,y,r:integer);
  5. Begin
  6. SetPenColor(clRed);
  7. SetBrushColor(clRed);
  8. Circle(x,y,r);
  9. End;
  10.  
  11. procedure Lab;
  12. begin
  13. SetPenColor(clBlack);
  14. SetBrushColor(clBlack);
  15. Rectangle(50,0,100,150);
  16. Rectangle(0,200,100,250);
  17. Rectangle(0,300,50,450);
  18. Rectangle(50,400,100,450);
  19. Rectangle(50,500,100,700);
  20. Rectangle(100,550,200,600);
  21. Rectangle(150,0,350,50);
  22. Rectangle(250,50,300,100);
  23. Rectangle(150,100,200,350);
  24. Rectangle(200,150,400,200);
  25. Rectangle(350,100,400,300);
  26. Rectangle(400,0,450,150);
  27. Rectangle(250,250,300,450);
  28. Rectangle(150,400,300,450);
  29. Rectangle(150,400,200,500);
  30. Rectangle(250,500,350,550);
  31. Rectangle(150,650,300,700);
  32. Rectangle(250,600,450,650);
  33. Rectangle(350,350,450,400);
  34. Rectangle(400,350,450,550);
  35. Rectangle(450,450,600,500);
  36. Rectangle(500,0,650,50);
  37. Rectangle(500,100,550,250);
  38. Rectangle(450,200,500,300);
  39. Rectangle(550,200,600,400);
  40. Rectangle(500,350,600,400);
  41. Rectangle(500,550,550,700);
  42. Rectangle(550,600,600,650);
  43. Rectangle(600,100,750,150);
  44. Rectangle(650,100,700,250);
  45. Rectangle(700,50,850,100);
  46. Rectangle(700,200,750,400);
  47. Rectangle(650,350,700,500);
  48. Rectangle(700,450,750,700);
  49. Rectangle(650,550,700,600);
  50. Rectangle(650,650,700,700);
  51. Rectangle(950,0,1000,50);
  52. Rectangle(900,50,1000,100);
  53. Rectangle(900,50,950,200);
  54. Rectangle(800,150,950,200);
  55. Rectangle(900,250,950,400);
  56. Rectangle(800,350,1000,400);
  57. Rectangle(800,350,850,450);
  58. Rectangle(750,500,950,550);
  59. Rectangle(900,450,950,550);
  60. Rectangle(800,600,1000,650);
  61. Rectangle(750,250,850,300);
  62. Rectangle(100,300,150,350);
  63. SetPenColor(clGreen);
  64. SetbrushColor(clGreen);
  65. Rectangle(0,0,50,50);
  66. Rectangle(950,650,1000,700);
  67. end;
  68.  
  69. Var x,y,r,d:integer;
  70.     k:char;
  71. Begin
  72. SetWindowSize(1000,700);
  73. CenterWindow;
  74. Hidecursor;
  75. x:=25;
  76. y:=25;
  77. r:=25;
  78. d:=5;
  79. Lab;
  80. Pers(x,y,r);
  81. Lockdrawing;
  82. repeat
  83. k:=readkey;
  84. if k=#0 then k:=readkey; //если первый код символа=0, то определяем второй
  85.                          //коды стрелок 075,077,072,080, 72,75,77.80 это  H,K,M,P
  86. case k of
  87. #80:begin
  88.     Clearwindow;
  89.     if (y=Windowheight-r)or (GetPixel(x,y+2*r)=clBlack) then d:=0//если край или впереди черный цвет
  90.     else d:=50;
  91.     y:=y+d;
  92.     Lab;
  93.     Pers(x,y,r);
  94.     Delay(1);
  95.     Redraw;
  96.     end;
  97. #72:begin
  98.     Clearwindow;
  99.     If (y=r) or (Getpixel(x,y-2*r)=clBlack)  then d:=0
  100.     else d:=50;
  101.     y:=y-d;
  102.     Lab;
  103.     Pers(x,y,r);
  104.     Delay(1);
  105.     Redraw;
  106.     end;
  107. #75:begin
  108.     Clearwindow;
  109.     if (x=windowwidth-r)or (GetPixel(x+2*r,y)=clBlack)then d:=0
  110.     else d:=50;
  111.     x:=x+d;
  112.     Lab;
  113.     Pers(x,y,r);
  114.     Delay(1);
  115.     Redraw;
  116.     end;
  117. #77:begin
  118.     Clearwindow;
  119.     if (x=r)or (GetPixel(x-2*r,y)=clBlack)then d:=0
  120.     else d:=50;
  121.     x:=x-d;
  122.     Lab;
  123.     Pers(x,y,r);
  124.     Delay(1);
  125.     Redraw;
  126.     end;
  127. #27:exit;
  128. end;
  129. until k=#27;
  130. End.

Объяснение кода листинга программы

В представленном коде используется графический интерфейс GraphABC для создания окна и рисования фигур. Процесс начинается с объявления переменных x, y и r, которые представляют координаты и радиус круга, который будет нарисован. Переменная d используется для определения направления движения персонажа. Затем следует процедура Lab, которая создает прямоугольники на экране с помощью функций SetPenColor и SetBrushColor из библиотеки GraphABC. Эти прямоугольники образуют границы лабиринта, в котором будет перемещаться персонаж. Далее идет процедура Pers, которая рисует круг с заданными координатами и радиусом. Если персонаж пытается пересечь стену (то есть если его текущие координаты равны координатам границы лабиринта или если на границе есть черный цвет), то переменная d устанавливается в 0, что означает, что персонаж не может двигаться в этом направлении. В основной части программы происходит цикл, в котором считывается символ с клавиатуры. В зависимости от этого символа выполняются различные действия: перемещение влево, вправо, вверх или вниз. Если считанный символ - это символ выхода (#27), то программа завершается. Таким образом, данный код реализует игру, в которой персонаж перемещается по лабиринту, избегая пересечения стен.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы