График. Производство ресурсов меняется наполовину, подсчитать общее количество ресурсов, произведенных, когда игрок онлайн? - PullRequest
0 голосов
/ 27 апреля 2018

Я пишу игру, в которой игрок может строить и улучшать здания. У них могут быть здания, производящие ресурсы. Игра обновляет количество ресурсов не позднее, чем за 10 минут. Если пользователь неактивен более 10 минут, я вычисляю правильную сумму при следующем обновлении страницы. Игрок может начать модернизацию здания в момент времени 1. Их текущее производство золота составляет 100. Предполагается, что оно завершится в момент времени 100, а часть добычи ресурсов увеличится до 600. Но игрок снова войдет в систему в момент времени 200. Он должен получить 100 +600 золота, но как рассчитать?

Возможно, обновите таблицу user_resources с двумя столбцами - previous_production и previous_production_active_till. Когда при расчете ресурсов проверяйте, меньше ли последнее обновление, чем старый объем производства. Если это так, получите prev_time_delta, выполнив previous_production_active_till - last resources update. Подсчитайте, сколько было добавлено в старых тарифах до предыдущего_производства_активной_тиллы, когда рассчитываете вторую сумму для улучшенной ставки. Например, последнее обновление происходит в момент 1. Старое производство - 100 на 100 единиц времени. Старый курс длится до 100 раз. Новая ставка начинается с 100. Игрок входит в систему во время 200. Игра делает:

1-100=abs 99+1=100/100=1
100*1=100

теперь за оставшееся время мы берем новый дебит,

200-100=100+1=101/100=1
600*1=600

Немного справочной информации, это игра на PHP, и игрок взаимодействует с игрой с помощью запросов POST / GET. Для оптимизации, чтобы уменьшить нагрузку на базу данных, я выбираю обновить ресурс игрока, проверяя каждую загрузку страницы в течение определенного промежутка времени, в данном случае 100 с момента их последнего обновления, и делайте каждое обновление только тогда.

Это один из вариантов, любой другой способ?

1 Ответ

0 голосов
/ 27 апреля 2018

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

Что если игрок будет перезагружаться каждые 2 минуты? Будут ли произведены его расчеты ресурсов для входа в систему при выполнении предыдущего запроса входа?

Я думаю, вам не нужно думать только о 100 times периоде сбора урожая игрока. При повторном входе игрок должен также получить сумму своего урожая с момента предыдущего запроса на вход в систему / calcHarvest.

Про здания я предлагаю рассмотреть два способа:

  1. Когда здание модернизируется, оно не приносит урожай. Так что вам нужно знать building_is_upgraded_timestamp. И получите delta=(current_timestamp - building_is_upgraded_timestamp). Тогда EarnedHarvest = delta * Harvest_produce_per_second;
  2. Когда здание обновляется, оно приносит урожай Harvest_produce_per_second старого upgrade_level_building. Добавьте LastEarnedByThisBuildingTimestamp к каждому шахтерскому зданию. Так что вам нужно знать building_is_upgraded_timestamp и сравнивать его с current_timestamp,

Смотри код:

//If we logged in firstly after building has been upgraded
if ( $current_timestamp > $building_is_upgraded_timestamp )
{
    $delta_old_level_building = $building_is_upgraded_timestamp - $LastEarnedByThisBuildingTimestamp;
    $delta_new_level_building = $current_timestamp - $building_is_upgraded_timestamp;

    $earned_harvest = $delta_old_level_building * $Harvest_produce_per_second_previous_level_building + $delta_new_level_building * $Harvest_produce_per_second_current_level_building;
}
else // Logged in and building is still upgrading
{
    $delta = $current_timestamp - $LastEarnedByThisBuildingTimestamp;
    $earned_harvest = $delta * $Harvest_produce_per_second_previous_level_building
}
...