0

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

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

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

PHP 是适合这种游戏的语言吗?

4

3 回答 3

1

“对于这样的游戏来说,PHP 是正确的语言吗?” 是的,如果你做对了。这是你如何做到的......

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

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

换句话说,这意味着所有客户端都会立即收到最新信息,这些信息被任何客户端推送到服务器。这意味着您不必实现“每 x 秒刷新一次”系统,这有两个好处:

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

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

于 2012-07-18T16:04:50.400 回答
1

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

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

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

编辑

我还想说 PHP 可能会工作,但您必须了解 PHP 是为 Web 服务而不是游戏而构建的。当您投入多人游戏功能时,简单的游戏(如井字游戏、跳棋或国际象棋)可能会变得相当复杂。模拟通常需要线程。PHP 可以做线程,但如果你不知道自己在做什么,它会变得非常丑陋。

于 2012-07-18T15:54:28.713 回答
0

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

在舞台结束前一秒钟,您可以在 PHP 中返回舞台剩余的时间,以便 javascript 计数器保持同步?服务器和客户端都必须知道游戏的状态,否则会在某个时候出现黑客。

于 2012-07-18T15:54:56.977 回答