如何在Node.js中存储基于回合的游戏状态

时间:2020-05-23 14:29:32

标签: node.js socket.io

我正在开发回合制手机游戏,这是一个问答游戏。基本上,服务器将向玩家发送一个问题(一场比赛中将有两名玩家),然后玩家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分钟。之后,我不需要比赛历史记录或类似的内容。所以我不是在寻找持久的数据库解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

相关问题