Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 09.01.2025, 06:30
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Уроки по созданию игр

Создание Ролевой игры РПГ на Паскале и Делфи. Урок 13

Урок 13. Выявляем ловушки, повышаем навыки

 

 

В ходе своего развития герой должен постепенно повышать свои навыки и умения. Пока мы не занимались реализацией концепции навыков, и сейчас настала пора это сделать. А начнем с мирного и полезного навыка обнаружения ловушек. Ранее мы уже подготовили для этого навыка константу skillTrapSearch, определяющую индекс текущего значения чтобы обнаруживать ловушки в массиве Skills. В качестве начального значения данного случая был занесен ноль (процедура InitHero). Правильно ли это? Не совсем. Ведь в момент вызова Процедуры InitHero мы еще ничего не знали о навыках и просто инициировали все поля структуры ТНего - инициализацию любых данных всегда нужно делать это, даже если неизвестно, как и где будут они применяться. Теперь же нам нужно заполнить подходящие элементы массива Skills более осмысленно.

 

Программе означать некоторое умение? Как правило, уровень умения в игровых умений связан с вероятностыо успешно осуществить связанное с умением действие. Чем выше уровень умения, тем выше вероятность того, что попытка выполнить нужное действие закончится удачей. В нашем случае мы непосредственно отразим параметр Skills вероятности реализуемых навыков - они будут равняться величинам от нуля пока станут означать вероятность или процент удачи. Так, значение 30 в элементе
Skills[trapSearch] говорит о том, что с вероятностью 30% попытка обнаружить скрытую ловушку будет успешна - и соответственно с вероятностью 70% завершится провалом.

 

Принципиально важно определить начальные значения навыков героя. В игровых системах используются  весьма сложные алгоритмы, связывающие профиль всех начальных параметров с автоматически генерируемой (или создаваемой сценаристами) предысторией, а также его характеристиками (чем умнее герой, тем легче ему даются навыки с магией, а чем он сильнее, тем проще ему управляться с оружием). Большое значение имеет и общая направленность героя, или так называемый класс. В популярной игре Dungeons & Dragons каждый игрок должен обязательно принадлежать одному из иных классов (воин, маг, стрелок, вор, бард), а классы в значительной степени определяются распределением начальных значений всевозможных навыков и умений. Не малое влияние на это распределение оказывает и раса героя. Так, гномы очень сильны в рукопашном бою, мастерски владеют мечами и топорами, эльфы метко стреляют, зорко выслеживают врага и возможные ловушки, из них получаются отличные волшебники. Люди обычно универсальны - их характеристики усреднены и могут совершенствоваться в самых разных направлениях. Столь гибкие и богатые возможности начальных характеристик героя позволяют прежде всего отыгрывать каждую комбинацию в неповторимом режиме, прикладывая и развивая самые разные комбинации тактик. Это придает игре завлекательную глубину и красочность.

 

Мы не стали вводить в нашу программу концепции классов и рас, хотя сделать это не принципиально. Достаточно расширить запись ТНего новыми полями (например, HeroRace и ), позволить играющему самостоятельно выбрать начальные значения расы и потом программно задать подходящий профиль навыков. Остановимся на начальной инициализации характеристик героя, а развитие программы в отношении полноценной ролевой игры оставим на потом.

Данные, связанные с начальными значениями массива Skils, внесем в процедуру InitHero. Алгоритмы мы договорились хранить в одном месте - модуле Tables. Добавим туда массив, в который поместим начальные значения навыков героя:

 

Const BaseSkill_Table:   array[1..MaxSkills]   of   Integer  =

{

, 20

30

}

 

Значение 30 (процентов) соответствует навыку рукопашного боя с. ^Яр-кием, а значение 20% - навыку обнаружения ловушек. Тогда оператор инициализации массива Skills в процедуре InitHero перепишется так:

 

for   i   :=   1   to MaxSkills  do

Skills[i]    :=  BaseSkill_Table[i];

 

В какой момент надо применять данное умение? Оно будет полезно, когда герой вступил на таил, где имеется скрытая ловушка. Такая проверка выполняется в процедуре MovcHero (модуль Game). Возможный вариант тестирования навыка может быть запрограммирован следующим образом:

 

if GameMapfCurMap].Cells[ Heroes[CurHero].x,Heroes[CurHerо].у].Tile   in TrapTileSet   then

begin

GameMapfCurMap] .Cells [   Heroes[CurHero].x,Heroe?[CurHero] .y] .Tile :=     tileGround;

if not SkillTest(Heroes[CurHero] ,    skillTrapSearch)    then

 begin

dam   :=   random(   round(Heroes[CurHero].MaxHP   *   1.1)    )   +   1; Showlnfo(STR_TRAP  +   IntToStr(abs(dam))); IncHP(   Heroes[CurHero],   -dam   );

end;

end;

 

В начале мы изменяем таил - делаем его обычным проходимым тайлом карты. Это необходимо выполнить в любом случае. Затем с помощью функции SkillTest (ее мы запрограммируем немного позже) проверяется, успешна ли попытка применения навыка обнаружения ловушки. Если она успешна, то все необходимые действия по повышению опыта и навыка героя будут выполнены внутри функции. В противном случае начнутся действия по нанесению герою повреждений - их мы уже реализовали раньше. Теперь рассмотрим, как устроена функция SkillTest. Мы поместим ее в модуль Него. В SkillTest будет реализовано сразу несколько важнейших игровых принципов. Если компилятор выдаст ошибку, проверьте, добавлены ли в Implementation-разделы ссылки на нужные подключаемые модули!

 

function   SkillTest(   var  H:   ТНего;   ski:   Integer   ):   Boolean;

var  xp:   Integer;

begin

SkillTest := false;

if random(100)+l > H.Skills[ski] then Exit;

SkillTest := true;

case ski of

skillTrapSearch: begin

Showlnfo(STR_TRAPOK); IncXP(H,   H.Level   +   random(H.Level));

SuccessSkillTest(H,   skillTrapSearch);

end;

end;

end;

 

Если случайное значение, выпавшее в диапазоне 1..100, будет больше значения нашего навыка, значит, его проверка неудачна, и функция завершает свою работу. Если же достигнут успех, то будут выполнены следующие действия: пользователь увидит сообщение об обезвреженной ловушке; повысится количество опыта героя (при этом возможен переход на новый уровень); повысится значение успешно примененного навыка. Перменную STR_TRAPOK разместим, как обычно, в модуле Texts:

 

Const STR_TRAPOK =   '   Вы обезвредили ловушку!    '    ;

 

Процедуру IncXP (увеличить опыт) реализуем в текущем модуле Hero.

 

Procedure IncXP(   var  H:   THero;   axp:   Integer   );

Begin

…(H.EXP,axp);

..into(STR_ADD_EXP   +   IntToStr(axp));

If H.EXP > H.MaxExp   then

Begin

H.Exp:=0;

 

В тот момент когда набранное количество опыта при повышении уровня героя является не совсем корректен. Более точным будет подход, когда излишек (превышение значения ХР над текущим максимальным значением МахХР) не исчезнет, а просто генерируется в соответствии с пропорцией старого и нового значений МахХР.

 

Я предоставлю эту задачку читателям.

 

Повышение уровня мастерства реализуется в процедуре SuccessSkillTesl. Она записывается в THero и должна повышать уровень определенного навыка. Однако реализация этого подразумевает увеличение значения соответствующего элемента массива Skills. Значение нельзя увеличивать каждый раз после успешной попытки реализации навыка, иначе оно быстро вырастет выше 100 (процентов), и совершенствование потеряет смысл. Можно сделать так: задать тип элементов Skills не Integer, a Real, и повышать значение на 1 (минимально допустимое целое положительное значение в Iriteger), а не на небольшую величину - например, 0.001, подобрав с его помощью оптимальный темп для навыка. Хотя этот вариант во всех отношениях неплохой, мы поступим по другому – для того, чтобы продемонстрировать еще один способ. Увеличение навыка на 1 будет происходить не каждый раз, а случайно. Главное - правильно определить вероятность повышения, чтобы рост мастерства происходил не слишком быстро или медленно. Прикинем, каким может быть такая вероятность. На карте у нас в 12*32/100=10 ловушек, так как одна ловушка размещается на участке" 10 на 10. Глубину лабиринта мы выбрали равной четырем локациям (константа DongeonLevel), таким образом герой теоретически может выполнить 10*4 = 40 тестов навыка обнаружения ловушек. В принципе начальное значение 20 навыка

 

TrapSearch допускает повышение на один процент, так как даже абсолютный мастер ловушек в таком случае сможет повысить свой навык (вероятность) успешного обнаружения до 60%, что не так уж и много. Однако если глубина пещеры увеличится,  до 40 уровней (такой порядок типичен для популярных бродилок), герой сможет выполнять проверку. Поэтому в демонстрационных целях ограничимся предельным значением навыка, равным 40. То есть 40 тестов должны будут принести рост навыка на 20 и вероятность такого увеличения составит 20/40 = 0,5 или 50%. Итак, будем увеличивать навык обнаружения ловушек на 1 случайным образом, с вероятностью 50%:

 

Procedure SuccessSkillTest(   var  H:   THero;   skL:   Integer);

Var and:integer;

Begin

Case skl of

SkiltrapSearch:

Begin

And:=round(20/   MaxDungeonLevel*100);

If random(100)+1    <=     rnd   then

begin

ShowInfo(STR_TRAPSKILL_OK); inc(H.Skills[skillTrapSearch]); end; end;

end;

end; Это текстовая константа (модуль Texts):

const STR_TRAPSKILL_OK = ' Навык обезвреживания ловушек повышен.    ' ;

 

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

Категория: Уроки по созданию игр | Добавил: Armageddets (11.07.2013)
Просмотров: 1161 | Комментарии: 1 | Теги: создание, делфи, программирование, RPG, Delphi, ролевая игра | Рейтинг: 1.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Уроки по созданию каких игр Вам интересны?
Всего ответов: 169
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0