0

我最近开始用 PHP 编程。作为练习,我想构建自己的 PHP 文本策略游戏。一个技术方面需要一些思考。

在我的游戏中,每个玩家都必须具备获取资源的能力,例如铁和谷物。有了这些资源,玩家就可以招募士兵或建造建筑物。资源存储在一种仓库中。

资源会在一段时间内获得。例如,您每小时获得 100 粒谷物,并且该谷物储存在仓库中。这意味着每 0.6 分钟必须添加 1 个谷物。我一直在寻找 cron 作业,但这不是解决我的问题的最佳答案,因为它占用了太多系统资源。问题是我希望能够每分钟更新我仓库中的资源。有人对我的问题有想法吗?

4

4 回答 4

2

与其尝试通过更新状态来解决这个问题,不如尝试以函数式编程的方式解决它。例如,在给定已知条件(例如生产开始时)的情况下,编写一个可以计算资源量的函数。非常简化:

基于状态的模型:

class Gold {
  public $amount = 0;
}

class GoldDigger {
  public $amount_per_second = 1;
}

$player_gold = new Gold();
$player_worker = new GoldDigger();
while (true) {
  $player_gold->amount += $player_worker->amount_per_second;
  sleep(1);
  echo "Player has {$player_gold->amount} gold pieces\n";
}

基于功能的模型:

class Gold {
  public $workers = array();
  function getAmount() {
    $total = 0;
    foreach ($this->workers as $worker) {
      $total += $worker->getAmount();
    }
    return $total;
  }
}

class GoldDigger {
  public $amount_per_second = 1;
  public $started = 0;
  function __construct() {
    $this->started = time();
  }
  function getAmount() {
    return $this->amount_per_second * (time() - $this->started);
  }
}

$player_gold = new Gold();
$player_gold->workers[] = new GoldDigger();

while (true) {
  sleep(1);
  echo "Player has {$player_gold->getAmount()} gold pieces\n";
}

这两个例子都有点做作——您可能会将数据存储在数据库或类似数据库中,这会使事情变得有些复杂,但我希望它能够说明两种策略之间的区别。

于 2013-01-30T13:18:57.570 回答
1

您可能需要为此使用守护程序。查看Gearman

于 2013-01-30T12:52:11.443 回答
1

当用户(或其他人)请求其数量时,您可以更新资源。如果您可以计算出玩家在给定时间间隔内将获得多少资源,那么您可以稍后简单地添加它们。您只需要存储上次更新的时间。

例子:

玩家在 01:00 查看仓库,他发现那里有 50 粒粮食,当前收入为每小时 100 粒粮食。于是他上床睡觉,第二天早上 09:00(8 小时后)再次检查仓库。现在他可以看到 50 粒 + 8 小时 * 100 粒/小时 = 850 粒。

但是服务器上的数据看起来像这样:

  • 01:01:“50 粒,最后更新时间 01:00”
  • 05:00:“50 粒,最后更新时间 01:00”
  • 08:59:“50 粒,最后更新时间 01:00”
  • 09:01:“850 粒,最后更新时间 09:00”
于 2013-01-30T13:04:04.463 回答
0

您可以使用缓存但经常更新某些内容(当您有很多玩家时)可能会导致问题,而不是消耗服务器上的资源,您可以尝试存储上次请求值的时间戳并计算玩家从现在开始生成了多少“谷物”(LastAccessedTimestamp-NowTimestamp)= 已经过去的时间(例如,5 分钟)

5 分钟 * 60 秒 = 300 秒通过

300 秒 / 0.6 秒 = 5 分钟内 500 粒谷物

或者您可以让客户端 javascript 向播放器显示仓库有 X Grains 并仅在客户端更新它,如果没有用户活动,每 1 或 3 分钟发送一次 ajax 请求以同步事物,否则每次更新用户发送一个动作或其他东西。

于 2013-01-30T13:02:37.477 回答