多人游戏参与者匹配 3 个或更多用户

Multiplayer game participant matching for 3 or more users

我正在建立一个小型爱好网站,主要在后端 Python 和 SQL,我不确定如何从概念上解决问题。

在多人游戏中匹配三个或更多玩家的有效方法是什么?我最初计划通过 SQL 语句来完成大部分工作,其中每个活跃玩家都进入 SQL table,我们称其为活跃游戏 table,在他们身上表明他们想玩游戏。之后,我打算让 SQL 个活动游戏 table 执行触发功能,其中,当指定数量的玩家进入 table 时,他们都会被分配一些 game_ID 指定他们将被分配到一个特定的游戏。然后,此 game_id 用于确保所有操作在这些成员中唯一发生。最重要的是,如果队列太长,则需要为活跃玩家设置超时触发器。

这是处理此任务的有效方法吗?我担心这是大量的 SQL 数据库命令。我最近还听说,通常不赞成对常用命令使用 SQL 触发器。如果这不是解决此问题的明智方法,还有什么 efficient/scalable 方法可以解决多人游戏的用户匹配问题?请尽可能详细地介绍算法步骤。考虑到存在多少多人游戏,这似乎很明显已经很频繁地完成了,但我真的很难找到 material 或任何其他关于如何处理它的指导来源。

编辑:相关参数主要是将人们分组到他们选择的游戏中。其他对匹配用户感兴趣且重要的可能是技能水平,其中可以根据他们的 win/loss 记录衡量三个用户被分配到同一匹配项的可能性。

现在,我想知道如何处理恰好为一个游戏分配三个玩家。我很好,并且仍然会发现它非常有用,如果在不考虑用户技能水平的情况下描述算法,那么任何一种类型的描述都会非常感激。

把我们上面的对话变成一个答案,存储过程正是我想要的。在我脑海中的实现中,看起来像这样:

create procedure dbo.matchPlayers
as
begin
    declare @gameID int;
    declare @players table (
       PlayerID int
    );
    while ((select count(*) from dbo.waitingPlayers) > 3)
    begin
        begin transaction;

        exec @gameID = dbo.createGame;

        update top(3) p
        set gameID = @gameID
        output inserted.PlayerID into @players
        from dbo.Player as p
        join dbo.waitingPlayers as w
           on p.PlayerID = w.PlayerID
        order by p.SkillLevel;

        delete w
        from dbo.waitingPlayers as w
        join @players as p
           on w.PlayerID = p.PlayerID;

        delete @players;
        commit transaction;
    end
end

当然,这是一个非常 简单的实现,它假设了关于您的模式的某些事情。您的架构可能不同。您可能希望根据以下内容更改实现:

  1. 如果等待的人数少于 3 人怎么办?
  2. 您可以有更复杂的匹配条件。在这里,我匹配最近的三个。但不能保证不会有一名技术高的球员与两名技术低得多的球员配对。
  3. 关于您的要求,您会了解更多。