首页 > 解决方案 > 如何在 Node.js 中存储基于回合的游戏状态

问题描述

我正在开发一款基于回合制的手机游戏,它是一个问答游戏。基本上服务器会向玩家发送一个问题(一场比赛会有两个玩家),然后玩家 1 回答这个问题,然后玩家 2 将在有限的时间内回答同样的问题。玩家可以使用小丑,例如延长时间或改变问题。这是我游戏的基本逻辑。所以这是我的问题:

我将在服务器端使用 Node.js 和 Socket.io。你知道玩家是否失去了与服务器的连接,或者只是在比赛中杀死了应用程序重新启动,他们应该重新加入同一场比赛,他们应该看到他们不在场时游戏中发生了什么。我应该如何将游戏状态存储在我的服务器中?

我的做法:

将有一个 Game 类,它存储游戏的每个状态并使用 setInterval 方法等管理回合的倒计时,当比赛开始时,我将创建它们并像这样存储:

activeGames[lobbyId] = new Game(player1, player2, lobbyId)

因此,例如,如果玩家使用小丑,我将在 socket.io 中捕获该请求,然后像这样检索我的类:

var yourGame = activeGames[lobbyId]

yourGame.useBonus(player1, bonusType)

所以游戏的所有状态都将存储在类中。但是使用这种方法,如果我的服务器死机或重新启动等,所有活动匹配都将被丢弃。所以这不是一件好事。你对这个问题有什么建议?我的服务器应如何存储活动匹配项?

Ps:比赛将持续3分钟。之后我不需要比赛历史或类似的东西。所以我不是在寻找一个持久的数据库解决方案。

标签: node.jssocket.io

解决方案


通常,您将为每个客户端生成一个令牌(最好是加密安全的令牌)。当客户端第一次加入时,生成游戏数据,并将该数据与令牌相关联。然后,将该令牌发送给客户端。当客户端重新连接时,它可以将该令牌发送回服务器,然后服务器将数据与客户端重新关联。

至于服务器问题,有很多方法可以解决。我要做的是创建一个名为tempor的文件夹session,然后将每个游戏存储在自己的临时文件中。当服务器重新启动时,它会检查临时文件夹中的游戏文件,加载它们,然后清除它们的临时文件。您可以在 NodeJS 中添加处理程序,以便unhandledExceptionunhandledRejection服务器崩溃或关闭之前将当前活动的游戏保存到它们自己的临时文件中。


推荐阅读