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

Программирование с нуля - это совсем просто! 144) Программирование ролевой игры: Квесты-4


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

144) Программирование ролевой игры: Квесты-4

Последний выпуск по ролевой игре был N 139.

Письма.

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

  const sGlasn: string = 'бвгджзйклмнпрстфхцчшщ' ;
          sSoglasn: string = 'аеиоуэюя' ;

Стало:

  const sGlasn: string = 'бвгджзйклмнпрстфхцчшщ' ;
          sSoglasn: string = 'ааааааааeeeeeeeeиииииииоооооооууууууэюя'

Экспериментируя со словарем можно добиться похожести имени на другие языки - немецкий, испанский и т.д.
Иванов Михаил

Еще полезный код.

Хочу поделится одной программкой. Она для перекодирования русского текста из Win кодировки в Dos. Может быть она поможет кому-нибудь кто работает с Dosом, в частности кто делает РПГ по вашей рассылке.
Пожалуйста опубликуйте ее в рассылке. Программа во вложении.
Максим.

  unit WriteRUS;

  interface

  procedure writelnRUS(Text: string) ;
  procedure writeRUS(Text: string) ;

  implementation

  {--------}
  function Win2Dos(Text: string) : string;
  {Перекодировка русского текста из Windows кодировки в Dos
  кодировку}
  var EncodedText: string;
      ch: char;
      chCode: integer;
      i: integer;
  begin
  EncodedText := ' ' ;
  for i := 1 to Length(Text) do
    begin
    ch := Text[i];
    chCode := ord(Ch);
    if chCode > 128 then
      if chCode < ord( ' р ' ) then
        chCode := chCode - ord( ' А ' ) + 128
      else
        chCode := chCode - ord( ' р ' ) + 224;
    EncodedText := EncodedText + chr(chCode);
    end;
  Win2Dos := EncodedText;
  end;

  {-------}
  procedure writelnRUS(Text: string) ;
  {Перекодировка из Вин в Дос и вывод с переходом на новую строку}
  begin
  writeln(Win2Dos(Text));
  end;

  {-------}
  procedure writeRUS(Text: string) ;
  {Перекодировка из Вин в Дос и вывод}
  begin
  write(Win2Dos(Text));
  end;

  end.


Квесты. Продолжение.

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

  k := ReadKey;
  case k of
  ...
     ' j ' : ShowJournal;
  ...

Процедуру отображения как требующую взаимодействия с пользователем разместим в модуле LowLevel.

  { ----------------- }
  procedure ShowJournal;
  begin

  end;

Что она должна делать? Во-первых, показать список квестов. Каждый из них должен предоставлять какую-то мало-мальски вразумительную информацию о себе, для чего подготовим функцию, формирующую такое краткое описание (модуль Quest):

  { ----------------- }
  function GenerateQuestDescr(qi: Integer): string;
  var s: string;
  begin
  s := ' ' ;
  case Quests[qi].QType of

   qKillTarget:
     begin
     s := STR_QKILL + Monsters[ Quests[qi].TargetId ].Name + ' : ' +
                IntToStr(Monsters[ Quests[qi].TargetId ].x) + ' , ' +
                IntToStr(Monsters[ Quests[qi].TargetId ].y) + ' ; ' +
          STR_QRETURN +
                IntToStr(Monsters[ Quests[qi].MainInd ].x) + ' , ' +
                IntToStr(Monsters[ Quests[qi].MainInd].y) + ' . ' ;
     end;

  end;

  GenerateQuestDescr := s;
  end;

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

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

  STR_QKILL = ' Убить монстра ' ;
  STR_QRETURN = ' Выдан ' ;

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

  qKillTarget:
    begin
    if Monsters[ Quests[qi].TargetId ].HP <= 0 then
       s := STR_QOK;
    s := STR_QKILL + Monsters[ Quests[qi].TargetId ].Name + ' : ' +
               IntToStr(Monsters[ Quests[qi].TargetId ].x) + ' , ' +
               IntToStr(Monsters[ Quests[qi].TargetId ].y) + ' ' +s+ ' ; ' +
         STR_QRETURN +
               IntToStr(Monsters[ Quests[qi].MainInd ].x) + ' , ' +
               IntToStr(Monsters[ Quests[qi].MainInd].y) + ' . ' ;
    end;

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

  STR_QOK = ' (убит) ' ;

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

  { ----------------- }
  procedure SaveGame;
  var F: File;
      i: Integer;
  begin
  Assign(F, ' sav.dat ' );
  Rewrite(F,1);

  for i := 1 to MaxItems do
    BlockWrite(F, Items[i], SizeOf(Items[i]));

  for i := 1 to MaxHeroes do
    BlockWrite(F, Heroes[i], SizeOf(Heroes[i]));

  BlockWrite(F, CurHero, SizeOf(CurHero));

  BlockWrite(F, GameMap, SizeOf(GameMap));
  BlockWrite(F, CurMap, SizeOf(CurMap));

  for i := 1 to MaxMonsters do
    BlockWrite(F, Monsters[i], SizeOf(Monsters[i]));

  for i := 1 to MaxQuests do
    BlockWrite(F, Quests[i], SizeOf(Quests[i]));

  Close(F);

  ShowInfo(STR_SAVEOK);
  end;

  { ----------------- }
  procedure LoadGame;
  var F: File;
      i: Integer;
  begin
  Assign(F, ' sav.dat ' );
  Reset(F,1);

  for i := 1 to MaxItems do
    BlockRead(F, Items[i], SizeOf(Items[i]));

  for i := 1 to MaxHeroes do
    BlockRead(F, Heroes[i], SizeOf(Heroes[i]));

  BlockRead(F, CurHero, SizeOf(CurHero));

  BlockRead(F, GameMap, SizeOf(GameMap));
  BlockRead(F, CurMap, SizeOf(CurMap));

  for i := 1 to MaxMonsters do
    BlockRead(F, Monsters[i], SizeOf(Monsters[i]));

  for i := 1 to MaxQuests do
    BlockRead(F, Quests[i], SizeOf(Quests[i]));

  Close(F);

  ShowInfo(STR_LOADOK);
  end;

Следующий этап, после того, как монстр уничтожен - возвращение к мирному персонажу, отчет и получение приза.

Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas):

тут, 13126.zip, 18486 байтов


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

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

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Вышел мой учебный курс "Технологии Delphi. Разработка приложений для бизнеса".
http://shop.piter.com/book/978591180282/

Учебный курс рассчитан не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книге описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив одну мою книгу, вы существенно сэкономите :) В книге полностью описан язык Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET. Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книгу.

Другие мои книги, которые пока доступны в продаже:


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


В избранное