【发布时间】:2019-05-21 02:27:36
【问题描述】:
我正在开发一款多人回合制游戏(例如国际象棋),应该支持很多玩家(这就是想法)。我的问题是关于我正在开发的一项服务,它是配对系统,负责配对 2 名玩家以开始一个房间并开始游戏。
所以,这就是配对服务:
matchPlayers() {
if (this.players.length >= 2) {
let player1 = this.players.shift();
let player2 = this.players.shift();
if (player1 !== undefined && player2 !== undefined) {
player1.getSocket().emit('opponent_found');
player2.getSocket().emit('opponent_found');
return this.createMatchInDataBaseApiRequest(player1, player2)
.then(function (data) {
let room = new RoomClass(data.room_id, player1, player2);
player1.setRoom(room);
player2.setRoom(room);
return room;
});
}
}
return false;
}
在服务器的入口点,我将每个新的套接字连接推送到一个数组“PlayersPool”,该数组供等待匹配的玩家使用。
现在我的方法是在有可用用户时配对用户,(FIFO - 先进先出)。
我看到的这个配对系统的问题(和疑问)是:
这取决于新用户,每次新用户连接时都会执行,流程是:一个用户连接,get's添加到池中,并检查是否有用户等待配对,如果有创建了一个房间,他们可以玩,如果没有,他会被添加到等待池中;直到新用户连接并执行代码等等...
如果在某些奇怪的情况下(不确定是否会发生)2 名玩家同时被添加到等待池中,会发生什么情况,此服务会发现池为空并且不会创建房间:为了解决这个问题,也许有另一个服务总是在运行并检查池?最好的方法是什么?这甚至会发生吗?在哪种情况下?
感谢您的帮助。
【问题讨论】:
-
好吧,您还没有提供处理传入连接、将它们添加到播放器池或从哪里调用 matchPlayers() 等的代码。但通常,不,它应该不可能一次将多个人添加到池中。即使两个玩家同时连接,代码也不是多线程的,所以总是先处理一个玩家。 (尽管哪个先出现可能是任意的。)