流星实时游戏 - 根据他们的分数匹配两名玩家?

Posted

技术标签:

【中文标题】流星实时游戏 - 根据他们的分数匹配两名玩家?【英文标题】:Meteor realtime game - match two players according to their score? 【发布时间】:2015-02-26 02:04:45 【问题描述】:

我想构建一个实时问答游戏,随机匹配两名玩家(如果他们登录则根据他们的获胜率)。我已经阅读了《Discover Meteor》一书,并对框架有基本的了解,但我只是不知道如何实现匹配部分。有人知道怎么做吗?

【问题讨论】:

我需要在我的游戏中随机配对对手,所以我开始编写一个包来做到这一点 (peppelg:random-opponent-matcher)。随意使用/改进它,如果您遇到/开始编写自己的包,请告诉我,这样会更好。 干得好@PeppeL-G。我已经阅读了你的包的自述文件,但对它的逻辑有点困惑。你能提供一个演示应用程序或者描述一个简单的用例吗? 我将其发布为解决方案。随时向它提出您的问题。 【参考方案1】:

如果你想匹配分数接近的用户,你可以这样做:mongodb - Find document with closest integer value

这些 Mongo 查询的 Meteor 代码非常相似,但有一些微妙的差异有点棘手。在 Meteor 中,它看起来像这样:

  SP  // "selected player" = the User you want to match someone up with
 var score = SP.score; // selected player's score

  var queryLow = score: $lte:score,_id:$ne:SP._id;
  var queryHigh = score:$gte:score,_id:$ne:SP._id;

  // "L" is the player with the closest lower score
  var L=Players.findOne(queryLow,sort:score:-1,limit:1);

  // "H" is the player with the closest higher score
  var H=Players.findOne(queryHigh,sort:score:1,limit:1);

所以,现在您可以参考得分在“选定球员”正上方和正下方的球员。在使其随机化方面,也许可以从一个简单的算法开始,例如“将我与得分最接近的下一个可用玩家匹配”,然后如果它太可预测和无聊,您可以在算法中添加一些随机性。

你可以在这里查看上面的 Meteor 代码http://meteorpad.com/pad/4umMP4iY8AkB9ct2d/ClosestScore 你可以分叉它并弄乱查询以查看它是如何工作的。 祝你好运! Meteor 很棒,我很喜欢。

【讨论】:

谢谢你的回答looshi!【参考方案2】:

如果你将包peppelg:random-opponent-matcher添加到你的应用程序中,你可以像这样匹配对手:

在服务器上,您需要有一个 RandomOpponentMatcher 的实例,如下所示:

new RandomOpponentMatcher('my-matcher', name: 'fifo', function(user1, user2)
    // Create the match/game they should play.
)

您传递给RandomOpponentMatcher 的函数将在两个用户匹配到彼此对战时被调用。在其中,您可能想要创建用户应该互相对战的比赛(这个包只将对手匹配在一起,它不包含任何玩游戏/比赛的功能)。

在客户端,您还需要创建RandomOpponentMatcher 的实例,但您只需将名称传递给它(与您在服务器上使用的名称相同):

myMatcher = new RandomOpponentMatcher('my-matcher')

那么当用户登录并与随机对手匹配时,您需要做的就是调用add方法。例如:

<template name="myTemplate">
    <button class="clickMatchesWithOpponent">Match me with someone!</button>
</template>
Template.myTemplate.events(
    'click .clickMatchesWithOpponent': function(event, template)
        myMatcher.add()
    
)

当两个不同的登录用户点击按钮时,你传递给服务器上RandomOpponentMatcher的函数将被调用。

【讨论】:

太好了,现在我明白了很多。但是有一个问题:您的软件包是否检测到已匹配的用户,从而避免匹配已经在游戏中的用户,还是我应该自己实现它? 服务器有一个寻找对手的用户列表,当用户调用add方法时,用户就被添加到该列表中。当该列表中有两个用户时,这两个用户将从该列表中删除并匹配在一起。所以用户每次调用add方法最多匹配一个对手。 你的包的自述文件说它没有提供在匹配时通知客户端的方法。我想要做的是当用户点击“匹配”按钮时首先将用户路由到等待页面(他可以点击“取消”以触发 matcher.remove()),然后当 onMatch 被调用时,我将创建一个新的游戏文档并将两个匹配的用户路由到相应的游戏模板。但是如果用户在匹配时没有被注意到,我该如何进行路由? 当两个对手匹配时,您创建一个新的游戏文档,其中包含(除其他外)应该玩它的两个用户(可能是他们的 id)。用户将订阅他们应该玩的游戏文档(我想,他们怎么会知道他们应该玩的比赛?),因此您可以使用observe(添加的回调)在当前用户获得时得到通知比赛。你和我在一起吗?【参考方案3】:

一个实现可能如下:

用户以某种方式触发了“寻找游戏”事件,该事件将 user.profile.lookingForGame 上的属性设置为 true。然后该事件调用服务器端 Meteor 方法,该方法查询所有其他在线用户正在寻找游戏。

从那里你真的取决于一旦他们“匹配”你想如何处理用户。

要确定所有在线用户,请尝试使用用户状态包: https://github.com/mizzao/meteor-user-status

添加后,任何在线用户都将在“在线”的配置文件对象中拥有一个属性。您可以使用它来查询所有在线用户。

【讨论】:

抱歉,格式不正确 - 是通过我的手机完成的。明天我会更新更详细的解释。 感谢您的回答埃里克。至于在线用户的确定,我提出了这样的解决方案:当玩家点击“匹配”按钮时,他/她的用户文档的“就绪”属性将被设置为“真”。一轮游戏结束后,两个玩家的“就绪”属性都将设置为“假”。因此,当服务器匹配两个玩家时,它可以在“准备好”的玩家中进行选择。你觉得这个解决方案怎么样?

以上是关于流星实时游戏 - 根据他们的分数匹配两名玩家?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌玩游戏实时多人游戏如何获得快速匹配玩家的名字?

玩家只能从 score.list API 获得自己的分数

保存的游戏+实时多人Android

测试与发布

HTML5 & Javascript Canvas 游戏 - 如何让玩家能够保存他们的游戏

当玩家点击屏幕开始游戏时如何开始基于时间的得分