В мире разработки игр, экономика играет ключевую роль в создании захватывающего и увлекательного игрового процесса. Недавно я столкнулся с задачей усовершенствования системы торговли в моей игре, где покупка и продажа ресурсов имели фиксированное соотношение 1 к 1, влияя при этом на показатели параметров персонажа. Я решил внедрить более сложную логику, чтобы сделать экономику игры более динамичной и интересной.
Исходная задача ✨
Целью было создать систему, где:
- Покупка ресурсов всегда была дороже их продажи.
- Цены на ресурсы динамически менялись, основываясь на текущем спросе и предложении.
- Влияние игроков на экономику становилось более заметным.
Для достижения этих целей было решено использовать данные из специально созданной таблицы resources_bank, которая отслеживала:
- Количество купленных (
resources_purchased) и проданных (resources_sold) ресурсов игроками. - Текущее количество каждого ресурса (
current_quantity), доступное в игре.
Процесс разработки 🛠
Шаг 1: Структурирование данных
Была разработана модель данных ResourceModel с полями для отслеживания базовой цены, цены покупки и продажи для каждого ресурса, что позволило динамически управлять ценами.
Шаг 2: Реализация логики расчета цен
Логика расчета цен была основана на соотношении между текущим количеством ресурсов в игре (current_quantity), количеством купленных (resources_purchased) и проданных (resources_sold) ресурсов. Важным улучшением стало введение формулы, позволяющей цене покупки увеличиваться до 10 раз от базовой, если спрос высок, и уменьшаться до 0,6 от базовой цены при высоком предложении. Цена продажи устанавливалась ниже цены покупки на 5% до 12%, обеспечивая реалистичный баланс между стимулированием продаж и покупок.
public function updateResourcePrices() {
$resources = $this->findAll();
foreach ($resources as $resource) {
$bankData = (new ResourcesBankModel())->where('resource_id', $resource['id'])->first();
if ($bankData) {
$currentQuantity = max($bankData['current_quantity'], 1); // Защита от деления на ноль
$buyMultiplier = min(10, max(1, $bankData['resources_purchased'] / $currentQuantity * 10));
$sellMultiplier = min(0.1, max(0.01, $bankData['resources_sold'] / $currentQuantity));
// Рассчитываем итоговую цену покупки
$finalBuyPrice = min(max($resource['price'] * $buyMultiplier, $resource['price']), $resource['price'] * 10);
// Рассчитываем итоговую цену продажи с учетом процента от цены покупки
$sellPriceAdjustment = rand(5, 12) / 100;
$finalSellPrice = $finalBuyPrice - ($finalBuyPrice * $sellPriceAdjustment);
// Обновляем цены в базе данных
$this->update($resource['id'], [
'buy_price' => round($finalBuyPrice, 2),
'sell_price' => round($finalSellPrice, 2),
]);
}
}
}
Шаг 3: Интеграция с торговлей
После расчета цен, система была интегрирована с функционалом торговли в игре, обеспечивая динамическое изменение цен в зависимости от текущих показателей current_quantity, resources_purchased, и resources_sold.
Результаты 🎉
Эта система позволила создать более живую и динамичную экономику в игре, где цены на ресурсы постоянно меняются, отражая реальные условия спроса и предложения. Игроки теперь могут ощутить более глубокое влияние своих действий на экономику игры, что делает игровой процесс более захватывающим и непредсказуемым.
Это лишь один из примеров, как можно использовать программирование для создания сложных и интересных механик в играх. Используя PHP и базы данных, мы смогли значительно улучшить игровой опыт, делая его более реалистичным и вовлекающим.
