我想建立一个实时测验游戏,随机匹配两个玩家(如果他们登录,则根据他们的获胜率)。我已经阅读了Discover Meteor一书并对该框架有了基本的了解,但我根本不知道如何实现匹配部分。有谁知道怎么做?
答案 0 :(得分: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 你可以用它来解决问题,看看它是如何工作的。 祝好运!流星很棒,我真的很喜欢它。
答案 1 :(得分:0)
一种实现可能如下:
用户以某种方式触发“寻找游戏”事件,该事件将user.profile.lookingForGame上的属性设置为true。然后该事件调用服务器端Meteor方法,该方法查询寻找游戏的所有其他在线用户。
从那里你真的取决于你匹配后如何处理用户。
要确定所有在线用户,请尝试使用“用户状态”包: https://github.com/mizzao/meteor-user-status
添加后,任何在线用户都会在“在线”的个人资料对象中拥有一个属性。您可以使用它来查询所有在线用户。
答案 2 :(得分:0)
如果你将软件包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
的功能将被调用。