Elo等级分系统

这是一个使用Swift构建的Elo等级分系统。它具有输赢概率估算和针对无限数量玩家的等级分计算功能。等级分计算器可以处理1对1、2对2、3对100等各种游戏。它将为您提供玩家A对阵玩家B的获胜概率(百分比形式)。

通过Swift Package Manager安装

  1. 打开您的Package.swift文件,并将以下内容添加到您的软件包依赖项中

.package(url: "https://github.com/BryanNorden/elo-rating-swift.git", from: "1.2.0"

  1. 在Package.swift中找到主目标,并添加"EloRatingSystem"

  2. 将以下代码添加到您想使用等级分系统的任何文件中:import EloRatingSystem

  3. 构建/运行,然后尽情使用

注意

计算获胜概率

EloRating().chanceOfWinning(forPlayer: 100.0, vs: 1.0) -> 以小数形式返回获胜概率(百分比)。

获胜概率示例

我们有两个玩家。Bob的等级分为800,Jake的等级分为1500。

要计算Bob击败Jake的可能性,您可以使用以下代码:let chanceOfBobBeatingJake = chanceOfWinning(forPlayer 800, vs ratingB: 1500) 然后chanceOfBobBeatingJake = 0.17472092062234879,即Bob击败Jake的概率为17.5%。

Jake击败Bob的概率可以用以下代码计算:let chanceOfJakeBeatingBob = chanceOfWinning(forPlayer 1500, vs ratingB: 800) 所以 chanceOfJakeBeatingBob = 0.98252791166305542,即Jake击败Bob的概率为98.25%。

计算游戏后的等级分

EloRating().calculateWinLossRatings(_ players: [EloPlayer]) 这将接受一个EloPlayer数组,并返回一个更新了等级分的EloPlayer数组。您需要为参加游戏的每位玩家创建一个EloPlayer。EloPlayer仅用于该游戏。您可以使用自己的玩家模型。

重要提示: EloPlayer有一个可选的属性id和uuid,以帮助您识别您的用户。如果您不为EloPlayer分配用户的id或uuid,该函数也能正常工作,但在返回等级分计算结果时,您将更难识别您的用户。

玩家将根据您分配给玩家的游戏结果被排序到获胜团队和失败团队中(这就是它可以处理任何数量玩家的原因)。然后,它将根据每位玩家在游戏开始前的等级分计算每个人的等级分。因此,您需要使用他们的新等级分来更新您的玩家模型,该等级分将是 EloPlayer.ratingAfter

如何使用calculateWinLossRatings方法的示例

let players = [
EloPlayer(gameResult: .won, ratingBefore: 900, ratingAfter: 0, ratingChange: 0, id: 112),
EloPlayer(gameResult: .won, ratingBefore: 600, ratingAfter: 0, ratingChange: 0, id: 200),
EloPlayer(gameResult: .lost, ratingBefore: 1500, ratingAfter: 0, ratingChange: 0, id: 6),
EloPlayer(gameResult: .lost, ratingBefore: 1100, ratingAfter: 0, ratingChange: 0, id: 22),
EloPlayer(gameResult: .lost, ratingBefore: 1100, ratingAfter: 0, ratingChange: 0, id: 56)
\]

let calculatedPlayers = EloRating().calculateWinLossRatings(players)

这将返回这些玩家

calculatedPlayers = [
EloPlayer(gameResult: .won, ratingBefore: 900, ratingAfter: 943.9107, ratingChange: 43.9107, id: 112),
EloPlayer(gameResult: .won, ratingBefore: 600, ratingAfter: 647.1034, ratingChange: 47.1034, id: 200),
EloPlayer(gameResult: .lost, ratingBefore: 1500, ratingAfter: 1468.2899, ratingChange: -31.7100, id: 6),
EloPlayer(gameResult: .lost, ratingBefore: 1100, ratingAfter: 1070.3479, ratingChange: -29.6520, id: 22),
EloPlayer(gameResult: .lost, ratingBefore: 1100, ratingAfter: 1070.3479, ratingChange: -29.6520, id: 56)
]