Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание ролевой компьютерной игры 40) Переходы на другие уровни пещеры


Школа программирования

40) Программирование ролевой игры: Переходы на другие уровни пещеры

Следующий достаточно качественный этап в развитии программы - это реализация перехода на другие уровни. Это должно происходить при нахождении героя на тайле лестницы. Будем отслеживать такой процесс по нажатиям на соответствующие клавиши ">" и "<":

  k := ReadKey;
  case k of

     '>' : GoToNextLevel(+1);
     '<' : GoToNextLevel(-1);

  ...

Процедура GoToNextLevel (ее параметр - на сколько изменяется текущий уровень погружения в пещеру) будет определена в модуле Map. Она запишется крайне просто:

  { ----------------- }
  procedure GoToNextLevel(dl: Integer);
  begin
  MapGeneration(CurMap+dl);
  GenerateMonsters;
  end;

Мы просто вызываем генерацию пещеры нового уровня, а параметр (более или менее глубокий уровень) автоматически занесется в глобальную переменную CurMap в теле процедуры генерации. За генерацией карты следует процедура расстановки на карте монстров.

Сейчас у нас генерация всех пещер происходит однообразным способом. Это, конечно, неправильно, но каких-либо принципиальных модификаций нашего кода уже не потребуется. Уточнение структуры пещеры и настроек очередного игрового мира - задача не столько программиста, сколько гейм-дизайнера, поэтому мы лишь отметим ключевые моменты возможных изменений.

Какие параметры и элементы кода процедуры MapGeneration могут настраиваться и дополняться? Это, как явствует из ее текста, прежде всего вероятность распределения проходимых и непроходимых тайлов (перечень которых также желательно изменять в зависимости от уровня - где-то "рисовать" тайлами "травы" и "стен", где-то "льдом" и "снегом", где-то - "песком" и "водой" и так далее). Может быть больше или меньше ловушек и источников энергии/маны, меняется частота появления случайных предметов, возможно, наличие и число магазинов. А распределение сил противника уже будет происходить автоматически с учетом такого параметра каждого монстра, как Level.

После того, как перемещение на другой уровень произошло, окажется, что игроку нередко бывает сложно определиться с глубиной текущего погружения в пещеру. Поэтому дополним процедуру подробного вывода информации о персонаже сведениями о текущем уровне пещеры:

  { ----------------- }
  procedure ShowHeroFullInfo;
  var i: Integer;
  begin
  ClrScr;
  GoToXY(1,1);
  WriteLn(Heroes[CurHero].Name, ' , ' ,
          RaceName[Heroes[CurHero].Race], ' ' ,
          ClassName[Heroes[CurHero].Class]);
  WriteLn(STR_HEROFI_LEVEL, Heroes[CurHero].Level);
  WriteLn(STR_MAPFI_LEVEL, CurMap);
  ...

Текстовая константа:

  STR_MAPFI_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):

тут,1296.zip, 16777 байтов


(c) 2004-2006 Сергей Бобровский bobrovsky as russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное