我最近开始用PHP编程。为了锻炼,我想建立自己的PHP文本策略游戏。一个技术方面需要一些思考。
在我的游戏中,每个玩家都必须有能力获得资源,例如铁和谷物。利用这些资源,玩家可以招募士兵或建造建筑物。资源存储在一种仓库中。
资源将在一段时间内获得。例如,您每小时获得100粒粮食,粮食储存在仓库中。这意味着每0.6分钟,必须添加1粒。我一直在寻找cron的工作,但这不是我问题的最佳答案,因为它需要太多的系统资源。问题是我希望能够每分钟更新我仓库中的资源。有没有人对我的问题有所了解?
答案 0 :(得分: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";
}
这些例子都有点人为 - 你可能会将数据存储在数据库或类似的数据库中,这会使问题复杂化,但我希望它能说明这两种策略之间的区别。
答案 1 :(得分:1)
您可能需要为此使用守护进程。查看Gearman。
答案 2 :(得分:1)
您可以在用户(或其他)请求其金额时更新资源。如果您可以计算玩家在给定时间间隔内将获得多少资源,那么您可以稍后添加它们。您只需要存储上次更新的时间。
示例:强>
玩家在01:00看着仓库,他发现那里有50粒粮食,目前每小时收入100粒。所以他上床睡觉,第二天早上9点(8小时后)他再次检查仓库。现在他可以看到50粒+ 8小时* 100粒/小时= 850粒。
但是服务器上的数据看起来像这样:
答案 3 :(得分:0)
您可以使用缓存但更新频繁(当您有许多播放器时)可能会导致问题,而不是在服务器上消耗资源,您可以尝试存储 上次请求值的时间戳,并计算玩家从现在开始生成的“谷物”数量 (LastAccessedTimestamp-NowTimestamp)=已经过去的时间(例如,5分钟)
或者您可以让客户端javascript显示仓库中有X Grains的玩家并仅在客户端更新它,每1或3min发送一次ajax请求以在没有用户活动时同步事物,或者每次用户发送操作或其他内容时都会更新。