首页 > 解决方案 > 时间线。资源生产变化一半,计算玩家在线时生产的总资源?

问题描述

我正在编写一个玩家可以建造和升级建筑物的游戏。他们可以拥有资源生产建筑。游戏最近更新资源量为 10 分钟。如果用户不活动超过 10 分钟,我会在他下次更新页面时计算正确的数量。玩家可以在时间 1 开始升级建筑物。他们当前的黄金产量是 100。它应该在时间 100 完成,然后一些资源的产量增加到 600。但是玩家在时间 200 再次登录。他应该得到 100 +600 金币,但如何计算呢?

也许用两列更新 user_resources 表 -previous_productionprevious_production_active_till. 当计算资源时,检查上次更新是否小于旧生产量。如果是这样,请通过执行获取 prev_time_delta previous_production_active_till - last resources update。在计算升级费率的第二个总和时,计算在 previous_production_active_till 之前在旧费率中添加了多少。例如,最后一次更新是在时间 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 次,然后才进行每次更新。

这是一种选择,还有其他方法吗?

标签: phpalgorithmproductiongame-development

解决方案


为了减少数据库上的负载,我选择通过在特定时间间隔内检查每个页面加载来更新播放器的资源,在这种情况下为 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
}

推荐阅读