【问题标题】:Best way to "pair with opponent" in a match-making multiplayer game在多人配对游戏中“与对手配对”的最佳方式
【发布时间】:2014-12-15 18:49:37
【问题描述】:

这个问题实际上并不是特定于语言的,它更多的是关于算法背后的逻辑,该算法将用于在 1v1 配对游戏中配对玩家。

这是一个两部分的问题。


如果我有一款配对 1v1 类型的游戏,你打开手机应用程序,选择“玩”,它会为你找到对手,最好的方法是什么?

假设在我的玩家数据库中,我有一个名为“配对”的键,其 BOOL 值为 YES/NO。

有人打开应用,点击播放,所以我需要配对它们,所以我将这个 BOOL 翻转为 YES,然后我们寻找具有 YES 值的其他人并进行确认,然后他们玩?

如果第一个用户因为无聊而离开而在等待付款时关闭应用程序会发生什么情况,服务器值将保持为“是”,因为我无法将其切换为“否”,因为应用程序已关闭。所以这行不通。

因此,我有一个带有 int 值和 0 = no 的键“配对”,除 0 以外的任何值都是 yes,所以我每秒从客户端到服务器将这个值增加 1。在任何给定时间,如果这个值在 10 秒左右(服务器端)后没有改变,我假设用户关闭了应用程序并离开了,所以我们将值翻转为“0”。

好的,现在我们有了正确的配对模式检测(问题 1:这是检测正确配对模式的最佳方法吗?一个动态变量)

但是,既然我的服务器上有 10,000 名玩家都处于配对模式,那么进行匹配的最佳方式是什么?如果我最终有 5 个玩家(玩家 A、B、C、D 和 E)都与同一个玩家(玩家 F)配对怎么办,当然我只是使用一些简单的 rand() 打破平局算法,但似乎有人可以最终总是打成平手并不断被折腾,可能需要 20 秒才能确认两个玩家将相互战斗。最佳算法将有效地配对每个人,有什么想法吗?我有一种感觉,这将涉及某种队列,按照您等待配对的时间顺序排列。 (这是第 2 题

【问题讨论】:

    标签: algorithm sorting mobile server multiplayer


    【解决方案1】:

    我的实现方式如下:

    1. 每个玩家在数据库中都有一个唯一的player_id
    2. 当玩家连接到您的服务器时(不应连接到数据库本身),将其添加到活动会话列表中。
    3. 有一个特定的时间间隔作为超时。客户端应该每秒(或您想要的任何时间段)向服务器发送一个ping 数据包。如果服务器在指定的时间后没有收到来自客户端的ping,则断开客户端。如果发生这种情况时玩家正在游戏中,请通知其他用户他们的对手已断开连接,并认为比赛无效。
    4. 如果您想防止无效匹配,您可以将当前游戏会话状态保存到数据库(或其他外部源)中,当两个玩家再次准备好时,通知他们每个人匹配已准备好。

    至此,我们已经解决了连接问题。现在,关于您是否有多个用户与同一个人配对的问题。最简单的方法是

    while server is running
        if player is not currently in a match
            if there are available opponents
                set the first player's opponent to the opponent
                set the opponent's opponent to the first player
                remove each of them from the list of available players
            else
                wait for an opponent to become available
    

    如果服务器在n 时间后没有收到来自客户端的 ping 数据包,您还应该从可用播放器列表中删除该播放器。

    【讨论】:

    • 这对问题 1 非常有用! Ping:D
    • 我已编辑帖子以包含问题 2 的可能解决方案。
    • 很抱歉我花了这么长时间才接受这个答案!我忘记了哈哈,我们开始用 Parse 以这种方式编程,然后很快切换到 Firebase,它为您完成所有这些,而且便宜得多。 Parse 也正在关闭,哈哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多