Как правильно реализовать непроходимость и генерацию стен в игре - PascalABC.NET
Формулировка задачи:
Я тут накодил вывод массива, рандомную генерацию стен и управление игроком(@) для игрушки.
Но во-первых, я не знаю как реализовать непроходимость стен, завести для них отдельные классы или как-то иначе.
Во-вторых, при такой генерации могут появляться непроходимые подземелья.
Решение задачи: «Как правильно реализовать непроходимость и генерацию стен в игре»
textual
Листинг программы
uses crt; const Rows = 24; Cols = 48; var mas : array [1..Rows, 1..Cols] of Byte; type tHero = class X, Y : Integer; constructor; begin (X, Y) := (1, 1); end; procedure Show; begin GoToXY(X+1, Y+1); TextColor(12); Write('@'); end; procedure left; begin if (X > 1) and (mas[Y, X-1] = 0) then X -= 1; end; procedure right; begin if (X < Cols) and (mas[Y, X+1] = 0) then X += 1; end; procedure up; begin if (Y > 1) and (mas[Y-1, X] = 0) then Y -= 1; end; procedure down; begin if (Y < Rows) and (mas[Y+1, X] = 0) then Y += 1; end; end; var hero : tHero; procedure Init; begin System.Console.WindowHeight := 27; Randomize; for var Row := 1 to Rows do for var Col := 1 to Cols do mas[Row, Col] := Random(2); mas[1, 1] := 0; hero := New tHero; hidecursor; end; procedure Show; begin TextColor(7); GoToXY(1, 1); WriteLn('Ш'*(Cols+2)); for var Row := 1 to Rows do begin Write('Ш'); for var Col := 1 to Cols do case mas[Row, Col] of 0 : Write(' '); 1 : Write('#'); end; WriteLn('Ш'); end; WriteLn('Ш'*(Cols+2)); hero.Show; end; begin Init; repeat Show; case ReadKey of #37 : hero.left; #38 : hero.up; #39 : hero.right; #40 : hero.down; end; until False; end.
Объяснение кода листинга программы
- Объявлены переменные и константы, необходимые для работы игры.
- Создается класс
tHero
, который представляет героя игры и содержит его координаты. - В классе
tHero
определены методы для перемещения героя по игровому полю. - Задана процедура
Init
, которая инициализирует игровое поле случайными значениями и создает объект классаtHero
. - Определена процедура
Show
, которая отображает игровое поле и текущее положение героя. - Задана процедура
main
, которая является точкой входа в программу и содержит основной игровой цикл. - В процедуре
main
используется циклrepeat
, который продолжается до тех пор, пока игрок не введет команду для выхода из игры. - Внутри цикла
repeat
вызывается процедураShow
, чтобы отобразить текущее состояние игрового поля. - После отображения поля, программа ожидает ввода игрока с помощью функции
ReadKey
. - В зависимости от введенной команды, вызывается соответствующий метод класса
tHero
для перемещения героя. - Процедура
main
завершается, когда игрок вводит команду для выхода из игры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д