在比赛制作的多人游戏中“与对手配对”的最佳方式

时间:2014-12-15 18:49:38

标签: algorithm sorting mobile server multiplayer

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

这是一个两部分问题。


如果我的游戏是匹配制作1v1类型的游戏而你打开手机的应用程序,选择“玩”并找到对手,最好的方法是什么?

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

有人打开应用程序,点击播放,所以我需要将它们配对,所以我将此BOOL翻转为YES然后我们寻找其他人的YES值并做出确认然后他们玩了吗?

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

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

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

但是,现在我在服务器上有10,000名玩家全部处于配对模式,那么制作比赛的最佳方法是什么?如果我最终得到5个玩家(玩家A,B,C,D和E)都与同一个玩家(玩家F)配对怎么办,我确定只是使用了一些简单的rand()打破平局算法,但似乎有人可能会一直处于关系状态并且不断被抛出,可能需要20秒才能确认两名球员将会相互争斗。最优算法会有效地配对每个人,任何想法?我有一种感觉,它将涉及某种类型的队列,按照你已经等待多长时间的配对。 (那是问题2

1 个答案:

答案 0 :(得分:4)

我实现这个的方式如下:

  1. 每个玩家在数据库中都有唯一的player_id
  2. 当玩家连接到您的服务器时(它不应连接到数据库本身),请将它们添加到活动会话列表中。
  3. 具有特定时间间隔作为超时。客户端应该每秒(或您想要的任何时间段)向服务器发送ping数据包。如果服务器在指定的时间后未从客户端收到ping,请断开客户端连接。如果玩家在游戏中发生这种情况,请通知其他用户他们的对手已断开连接,并认为该匹配无效。
  4. 如果您想阻止无效匹配,可以将当前游戏会话状态保存到数据库(或其他外部源),当两个玩家再次准备就绪时,通知他们每个人都已准备好匹配。
  5. 此时,我们已经解决了连接问题。现在,关于多个用户是否与同一个人配对的问题。最简单的事情就是

    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数据包,您还应该从可用播放器列表中删除播放器。