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

Программирование с нуля - это совсем просто! 97) Продаем вываленные из монстров предметы


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

Разработка ролевой игры

97) Продаем вываленные из монстров предметы

Продолжение рубрики по программированию ролевой игры. Последний выпуск - см. N 94.

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

  { ----------------- }
  function GetItemName(Itm: TGameItem): string;
  begin
  case Itm.IType of

    itemAmmo: GetItemName := Itm.Name +
    ' ( ' +IntToStr(Itm.Ints[intAmmo])+ ' ) [ ' +
                IntToStr(Itm.Price)+ ' ] ' ;

    itemRangedWeapon:
              GetItemName := Itm.Name +
  ' ( ' +IntToStr(Itm.Ints[intRangedAmmo])+
                ' ) [ ' +IntToStr(Itm.Price)+ ' ] ' ;

   itemMagik: GetItemName := MagikItemsName[ Itm.Ints[intMagikType] ] +
                             ' ( ' +IntToStr(Itm.Ints[intMagikNum])+ ' ) [ ' +
                             IntToStr(Itm.Price)+ ' ] ' ;

    itemMoney: GetItemName := Itm.Name +
    ' ( ' +IntToStr(Itm.Ints[intMoney])+ ' ) ' ;

  else GetItemName := Itm.Name + ' [ ' +IntToStr(Itm.Price)+ ' ] ' ;
  end;
  end;

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

Соответствующий код процедуры GoToShop, в месте, где мы проверяли значение введенного номера в переменную n, модифицирован так:

  ...
  ReadLn(n);

  if n = 0 then
     Break else

  if (-n) in [1..MaxHeroItems] then
     begin
     if Heroes[CurHero].Items[-n].IType in [itemHandWeapon, itemArmor,
  itemAmmo, itemRangedWeapon, itemMagik] then
        begin
        ShowInfo(STR_SELL_ITEM +
  GetItemname(Heroes[CurHero].Items[-n]));
        Heroes[CurHero].Items[-n].IType := itemNone;

        if i>0 then
           Heroes[CurHero].Items[i].Ints[intMoney] :=
             Heroes[CurHero].Items[i].Ints[intMoney] +
             Heroes[CurHero].Items[-n].Price else

        if i<0 then
           begin
           Heroes[CurHero].Items[-i].Ints[intMoney] :=
               Heroes[CurHero].Items[-n].Price;
           Heroes[CurHero].Items[-i].IType := itemMoney;
           end;
        end;
     end else

  if i <= 0 then
     ShowInfo(STR_NO_MONEY) else

  if n in [1..MaxShopItems] then
     begin
     ...

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

На этом программирование работы с магазинами считаем завершенным.
Далее - реализуем сохранение и восстановление игры в файле.


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

http://russianenterprisesolutions.com/sbo/download/1146.zip 14946 байтов


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

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

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


В избранное