0

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

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

这是处理此任务的有效方法吗?我担心这是大量的 SQL 数据库命令。我最近还听说,对经常使用的命令使用 SQL 触发器通常是不受欢迎的。如果这不是解决此问题的明智方法,那么有哪些更有效/可扩展的方法来处理多人匹配的用户匹配?请尽可能详细地介绍算法步骤。考虑到多人游戏的数量,这似乎很频繁地进行,但我真的很难找到有关如何处理它的材料或任何其他指导来源。

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

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

4

1 回答 1

0

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

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. 您将了解更多关于您的要求的信息。
于 2015-10-18T18:16:36.743 回答