3

我打算使用 websockets 在 node.js 上编写一个实时回合制策略游戏服务器。我将迎合具有良好 html5 支持的现代浏览器,并且不太关心向后兼容性。

所提供的游戏将由少数玩家(例如 2-10 人)一次玩/观察,并且将具有在国际象棋中使用的时钟计时器,并在 www.chess.com 上实现。定时游戏最多持续一个小时,还可以选择玩非定时游戏。

服务器将负责玩家的评分、玩家的好友列表,以及管理正在运行/已完成的游戏状态,以及运行游戏时钟。游戏状态只是一点点 json,每场游戏最多只有几千字节。

一个限制是所有实际的游戏逻辑都必须发生在客户端上,而不是我的服务器上。因此,我需要一种机制,如果客户端发出非法移动信号,无论是因为它或其对手出现故障/恶意,那么一个或多个不相关的客户端或客户端(即使用我的网站的其他人)将把游戏状态加载到他们的浏览器在后台,争议将在那里解决。

这大概总结了我的要求。

这不是一个玩具项目,我希望有很多用户,所以我想提前考虑后端架构和可扩展性。我一般对node.js或网站部署不是特别了解,所以任何关于架构、技术/库、可扩展性/代理/负载平衡、如何实现时钟和处理延迟问题的建议或见解,在哪里/如何存储游戏状态等,非常感谢。

4

3 回答 3

1

Node.js 和它的流行库在编写时考虑到了可扩展性,所以……像 express、mongodb/redis、socket.io 这样的通用工具就可以了。

关于客户端逻辑:

一个或多个不相关的客户(即使用我的网站的其他人)将在后台将游戏状态加载到他们的浏览器中,争议将在那里解决。

node.js 的一大优点是它与浏览器中的 javascript 相同。:) 所以你可以在你的服务器上运行相同的代码并在那里解决任何争议。

于 2012-05-09T03:25:34.193 回答
0

任何项目的第一件事都是整理一份技术要求清单。这是基于您在帖子中所写内容的示例:

  1. “服务器将处理[...]” - 您帖子中的项目列表表明您需要某种用户登录身份验证机制。
  2. “玩家的评分,玩家的朋友列表” - 这些需要存储在某种数据库中。
  3. “管理正在运行/已完成的游戏状态,运行游戏时钟” - 连接玩家之间的实时数据处理到正在运行的会话。
  4. 如果您计划存储匹配结果,则需要将实时应用程序与数据库存储接口。
  5. “所有实际的游戏逻辑都必须在客户端上进行” - 你见过Browser Quest吗?游戏的巨大问题是所有用户信息都存储在客户端上。要获得所有游戏特权,您只需手动编辑 localStorage。我唯一能想到的解决方法是将整个游戏逻辑编码到浏览器中,然后在每个连接的客户端上验证每个动作。但这会产生一个问题,用户可以修改逻辑来对应该合法的举动提出异议。

当您有一个明确定义的项目技术要求列表时,找到您正在寻找的库应该会容易得多。例如,socket.io 是一个处理 Web 套接字的优秀库。

于 2012-05-09T03:26:46.457 回答
0

游戏代码“不受信任”有什么原因吗?您需要做的就是验证 JSON 输入并且该移动不违反任何规则。在不了解更多细节的情况下,我不确定我能否就如何解决客户之间的纠纷提出建议,但我看不出游戏代码不可信的原因。

这个问题实际上听起来类似于我读过的一篇关于分布式碰撞检测和解决的论文,它减少了服务器网络压力。这是通过让所有“客户”对可预测的未来状态进行投票来实现的,每个客户都直接参与其中。如果没有争吵,则达成协议,然后游戏继续进行。如果发生争执,无法达成协议,则行动将中止。

它还为投票是否“及时”完成提供了一些有趣的想法(鉴于您的游戏是回合制的,您可能不必处理这种情况)。

您不必在无法达到碰撞时中止移动,而是必须编写一些逻辑来确定移动是否有效。这是很难回答您的问题的地方,因为您似乎无法信任除了服务器(甚至无法信任游戏代码本身)之外的任何东西。

我认为,为了可靠地解决这个问题,您可能必须采用您现有的想法之一:在服务器上启动沙盒游戏,询问不相关的客户端(这可能不可靠),或删除其中一个约束,并直接询问服务器。

于 2012-05-09T19:37:11.407 回答