При закрытии подписчики были переданы в рассылку "Как создать свой сайт и заработать?" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Разработка ролевой игры94) Назначаем цены на товарыМассив товаров у нас сформирован. Правда, пока в товарах не хватает главного параметра - цены. Поэтому добавим его в массив ItemTypes, для каждого из восьми типов. Отметим, что цену надо будет уточнять для магических предметов, у которых существует деление на подтипы. Можно цену хранить во вспомогательном массиве Ints, а можно выделить в типе TGameItem специальное поле, предназначенное для хранения цены. Давайте так и поступим:
type TGameItem = record Поле Price теперь будет хранить цену предмета, поэтому уточним содержимое массива ItemTypes с учетом нового дополнения:
const Что касается магии, то создадим новую функцию GetMagikItemPrice, которая будет выдавать стоимость конкретного магического предмета с учетом его подтипа.
{ ----------------- }
GetMagikItemPrice := 0;
mintStorm : GetMagikItemPrice := 5;
end; Далее надо дополнительно сгенерировать случайный магический подтип предметов (с их ценами). Схожую задачу мы уже выполняли в процедуре генерации случайного предмета, теперь выделим ее в виде самостоятельной подпрограммы:
{ ----------------- }
case gi.Ints[intMagikType] of
mintStormStf : gi.Ints[intMagikNum] := 5;
mintHealingStf: gi.Ints[intMagikNum] := 10;
else gi.Ints[intMagikNum] := 1;
gi.Price := GetMagikItemPrice(gi);
end;
{ ----------------- }
if gi.ID = 7 then
end; Воспользуемся ей в нашем коде:
for n := 1 to MaxShopItems do Теперь можно уточнить цены каждого из предметов, подготовленных в магазине для продажи. Как и полагается, продаваться предметы должны выше своей реальной цены. Пускай разница в ценах будет составлять 25-35%.
ShopItems[n].Price := round( Теперь надо вывести список предметов с их ценами:
ClrScr;
for n := 1 to MaxShopItems do Чем плох такой подход? Тем, что при каждом новом заходе в магазин (шаг на соседнюю клетку и снова в магазин) все его содержимое, вся номенклатура продаваемых товаров будет полностью изменена и перегенерирована. Это, конечно, неправильно. Выход из данного тупика может быть следующим. Процесс формирования номенклатуры магазина должен хотя и происходить в случайном порядке, но сама случайная последовательность чисел должна быть всегда одна и та же. Ведь проблемы с неповторимостью списка товаров возникают лишь потому, что при каждом новом вызове данной процедуры генерация массива ShopItems выполняется каждый раз на основе другой случайной последовательности. В Turbo Pascal имеется переменная RandSeed, которая позволяет явно задавать повторяющуюся случайную последовательность. Для этого в данную системную переменную просто надо записать некоторое число - и для одного итого же числа всегда будет генерироваться одна и та же случайная последовательность. Нам надо только, чтобы для каждого магазина такое число мы могли получить неизменным - на основании каких-то его статических характеристик. Пожалуй, единственной такой характеристикой в нашем случае будет координата маганиза на карте. Только как перевести ее в число? Можно поступить просто - сложить координату x и y, и использовать полученное значение в качестве идентификатора случайной последовательности. Однако для координат 5,15 и 15,5 будетполучено одинаковое значение 20, хотя в этих точках, не исключено, вполне могут находиться два разных магазина. Более "продвинутый" способ - возвести первую координату в квадрат (5*5+15 или 15*15+5), и хотя в таком случае все равно не исключается шанс совпадения значений x*x+y и y*y+x, тем не менее вероятность формирования одинаковых идентификаторов очень сильно снижается. Только добавим в параметры процедуры GoToShop координаты магазина:
{ ----------------- }
RandSeed := x*x+y; И исправим точку ее вызова в процедуре MoveHero:
if GameMap[CurMap].Cells[ Heroes[CurHero].x,Heroes[CurHero].y].Tile in Продолжим разработку нашего магазина. После того, как товар представлен на продажу, его можно купить. Для этого запросим номер предмета, который покупается, после чего переместим его в инвентарь.
while true do
i := GetMoneyNo(Heroes[CurHero]);
for n := 1 to MaxShopItems do
ReadLn(n);
if n <= 0 then
if i <= 0 then
if n in [1..MaxShopItems] then
begin
if k > 0 then
Heroes[CurHero].Items[k] := ShopItems[n];
end;
end
end;
end; Данный код требует пояснения. Главный бесконечный цикл "рисует" список товаров, запрашивая выбор игрока (переменная n). Попутно в переменную i заносится номер слота инвентаря, в котором хранятся деньги персонажа. Если в n введен ноль, значит, герой выходит из магазина. Если (через проверку i ) выяснено, что денег у героя нету, об этом выдается сообщение. Если же значение n лежит в допустимых пределах, то мы выясняем, достаточно ли у героя денег, после чего записываем в переменную k номер свободного слота инвентаря (в него будет помещен покупаемый предмет). Наконец, выполняется это перемещение, и со счета персонажа списывается необходимая сумма. Последнее, чего пока не хватает магазину - это возможности героя продавать в нем свой собранный на поле брани товар. Этим мы займемся в следующий раз. Исходный код текущей версии для Turbo Pascal (всегда проверен и работоспособен, главный файл - main.pas): http://russianenterprisesolutions.com/sbo/download/2136.zip 14796 байтов (c) 2004-2006 Сергей Бобровский bobrovsky@russianenterprisesolutions.com
Школа программирования с нуля
Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование |
| В избранное | ||