不断更新基于PHP文本的游戏


Updating a PHP text-based game continuously

我正在用PHP构建一个多人游戏。每场比赛分为几个阶段,持续一定的时间,目前为2分钟。在每个阶段,玩家一起工作一段时间,直到游戏进入下一阶段,或者该阶段(因此游戏)失败,新游戏重新开始。

我设想在HTML页面上玩游戏,用户可以通过不断更新的倒计时时钟来查看当前阶段还剩多少时间。当倒计时时钟达到零时,游戏要么前进,要么结束,结果通过Ajax返回。我遇到的问题是100名玩家同时玩游戏的(理论上)想法。

如何调用更新脚本?如果我通过运行PHP来调用它,哪个播放器的浏览器会调用它?如果玩家的浏览器在舞台真正结束前一秒刷新内容,会发生什么?

PHP语言适合这样的游戏吗?

"PHP是这样的游戏的正确语言吗?"是的,如果你做对了。以下是您的操作方法…

使用名为Comet的方法,可以让多个客户端从服务器中提取数据,但只有在数据更新时。它的工作原理是这样的:

  1. 客户端A向服务器发出拉取请求
  2. 服务器等待,保持与客户端A的连接打开
  3. 客户端B向服务器发出拉取请求
  4. 服务器等待,保持与客户端B的连接打开
  5. 客户端A将新数据推送到服务器
  6. 服务器通过仍然打开的连接将新数据推送到客户端A和客户端B
  7. 客户端A发出拉取请求
  8. 等等

换句话说,这意味着所有客户端都会在任何客户端将信息推送到服务器后立即接收到最新信息。这意味着你不必实现"每x秒刷新一次"的系统,这有两个原因:

1) 你没有;不要浪费时间和带宽,在没有发生任何事情的情况下向服务器发出请求;2) 所有客户端都会同时获得推送给他们的数据,这绝对是最新的,而不是x秒前的数据。

在实践中,Comet是通过AJAX实现的。在谷歌上搜索彗星的一些例子——它非常简单,非常有用。

在客户端-服务器游戏中,服务器应该与客户端的模拟(游戏)并行运行模拟。

通常,服务器模拟是权威的,因此,当匹配结束时,它会通知匹配中的所有客户端模拟状态已更改为"匹配结束"或其他什么。然后,客户端会锁定用户界面,或者显示"游戏结束"消息,或者宣布获胜者——无论你想要什么。

因此,对于您来说,您的服务器应该运行倒计时计时器,而客户端则保持轮询(通过AJAX或WebSockets)服务器以了解状态变化。当服务器的计时器为零时,下次客户端轮询服务器时,服务器会说:"嘿,哟,游戏结束了!"。

编辑

我还想说,PHP可能会起作用,但你必须明白,PHP是为web服务而构建的,而不是游戏。简单的游戏,如井字游戏、跳棋或国际象棋,当你在多人游戏功能中掷硬币时,可能会变得相当复杂。模拟通常需要线程。PHP可以进行线程处理,但如果你不知道自己在做什么,它可能会变得非常丑陋。

如果您使用的是PHP会话系统,脚本会将Ajax请求识别为来自(例如)登录游戏的同一用户。

在阶段结束前一秒,您可以在PHP中返回到阶段的剩余时间,以便javascript计数器保持同步?服务器和客户端都必须知道游戏的状态,否则可能会有黑客。