【问题标题】:Multiplayer player 2 player game多人玩家 2 人游戏
【发布时间】:2012-02-01 01:37:41
【问题描述】:

我想创建一个国际象棋多人游戏,1player vs 1player。

我将使用 Flash 制作动画和客户端,并使用服务器端语言来检查动作是否正确,将每个玩家的动作记录到数据库中,决定获胜者并给获胜者一些积分。

我的主要编程语言是 PHP,我会根据我的指示让别人做 Flash 工作。

我想知道以前是否有人尝试过这样做,或者您在开发 p2p 游戏时是否有任何教程、指南、步骤可遵循?我想有效地做到这一点,并且能够在具有 512 RAM 的 VDS 上支持至少 100 名玩家。

我打算让游戏像这样运行:

1) 在从 php 中检索之后,初始化 flash 客户端中的积分、玩家名称等变量

2) 开始游戏

3) 如果我是 player2 并且 player1 正在考虑一个决定,如果 player1 做出任何决定,flash 客户端将向 PHP 文件发送请求以检查数据库。如果是这样,轮到我做决定并移动一块了

4) 轮到我时,不再向 PHP 发送任何请求,直到我想移动一块。当我尝试这样做时,它会发送一个请求,PHP 将检查我的移动是否有效,并返回一些 flash 将用于显示错误或将指针移回 player1 的变量

游戏还将有一个与 PHP 同步的计时器。每个玩家可以思考 20 秒来做一个动作。

1)对我的实施有什么建议吗?我正在寻找的是提高效率和减少服务器负载的建议,如果有人曾经有过类似项目的经验,他们是如何做到的,或者他们将如何做到?

2)我的定期 HTTP 请求的实现不是一个好主意,因为我知道服务器可能会过载,我想知道是否有人可以建议任何替代但安全的选项。同时 100 个用户意味着大约 100 个 HTTP 请求/秒。这是一个 VDS 可以处理几天的数字吗?


稍后编辑:

在我收到这篇帖子的回复后,我得出的结论是,在等待对方玩家移动时,每秒使用套接字而不是 HTTP 请求是最好的主意。

我的游戏将有 100 张桌子可供玩家使用,每张桌子有 1 个用于通信的套接字和 1 个端口。所以1个插座有100个端口。当游戏开始并发送初始化变量时,PHP 将通信以刷新 table 的套接字和端口。

我打算用flash监听socket服务器,看看对面玩家必须移动时会发生什么。

当我移动时,flash 会从它的一侧检查移动是否有效,然后将数据发送到 PHP。 PHP 将返回 OK 或 NOT,并且还会更新套接字端口上的数据。

关于套接字,我不确定 javascript 是否是一个不错的选择,所以我在考虑 PHP 套接字或 JAVA 套接字。

由于熟悉该语言,PHP 套接字似乎是我的首选。 我的第二个是租用 smartfoxserver,第三个是使用 Player.IO 的服务。 我打算制作一款非常不错的游戏并将其出售。图形几乎完成了,它们看起来很棒。最难的部分是高效且易于安装。


感谢您的宝贵时间!问候

【问题讨论】:

  • I would like to know if anybody tried to do this before 想创建一个国际象棋游戏?
  • 是的,但我对我的项目进行了更大的描述
  • 游戏必须安全并与服务器通信,服务器将检查每一步是否正确等等。
  • 听起来你有一个不错的计划......所以你到底在问什么?我从来没有做过这样的事情,但当然这是可能的。您希望对服务器进行快速轮询以了解最近的移动,如果这是由玩家询问完成的,那么现在轮到其他玩家了。设计它的关键是 http 是无状态的,因此每次都必须传递所需的所有信息(不是游戏的整个历史,而是一些游戏 id、用户等)查看 RESTful 编程接口以获取服务器上的帮助这个项目的侧面设计。祝你好运!
  • 我对定期 HTTP 请求的实现并不是一个好主意,因为我知道服务器可能会过载,我想知道是否有人可以建议任何替代但安全的选项。我的意思是,当轮不到我移动棋子时,每秒发送请求甚至会导致浏览器卡住。

标签: php flash multiplayer


【解决方案1】:

这样的游戏的服务器负载应该非常小。如果您使用的是闪存,我会利用套接字对象并只打开一个连接到您的服务器的套接字,这样您就不需要询问有关已更改内容的问题......它会在 / 时通知客户端如果有什么值得注意的。 否则你的计划是一个很好的计划,所以,你可能不得不就你被难住的事情提出一些具体的问题。

如果您真的想减少服务器负载,请在 Flash 客户端中编写国际象棋逻辑,并让 IT 决定(玩家)尝试的移动是否非法,或者玩家是否输了等等......使用服务器严格用于消息中继和数据存储。

【讨论】:

  • 您好,游戏逻辑会同时写入flash和服务器。我不能相信来自 flash 的任何数据。任何人都可以模拟我的客户端,或者反编译它并发送恶意数据。 Socket 似乎是摆脱 HTTP 请求的解决方案。
  • 我对我计划构建的同一个 1vs1 国际象棋游戏有疑问。我关心的是如何向玩家 1 显示对手的移动。我是否必须使用数据库来存储移动并将其发送给客户端节点?或者 2. 有没有其他程序可以做?
【解决方案2】:

有时围绕您现有的资源来设计项目是错误的,例如 PHP 知识和对具有 512 MB RAM 的服务器的访问权限。有很多项目你应该首先考虑你的资源,但一个独立的、第一次的游戏项目不是其中之一。

即使您的主要语言是 PHP,您也不应该限制自己自己处理 Flash 部分。此外,使用网络服务器和数据库作为多人游戏的通信方法会导致一些非常笨拙的行为。

您也不受 VDS 的限制。您可以在Amazon EC2 上使用一个微实例,为free 使用一年。如果从头开始设置 EC2 服务器似乎令人生畏,那么整个互联网都有 tutorials 可以带您从头到尾。

您的游戏前端可以用 Javascript 或 Flash AS3 编写。两者都有很多游戏开发库。 FlixelFlashpunkPushButton 是免费的 AS3 游戏库。 MelonJS 是一个 Javascript/HTML5 游戏库。他们都有大量的文档和良好的社区。​​p>

您可以使用node.js 编写服务器后端并使用socket.io 来处理您的游戏通信,即使您对数据包一无所知——或者如果您想付费,您可以使用Player.IO 之类的东西一点钱,让外部服务为您担心。

如果您正确编写后端,一百个用户对您的服务器来说不会是问题。当您获得数以千计的数量时,您将需要开始考虑新硬件。

既然您正在寻找一般游戏制作建议,请开始阅读 #AltDevBlogADay 等博客上的文章。你会从对游戏充满热情的其他人那里获得很多关于设计的见解。

【讨论】:

  • 您好,您的回复正是我所期待的。如果 Id 仍然使用 PHP 在开始时发送初始化变量,然后将 JAVA 用于服务器端和实际游戏逻辑(计算移动是否有效,决定获胜者)并使用 JAVA 套接字与 flash 通信,情况如何呢?玩家移动。这将使应用程序足够强大。
  • 关于套接字。我的知识是 PHP 也可以使用套接字,但我对它们了解不多。我知道这是一个愚蠢的问题,但我必须为每个游戏桌打开一个插座吗?并在游戏开始时使用 PHP 将套接字传递给 flash ?
  • 您只需要为每个客户端使用一个套接字。客户端应该有一个用于发送和接收的连接对象,您可以使用服务器的地址对其进行初始化。如果您打算为您的服务器使用 PHP 套接字,那么您将不会使用像 Apache 这样的网络服务器来提供该代码——您将使用 PHP 编写自己的服务器。阅读本教程以获取更多信息:devzone.zend.com/209/writing-socket-servers-in-php 但是,如果您还不熟悉以这种方式使用 PHP,我仍然推荐 node.js。有很多很棒的教程可供使用。
  • 所以基本上,如果我有 1 张游戏桌,该桌有 2 名玩家,我需要 2 个插座。当 player1 移动时,我会为 player2 提供数据到套接字,对吗?
  • 是和否,这取决于您所说的套接字。当服务器运行时,每个玩家都通过套接字连接进行通信,但他们都使用相同的套接字代码进行通信。通过套接字,服务器可以接收包含桌子名称、玩家名称、移动以及可能的某种身份验证的玩家消息,然后将该信息发送给该桌子上的其他玩家。您可以将套接字视为电话线,而将服务器视为路由呼叫的人。两个玩家都呼叫服务器,保持线路畅通,服务器在他们之间中继消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多