3 个版本 (1 个稳定版)
1.3.1 | 2023 年 6 月 12 日 |
---|---|
0.9.0 | 2021 年 5 月 13 日 |
0.1.1 | 2021 年 3 月 27 日 |
#154 在 游戏
每月 30 次下载
8MB
847 行
包含 (debian 软件包,1MB) releases/kda-tools_1.1.0_amd64.deb,(debian 软件包,575KB) releases/kda-tools_0.1.1_amd64.deb,(debian 软件包,650KB) releases/kda-tools_0.2.0_amd64.deb,(debian 软件包,780KB) releases/kda-tools_0.8.0-ALPHA_amd64.deb,(debian 软件包,795KB) releases/kda-tools_0.8.1_amd64.deb,(debian 软件包,1MB) releases/kda-tools_0.9.0_amd64.deb 以及更多。
这些工具帮助您在多玩家竞技游戏中的装备选择上进行 Alpha/Beta 测试。特别是,它非常适合检查 KDA,包括时间上的和检查特定配置的 KDA。
什么?
我经常玩 猎杀:对决。它非常有趣。有时也会非常沮丧。这款游戏时长很长,非常紧张,战斗快,角色特化和装备选项非常丰富。可能需要打几十场比赛才能确定某个配置是否值得,而且配置很多,一场比赛要花一个小时 ... 简而言之,很难得到关于哪些装备配置、战术或朋友有用的反馈。
为此,我记录了比赛日志,并编写了这个工具来输出收集到的数据的一些见解。
使用它,您必须记录比赛信息。但比赛要花一个小时,所以这并不增加多少开销。
然后,您需要使用该软件包提供的工具
kda-summary
将总结整个日志中的 K、D、A 值(以及通常的 KDA 指标)。kda-compare
将运行整个数据集,并告诉您是否在不同的配置下有显著的不同。kda-explore
允许您查看带和不带有任何其他东西的条件分布 的任何东西。
适用于 Debian / WSL
目前,只需从releases/目录中获取一个测试deb包即可。例如 1.3.0
然后,在 wsl 中,
sudo dpkg -i kda-tools_1.3.0_amd64.deb
您可以直接使用上面的示例。
基础知识
保持如下匹配日志(请注意,这是一个 键值计数格式 )。
<date> [<items or friends initials>] [K|D|A|B]
例如,我的狩猎日记看起来像这样
2021-03-12 BAR+Scope pistol K K B alone
2021-03-12 BAR+Scope pistol K D D jb
2021-03-12 Short-Rifle Short-Shotgun K D jb
2021-03-12 BAR+Scope pistol D jp+jb
2021-03-13 BAR+Scope pistol jp D
2021-03-13 BAR+Scope pistol jp B D D A A
2021-03-13 Shotgun pistol jp D
2021-03-13 BAR+Scope pistol jp K
2021-03-14 Short-Rifle akimbo alone
2021-03-17 LAR Sil pistol alone
2021-03-17 pistol-stock akimbo alone
2021-03-17 Short-Shotgun pistol-stock alone
而我的常用副驾驶JP有一个像这样的
2021-04-19 Martini-Henri_IC1 Caldwell_Conversion_Chain JV B B K
2021-04-19 Martini-Henri_IC1_Deadeye Caldwell_Conversion_Chain JV JB
2021-04-19 Martini-Henri_IC1_Deadeye Caldwell_Conversion_Chain JV JB B B
2021-04-19 Vetterli_71_Karabiner Bornheim_No_3 JV JB B B
2021-04-19 Vetterli_71_Karabiner Caldwell_Conversion JV JB D
2021-05-02 Martini-Henri_IC1 Caldwell_Conversion_Chain JV JB A
2021-05-02 Lebel_1886_Marksman Caldwell_Conversion_Chain JV JB K K
2021-05-02 Lebel_1886_Marksman Caldwell_Conversion_Chain JV JB K K
2021-05-02 Martini-Henri_IC1_Deadeye Caldwell_Conversion_Chain JV JB B B B B K K K
他比我好得多。您可以使用任何您想要用来表示装备或朋友的内容 ... 它将只对所有这些内容运行多元假设测试,其中重要的部分是:K D A 或 B
,例如...
examples/journal.txt的内容
2021-01-03 K K Sniper
2021-01-03 K D Shotgun
2021-01-04 K K JP Sniper
2021-01-04 K D B Shotgun JB
2021-01-04 K D B Sniper JB
是5场比赛
- 两次使用狙击步枪装备的击杀
- 一次击杀和一次死亡,使用霰弹枪装备
- 两次击杀,使用狙击步枪装备和队友"JP"
- 一次击杀、一次死亡和一次赏金,使用霰弹枪和队友"JB"
- 相同,但使用狙击步枪装备
自动:KDA摘要
让我们看看随着时间的推移摘要情况如何
$ <journal.txt kda-summary
n Date K D A B KDA sK sD sA sB mKDA mK mD mA mB
1 2021-01-03 2 0 0 0 2.00 2 0 0 0 2.00 2.00 0.00 0.00 0.00
2 2021-01-03 1 1 0 0 1.00 3 1 0 0 3.00 1.50 0.50 0.00 0.00
3 2021-01-04 2 0 0 0 2.00 5 1 0 0 5.00 1.67 0.33 0.00 0.00
4 2021-01-04 1 1 0 1 1.00 6 2 0 1 3.00 1.50 0.50 0.00 0.25
5 2021-01-04 1 1 0 1 1.00 7 3 0 2 2.33 1.40 0.60 0.00 0.40
还不错。注意,kda-summary
需要 使用标签 K
表示击杀、D
表示死亡、B
表示赏金、A
表示助攻。它输出您每场比赛的统计数据(K、D、A、B列),该场比赛的KDA值 (K+A)/D
,K、D、A和B的运行总和(接下来的4列)以及KDA、K、D、A和B随时间变化(最后5列)的平均值(平均/比赛)。如果您想在这里停止并拉取这些数据到另一个程序,也可以。
注意日期字段 Date
。如果您在日志的每行中放置日期格式为 YYYY-MM-DD
的日期,它将填充该字段。请参见上面的示例或 kvc。如果您不喜欢日期的格式要求,可以在那里提交错误报告。
半自动:KDA比较
那么,哪个装备或合作伙伴更好?KDA比较为您做了一些测试。
$ <journal.txt kda-compare
Processed. Read: 5 rows and 8 variables
[====================================================] 100.00 % 2696.14/s
met grp n/d val N n/d ~val M p
kda Sniper 5/1 5.00 3 2/2 1.00 2 0.06
kda JP 2/0 inf 1 5/3 1.67 4 0.49
kda Shotgun 2/2 1.00 2 5/1 5.00 3 0.77
kda JB 2/2 1.00 2 5/1 5.00 3 0.78
b/d Sniper 1/1 1.00 3 1/2 0.50 2 0.24
b/d Shotgun 1/2 0.50 2 1/1 1.00 3 0.69
b/d JB 2/2 1.00 2 0/1 0.00 3 NaN
b/d JP 0/0 NaN 1 2/3 0.67 4 NaN
让我们看看。第一行是 met grp ...
这些是
- 指标名称(例如,kda或赏金/死亡b/d)
- 项目组(grp)
- 值计数(n)
- 死亡(d)
- 带有grp的指标的'val'值
- 使用grp的匹配数量(N)
- 没有grp的值计数(n)
- 没有grp的死亡计数(d)
- 没有grp的指标的'val'值
- 没有grp的匹配数量(M)
- 以及在没有grp的情况下观察到该'val'的概率。
您可以看到每个项目的pvp指标(kda或(击杀+助攻)/死亡),以及pve指标(赏金/死亡)。
最后一个,p,通常被称为p值,如果它很低,那么您使用grp的回合比没有grp的回合要好得多。
在上面的数据中,使用 Sniper
武器的回合似乎比不使用它的回合要好得多,给定 p
值很小。
注意,有些 NaN
,因为当我与JP一起玩时,我没有得到赏金或死亡(0/0),这并不是一个有意义的比较结果。不那么明显的是,当我与JB一起玩时,我也无法得到p值,因为在我不与JB一起玩的回合中,我 从未 得到赏金。这意味着对于 基线(没有JB)的情况,没有有意义的表示。
好吧,那么呢?自己得出结论,并尝试混合你的装备。如果你只和你的朋友JP玩狙击手,只和你的朋友JB玩霰弹枪,它们将高度相关,可能很难看出JB或霰弹枪哪个更有影响。
有一个选项-i
可以忽略某些物品。如果你只想看武器,这很有用。
让我们忽略我的僚机JP和JB,只检查武器。
$ <journal.txt kda-compare -i JP JB
Processed. Read: 5 rows and 8 variables
[====================================================] 100.00 % 3450.51/s
met grp n/d val N n/d ~val M p
kda Sniper 5/1 5.00 3 2/2 1.00 2 0.08
kda Shotgun 2/2 1.00 2 5/1 5.00 3 0.77
b/d Sniper 1/1 1.00 3 1/2 0.50 2 0.24
b/d Shotgun 1/2 0.50 2 1/1 1.00 3 0.69
现在我们看到狙击手在KDA上略有下降,但b/d没有变化。
你也可以测试配对(组大小=2)
$ <journal.txt kda-compare --group-size 2
Processed. Read: 5 rows and 8 variables
[==================================================] 100.00 % 8175.42/s
met grp n/d val N n/d ~val M p
kda JP+Sniper 2/0 inf 1 5/3 1.67 4 0.47
kda JB+Sniper 1/1 1.00 1 6/2 3.00 4 0.78
kda JB+Shotgun 1/1 1.00 1 6/2 3.00 4 0.79
b/d JB+Shotgun 1/1 1.00 1 1/2 0.50 4 0.62
b/d JB+Sniper 1/1 1.00 1 1/2 0.50 4 0.64
b/d JP+Sniper 0/0 NaN 1 2/3 0.67 4 NaN
现在我们看到朋友/武器配对之间没有真正差异。注意inf
结果。你可能认为无穷大是无法分析的。但是,因为我们使用的是bootstrap方法(见poisson-rate-test),你实际上可以得到有意义的概率,因此可以得到有意义的p值。
为了确认朋友是一个干扰变量(没有统计上显著差异),尝试忽略武器
$ <journal.txt kda-compare -i Sniper Shotgun
Processed. Read: 5 rows and 8 variables
[====================================================] 100.00 % 3948.08/s
met grp n/d val N n/d ~val M p
kda JP 2/0 inf 1 5/3 1.67 4 0.49
kda JB 2/2 1.00 2 5/1 5.00 3 0.77
b/d JB 2/2 1.00 2 0/1 0.00 3 NaN
b/d JP 0/0 NaN 1 2/3 0.67 4 NaN
这里我们确实看到,僚机的选择对武器选择的影响要小得多(比较之前的两个例子中的值)
使用
$ kda-compare -h
It *expects* input in kvc format (one match per line), and processs the variables K, D, and A, as a function of *all
other* variables present. It ignores kvc keywords / fields (like dates), but you'll have to specify other things to
ignore manually.
USAGE:
kda-compare [FLAGS] [OPTIONS]
FLAGS:
-f Speed up computation by doing a fewer number of iterations. Helpful for quick looks but the
ordering of some sets may change across multiple invocations
-h, --help Prints help information
-n Display notes about particular test cases in the output
-V, --version Prints version information
OPTIONS:
-g, --group-size <group_size> Instead of individual items (group_size==1), rank by enumerated groupings that
appear in data of a given size. [default: 1] [possible values: 1, 2, 3, 4]
-i <ignore>... List of fields to ignore (if they appear in data). You can ignoring fields A B and
C as '-i A,B,C' or '-i A -i B -i C' but not '-i A B C' or '-i A, B, C'. That's
because of shell magic, not becuase of the way it was implemented
-o <out_format> Output format which can be one of Vnlog or Whitespace-, Tab-, or Comma-seperated.
[default: wsv] [possible values: wsv, tsv, csv, vnl]
手册:KDA-Explore
要真正深入,你可以评估任何变量的条件分布,条件是任何其他变量的发生。这就是kda-explore
的作用。
我的意思是,kda-explore
中'K'与'k'与"杀"的语义无关。我们通过要求它按名称分析变量来探索数据。例如,在上面的数据中,要查看使用狙击手和不使用狙击手的比赛中的“K”个“杀”,你形成表示为“K:Sniper”的“实验”,并要求kda-explore
通过kda-explore "K : Sniper"
运行该实验。
$ < journal.txt kda-explore K:Sniper
Processed. Read: 5 rows and 8 variables
Varibables found: Date Sniper K D Shotgun JP B JB
Debug: processing: K:Sniper
met grp n M rate ~n ~M ~rate p notes
K Sniper 5 3 1.67 2 2 1.00 0.37
这意味着当你有狙击手时,杀的概率更高,但不是那么高,以至于它可能不会随着时间的推移而有很大差异(p .37)。我们这里只检查杀。死亡呢?
$ < journal.txt kda-explore D:Sniper
Processed. Read: 5 rows and 8 variables
Varibables found:
Date Sniper K Shotgun D JP B JB
Debug: processing: D:Sniper
met grp n M rate ~n ~M ~rate p notes
D Sniper 1 3 0.33 2 2 1.00 0.19
你可以运行许多用'vs'分隔的实验,针对许多输出变量...所有这些都是有效的
kda-explore "K D : Sniper vs Shotgun"
来查看与狙击手和霰弹枪相比的杀和死亡kda-explore "D : K"
来查看你是否在杀人时死亡更多kda-explore "Sniper: JB"
来查看你是否在JB在场时玩狙击手更多或更少kda-explore K:all
来查看所有变量的杀散布和排序率比较
等等...每个“标签”(日志中的行上的物品)都是根据你的实验决定的有效输入或输出。
使用
$ kda-explore -h
USAGE:
kda-explore [OPTIONS] <command>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-o <out_format> Output format which can be one of Vnlog or Whitespace-, Tab-, or Comma-seperated. [default:
wsv] [possible values: wsv, tsv, csv, vnl]
ARGS:
<command> The A/B comparison to run, of the form '<some variables : <other variables>'. e.g., 'K: pistol'
will check kills with and wtihout pitols [default: K D A : all]
一种解释方法是“这没有意义”。这是真的,它仍然很原始,主要是我自己使用的玩具。
待办事项
- 更好地记录比赛日志格式。见:github.com/jodavaho/kvc.git
- 改进比赛日志以允许:计数。(再次见kvc)
- 提供比赛日志的linter
- 创建/分解矩阵的工具,格式适合第三方分析(例如R)
- 执行功率测试/实验设计
- 移除'-c'作为必选开关...当移除了基线'_'时已过时
- 提供C库版本
- C++,
- Rust
已知问题
- 如果您有一个在每一局游戏中都会使用的物品,那么您数据不足。对于形式为
k:A
的每个测试,必须有至少一个不出现 A 的匹配。如果没有击杀 (k
) 也可以。
依赖项
~12MB
~190K SLoC