- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个应用程序,用户登录后可以玩一个快速的 1v1 游戏(时长 20 秒)。我想知道将每个用户与另一个用户配对以玩游戏并转移到下一个用户而不连续多次玩同一用户的最有效方法。
我的第一个想法是有两个队列,其中包含每个在线用户的用户 ID。每当有新用户上线时,我都会将他们添加到最短的队列中,并不断从每个队列的顶部弹出一个人来互相玩。比赛结束后,我会简单地将每个用户添加到同一个队列中,以避免他们再次互相比赛。这看起来不错,但我想看看是否有任何其他更有效的方法来实现这个概念,而无需在服务器上保留以前玩过的用户列表。
最佳答案
你需要一个匹配系统来优先考虑等待时间最长的玩家。
您只需要 1 个队列,还需要使用表格来跟踪用户历史记录。如果您想要跨多个 session 的永久数据或匹配服务器崩溃,则该表可以是临时 session 数据或数据库表。该表应包含玩家 ID 和他们之前对战过的一组玩家 ID。最好限制数组的大小并使用 LIFO,因为您可能不想只存储玩家最近的比赛,即比赛历史。此外,如果玩家已经在线与其他人对战,则玩家可能会用完所有玩家。该表应如下所示:
比赛开始时,您可以更新比赛中所有球员的 previousPlayerID。当玩家加入队列时,您需要监听一个事件,我们称之为 onPlayerJoin()。如果队列中有超过 1 个玩家,您应该选择排队时间最长的玩家,并将他们的 playerID 与每个玩家的 previousPlayerID 进行比较,直到您找不到匹配的历史记录。
const historyLimit = 10;
function onPlayerJoin(Player newPlayer){
playerQueue.push(newPlayer);
if(playerQueue.length > 1){
for(let a=0; a<playerQueue.length-1; a++){
Player player = playerQueue[a];
for(int i=a+1; i<playerQueue.length; i++){
Player otherPlayer = playerQueue[i];
//if the player have not played before
if(otherPlayer.previousPlayerIDs.indexOf(player.id) > -1){
//save match up
player.previousPlayerIDs.push(otherPlayer.id);
otherPlayer.previousPlayerIDs.push(player.id);
//limit matchup histroy
if(player.previousPlayerIDs.length > historyLimit){
player.previousPlayerIDs.removeAt(0);
}
if(otherPlayer.previousPlayerIDs.length > historyLimit){
otherPlayer.previousPlayerIDs.removeAt(0);
}
//create lobby and remove players from the queue
createLobby(player, otherPlayer);
playerQueue.removeAt(a);
playerQueue.removeAt(i);
}
}
}
}
}
一个玩家可能已经和其他人玩过,他们正在等待一个他们以前没有玩过的人上线。您将需要一个重复发生的事件来检查等待时间最长的玩家是否已经等待太久。如果是这种情况,只需忽略 previousPlayerID 的匹配,并为该玩家创建一个大厅,让另一个可能等待很长时间的玩家。
如果您愿意,可以向表中添加更多列,例如他们加入队列时的时间戳和他们的匹配排名 (elo)。但是,如果您只想优先显示最近的玩家,则不需要这些其他列。
此外,如果您有大量并发用户,此解决方案可能无法很好地扩展,但如果您的并发用户少于 1,000-10,000,应该没问题
关于algorithm - 为快速游戏重复配对一组用户的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254503/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!