小编典典

Firebase:如何在游戏中匹配对手?

algorithm

我正在实施社交象棋游戏。每个用户都可以创建一个新游戏,他们将等到系统找到适合他们的对手。

用户创建游戏时,他们会指定约束条件:他们要玩的颜色以及对手的最低国际象棋等级。

对手可以匹配也可以不匹配。 例如,以下两个对手将匹配:

// User 1 with rating 1700              // User 2 with rating 1800
// creates this game                    // creates this game
game: {                                 game: { 
  color: 'white',                         minRating: 1650
  minRating: 1600                       }
}                                       // User did not specify a preferred color,
                                        // meaning they do not care which color to play

因此,如果用户1是系统中的第一个用户并创建了他们的游戏,他们将等待。用户2创建游戏后,应立即将其与用户1进行匹配。

另一方面,以下两个对手将不匹配,因为他们两个都想打白棋。在这种情况下,双方都应该等到别人用color: 'black'(或未指定颜色)创建minRating符合要求的游戏。

// User 1 with rating 1700              // User 2 with rating 1800
// creates this game                    // creates this game
game: {                                 game: { 
  color: 'white',                         color: 'white'  
  minRating: 1600                         minRating: 1650
}                                       }

我的关注点与成千上万的用户同时创建新游戏的场景有关。如何确保在不造成死锁的情况下匹配对手?也就是说,当用户1,用户2和用户3试图同时寻找对手时,我如何防止这种情况发生,它们的匹配算法将返回用户99。他们?

您将如何使用Firebase的功能来实现这样的匹配系统?


阅读 380

收藏
2020-07-28

共1个答案

小编典典

在NoSQL环境中,这是一项艰巨的任务,特别是如果您要匹配多个字段

在您的情况下,我将按颜色设置一个简单的索引,并在该颜色内存储对游戏的引用,优先级设置为minRating。这样,您可以通过首选颜色(优先级为minRating)查询游戏。

indexes: {
  color:{
     white:{
        REF_WITH_PRIORITY_TO_RATING: true
     },
     black:{
        REF_WITH_PRIORITY_TO_RATING: true
     }
  }
}

如果您想在比赛打开游戏时获取信息,请执行以下操作:

ref = new(Firebase)('URL');
query =ref.child('color_index/white/').startAt(minPriority);
query.on('child_added',function(snapshot){
  //here is your new game matching the filter
});

然而,这会如果用于过滤例如游戏引入多个领域变得越来越复杂dropRatetimeZone“gamesPlayed”等等......在这种情况下,你可以嵌套索引更深:

indexes: {
  GMT0: {
    color:{
       white:{
          REF_WITH_PRIORITY_TO_RATING: true
       },
       black:{
          REF_WITH_PRIORITY_TO_RATING: true
       },
  }
  GMT1: {
       // etc
  }
}
2020-07-28