Программирование с нуля - это совсем просто! 120) Переходы на другие уровни пещеры
Школа программирования
120) Программирование ролевой игры: Переходы на другие уровни пещеры
Напоминаю (в последний раз - больше напоминать не буду :), что открыта рассылка "Обучение программированию на Си и С++ с нуля". Содержимое той рассылке в данной рассылке НЕ дублируется. Кто решит заниматься с опозданием, позже, помогать НЕ БУДУ.
Последний выпуск по ролевой игре - был в выпуске N 113.
Следующий достаточно качественный этап в развитии программы - это реализация перехода на другие уровни. Это должно происходить при нахождении героя на тайле лестницы. Будем отслеживать такой процесс по нажатиям на соответствующие клавиши ">" и "<":
k := ReadKey; case k of
'>' : GoToNextLevel(+1);
'<' : GoToNextLevel(-1);
...
Процедура GoToNextLevel (ее параметр - на сколько изменяется текущий уровень погружения в пещеру) будет определена в модуле Map. Она запишется крайне просто:
{ ----------------- } procedure GoToNextLevel(dl: Integer); begin
MapGeneration(CurMap+dl);
GenerateMonsters; end;
Мы просто вызываем генерацию пещеры нового уровня, а параметр (более или менее глубокий уровень) автоматически занесется в глобальную переменную CurMap в теле процедуры генерации. За генерацией карты следует процедура расстановки на карте монстров.
Сейчас у нас генерация всех пещер происходит однообразным способом. Это, конечно, неправильно, но каких-либо принципиальных модификаций нашего кода уже не потребуется. Уточнение структуры пещеры и настроек очередного игрового мира - задача не столько программиста, сколько гейм-дизайнера, поэтому мы лишь отметим ключевые моменты возможных изменений.
Какие параметры и элементы кода процедуры MapGeneration могут настраиваться и дополняться? Это, как явствует из ее текста, прежде всего вероятность распределения проходимых и непроходимых тайлов (перечень которых также желательно изменять в зависимости от уровня - где-то "рисовать" тайлами "травы" и "стен", где-то "льдом" и "снегом", где-то - "песком" и "водой" и так далее). Может быть больше или меньше ловушек и источников энергии/маны, меняется частота появления случайных предметов, возможно, наличие и число
магазинов. А распределение сил противника уже будет происходить автоматически с учетом такого параметра каждого монстра, как Level.
После того, как перемещение на другой уровень произошло, окажется, что игроку нередко бывает сложно определиться с глубиной текущего погружения в пещеру. Поэтому дополним процедуру подробного вывода информации о персонаже сведениями о текущем уровне пещеры:
Отметим следующий потенциально недоработанный момент. Мы не решили, что произойдет с другими героями, когда текущий персонаж перейдет на иной уровень. Партийный аспект в игре всегда вносит достаточно серьезные сложности в подобные игры, и его всегда надо иметь в виду, расширяя функциональные возможности программы.
Обычно, когда приложение уже достаточно глубоко и детально проработано, пытаться его дорабатывать какими-то многозначными новшествами всегда опасно - это чревато потенциальными логическими ошибками. Так, не обрати мы сейчас внимание на партийный аспект, и сложно было бы сказать, что произошло в программе, когда один из героев спустился по лестнице вниз, и была сгенерирована новая карта, а затем игрок попытался бы переключиться с помощью клавиши Tab на другого персонажа, который находится "в другом измерении"...
Как быстро его можно реализовать на основе существующих алгоритмов? Договоримся для простоты, что переход к следующему, верхнему или нижнему уровню, не важно, будет возможен, только если на клетке с лестницей собралась вся партия целиком. Для этого координаты всех персонажей должны совпадать с координатами текущего героя, который уже находится на тайле с лестницей (этот контекст подразумевается в процедуре GoToNextLevel.
А где окажутся наши герои после перехода? Дополним код этой процедуры еще и поиском свободного тайла и размещения на нем всей группы.
{ ----------------- } procedure GoToNextLevel(dl: Integer); var i,x,y: Integer; begin for i := 1 to MaxHeroes do if (i <> CurHero) and
(Heroes[i].HP > 0) and
((Heroes[i].x <> Heroes[CurHero].x) or
(Heroes[i].y <> Heroes[CurHero].y)) then begin
ShowInfo(STR_NOPARTY);
Exit end;
MapGeneration(CurMap+dl);
GenerateMonsters;
FreeMapPoint(x,y); for i := 1 to MaxHeroes do begin
Heroes[i].x := x;
Heroes[i].y := y; end; end;
Текстовая константа:
STR_NOPARTY = ' Не все персонажи собраны на этом
переходе! ' ;
Далее - создаем автоматически генерируемые квесты.
Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas):
В книге рассмотрены новые возможности системы программирования Delphi 2006 и представлены нововведения в языке, оболочке, редакторе, компиляторе и отладчике. Объяснены новые технологии работы с базами данных и создания приложений для Интернета. Особое внимание уделено средствам и технологиям повышения эффективности работы программистов: рефакторингу, шаблонам проектирования, унифицированному языку UML и технологии моделирования ECO.
Издание рассчитано на программистов всех уровней подготовки. Начинающие разработчики познакомятся с удобными средствами быстрого создания программ, программисты средней квалификации изучат современные подходы к разработке сложных систем и новые средства визуального проектирования, а профессионалам будут интересны новые возможности технологий моделирования ECO III, UML 2.0 и паттернов проектирования.