Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
持续更新基于PHP文本的游戏_Php - Fatal编程技术网

持续更新基于PHP文本的游戏

持续更新基于PHP文本的游戏,php,Php,我正在用PHP构建一个多人游戏。每场比赛分为几个阶段,每个阶段持续一定的时间-目前为2分钟。在每个阶段中,玩家一起工作一定时间,直到游戏进入下一阶段,或者该阶段(因此游戏)失败,新游戏重新开始 我设想在HTML页面上玩这个游戏,用户可以通过不断更新的倒计时时钟看到当前阶段还剩多少时间。当倒计时时钟为零时,游戏要么前进,要么结束,结果通过Ajax返回。我遇到的问题是(理论上)100名玩家同时玩游戏的想法 如何调用更新脚本?如果我通过运行PHP调用它,哪个播放器的浏览器调用它?如果玩家的浏览器在舞台

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

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

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


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

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

通常,服务器模拟是权威性的,因此,当(比如)匹配结束时,它将通知匹配中的所有客户端模拟状态更改为“匹配结束”或其他任何状态。然后,客户机将锁定用户界面或显示“游戏结束”消息或宣布赢家——无论您想要什么

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

编辑


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

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

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

“PHP是适合这种游戏的语言吗?” 是的,如果你做得对的话。这是你怎么做的

使用一种称为Comet的方法,您可以让多个客户机从服务器中提取数据,但仅当数据更新时。它的工作原理如下:

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

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


    实际上,Comet是通过AJAX实现的。谷歌搜索Comet的一些例子——它非常简单,而且非常有用。

    我建议您在WebSocket中寻找这种交流方式。我知道IE还不支持它,但它比AJAX快得多。+1对于DPOLEONSKI来说,现代浏览器中的游戏大多都使用WebSocket,这是一种真正的连接,如果浏览器不支持它,它将依靠AJAX轮询,这取决于你选择的库。甚至没有想到WebSocket。把它加到我的答案里。谢谢!:)谢谢但是,假设客户机A不将新数据推送到服务器,但是在2分钟后,代码被编程为在没有用户输入的情况下更改某些内容。如果没有人调用脚本,脚本如何发送数据?当客户端向服务器发出请求时,脚本被“调用”。服务器保持连接打开,并且只有在有新数据要推送时才响应—数据如何首先到达服务器并不重要(无论是从另一个客户端还是由服务器本身生成的)。一旦客户端接收到新数据,它会立即向服务器发出新请求,直到推送更多的新数据为止,服务器一直处于打开状态,依此类推。那么,解决方案是否非常基本?是否有一种管理客户端,它只是不断地调用脚本?不,它不是基本的。Comet的全部要点是,只有在服务器上的数据发生实际更改时才传输数据,这毕竟是可能的最小传输次数。虽然客户端确实“不断地调用脚本”,但它只能在某些内容发生更改后才能这样做,因为服务器只有在准备好这样做时才会响应请求。只有当服务器响应时(即有新数据时),客户端才能发出新请求。与此相比,只需每隔x秒轮询一次服务器,99%的时间都不会从服务器获取任何新内容。