在匹配多人游戏中,与对手“配对”的最佳方式是什么?

3
这个问题并不特定于某种语言,而是与在1v1匹配游戏中使用的算法逻辑有关。
这是一个两部分的问题。
如果我有一个匹配游戏,你打开手机应用程序,选择“玩”,它会为你找到对手,那么最好的方法是什么?
假设在我的玩家数据库中,我有一个名为“配对”的密钥,其BOOL值为YES/NO。
当有人打开应用程序,点击“玩”,我需要将他们匹配,所以我将这个BOOL翻转为YES,然后我们寻找另一个具有YES值的人,并进行确认,然后他们就可以开始玩了?
如果第一个用户在等待匹配时关闭应用程序因为他们感到无聊并离开,服务器值将保持为“Yes”,因为我无法将其切换为NO,因为应用程序已关闭。所以这样行不通。
因此,我有一个名为“配对”的密钥,其int值为0 = no,除了0之外的任何值都是yes,所以每秒钟我从客户端向服务器增加1次这个值。在任何给定时间,如果此值在10秒左右(服务器端)未更改,则认为用户关闭了应用程序并离开,因此我们将该值翻转为“0”。
现在我们有了正确的配对模式检测(问题1:这是检测正确配对模式的最佳方法吗?一个动态变量)
但是,如果我在服务器上有10,000个处于配对模式的玩家,最好的匹配方式是什么?如果五个玩家(玩家A、B、C、D和E)都被分配给同一个玩家(玩家F),那该怎么办?当然,我只需要使用一些简单的rand()绑定算法,但似乎有人可能会一直陷入平局并不断被抛来抛去,可能需要20秒才能确认两个玩家准备对战了。最优算法将有效地将所有人配对,您有什么想法?我有一种排队的感觉,按等待时间的顺序排序。(这是问题2)。
1个回答

4
我会这样实现:
  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 - undefined
我已经编辑了帖子,包括对第二个问题的可能解决方案。 - undefined
非常抱歉我花了这么长时间才接受这个答案!我完全忘记了哈哈,我们开始使用Parse进行编程,但很快就转向了Firebase,因为它可以为你完成所有这些工作,并且更便宜。而且Parse即将关闭,哈哈。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接