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

时间:2012-07-18 15:49:00

标签: php

我正在用PHP构建一个多人游戏。每个游戏分为几个阶段,持续一段时间 - 目前为2分钟。在每个阶段,玩家一起工作一段时间,直到游戏进入下一阶段,或者阶段(因此游戏)丢失,并且新游戏再次开始。

我有一个在HTML页面上玩游戏的愿景,用户可以通过不断更新的倒计时时钟查看当前阶段剩余的时间。当倒计时时钟到达零时,游戏前进或结束,结果通过Ajax返回。我遇到的问题是(理论上)100位玩家同时玩游戏的想法。

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

PHP是这种游戏的正确语言吗?

3 个答案:

答案 0 :(得分:1)

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

通常服务器模拟是权威的,因此当匹配结束时,它将通知匹配中的所有客户端模拟状态变为“匹配”或其他。然后,客户端将锁定UI或呈现“游戏结束”消息或宣布获胜者 - 无论您想要什么。

所以对你来说,你的服务器应该运行倒计时器,而客户端则保持轮询(通过AJAX或WebSockets)服务器进行状态更改。当服务器的计时器达到零时,下次客户端轮询服务器时,服务器会说“嘿,哟 - 游戏结束了!”。

修改

我还想说PHP可能会起作用,但你必须明白PHP是为Web服务而不是游戏而构建的。当你投入多人游戏功能时,像tic tac toe或checkers或象棋这样的简单游戏会变得非常复杂。模拟通常需要线程化。 PHP可以进行线程化,但如果你不知道自己在做什么,它会变得非常难看。

答案 1 :(得分:1)

“PHP是这种游戏的正确语言吗?” 是的,如果你做得对。这是你如何做到的......

使用名为Comet的方法,您可以让多个客户端从服务器中提取数据,但仅限于更新该数据时。它的工作原理如下:

  1. 客户端A向服务器发出拉取请求。
  2. 服务器等待,保持与客户端A的连接打开。
  3. 客户端B向服务器发出拉取请求。
  4. 服务器等待,保持与客户端B的连接打开。
  5. 客户端A将新数据推送到服务器。
  6. 服务器通过仍然打开的连接将新数据推送到客户端A和客户端B.
  7. 客户A提出拉取请求......
  8. 等...
  9. 换句话说,这意味着所有客户端都会立即收到任何客户端推送到服务器的最新信息。这意味着您不必实施“每x秒刷新一次”系统,这有两个原因:

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

    实际上,Comet是通过AJAX实现的。谷歌对Comet的一些例子很简单,非常有用。

答案 2 :(得分:0)

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

在舞台结束前一秒钟,你可以在PHP中返回到舞台的时间,以便javascript计数器保持同步?服务器和客户端都必须知道游戏的状态,否则黑客可能会这样做。