这是一个使用Swift构建的Elo等级分系统。它具有输赢概率估算和针对无限数量玩家的等级分计算功能。等级分计算器可以处理1对1、2对2、3对100等各种游戏。它将为您提供玩家A对阵玩家B的获胜概率(百分比形式)。
.package(url: "https://github.com/BryanNorden/elo-rating-swift.git", from: "1.2.0"
在Package.swift中找到主目标,并添加"EloRatingSystem"
将以下代码添加到您想使用等级分系统的任何文件中:import EloRatingSystem
构建/运行,然后尽情使用
要手动更新软件包,请打开终端并运行swift package update
如果遇到问题,可以在终端中运行以下命令来重置您的软件包:rm -rf .build/ *.xcodeproj/ Package.resolved
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
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)
]