背景
所以我试图为我的游戏创建一个排队系统。我希望有人等待一分钟才能被分配到AI。我也喜欢那些等待更长时间才能匹配技能水平相近的对手的人。我想知道最好的方法。我是否应该为AI分配设置setTimeout
和UTC时间来检查他们等待了多长时间?我只是想知道如果匹配后我将如何取消超时。
超时:
socket.on('waiting room', function (id) {
console.log("socket has joined the waiting room", id);
socket.join("waiting room")
setTimeout(function() {
socket.leave("waiting room")
socket.join("some ai game")
}, 60000)
})
答案 0 :(得分:2)
我认为游戏服务器资源在游戏中是有限的,然后玩家必须等待。因此,当游戏服务器可用时,我们会让等待时间最长的玩家玩。然后逻辑看起来像下面的东西。
const waitinglist = []
//user leave waiting
const leaveWaiting = (socketid) => {
waitinglist = waitinglist.filter((x) => x.socket.id != socketid)
}
io.on('connection', (socket) => {
socket.on('waiting room', function(id) {
console.log("socket has joined the waiting room", id);
socket.join("waiting room")
waitinglist.push({
socket,
time: new Date(),
})
})
//leave by themselves
socket.on('disconnect', () => {
leaveWaiting(socket.id)
})
socket.on('cancle waiting', () => {
leaveWaiting(socket.id)
socket.leave("waiting room")
})
})
//leave by other logic, like match/ai server available
matchResource.on('available', (resource) => {
const {
socket,
time
} = waitinglist.shift()
socket.leave("waiting room")
start_your_game(socket, resource)
})

全球等候名单,您可以将其替换为类似waiting-manager
当玩家进入waiting room
时,将他排队
当游戏服务器可用时,从队列顶部获取一名玩家,然后让他玩
玩家是否退出或开始游戏,将他从队列中删除