likes
comments
collection
share

前端挑战:十年老粉清算 uzi 的 KDA

作者站长头像
站长
· 阅读数 10

Halo Word!大家好,我是大家的林语冰(挨踢版)~

天不生 ES6,JS(JavaScript)万古如长夜。蓦然回首,ES6 破蛋至今已渡过“七年之庠”,十年之期仅一步之遥。

虽然前端已死,但是传奇不死。鲜衣怒马少年郎,谁人不识射手王。作为一名挨踢攻城狮,我们不烦蹭一蹭流量,顶着神罚的风险计算一下 uzi 最强新人王者归来的 KDA。


功能概述

所谓“KDA”,其实是“Kill/Death/Assist”的首字母缩写,意思是“击杀阵亡比”,简称“战损比”。这个术语在人气网游英雄联盟和小众手游王者荣耀的大数据分析中还蛮常见的,游戏党一听就知道是行话。

所谓的“KDA 算法”,就是用来计算英雄的战损比的简单功能,这个功能在游戏助手中还蛮常见的。

KDA 的计算公式十分朴实无华——(击杀数 + 助攻数)/阵亡数,简写为(K + A)/D 就欧了,小学生都能算得明白。

唯一的细节是阵亡数作为分子不能为 0,所以当阵亡数为 0 时,我们需要将阵亡数强制设置为 1。

整个算法的考点如下:

  • 基础的算术运算
  • 基础的数据转换,比如从字符串中提取数据
  • 基础的边界处理,分子不能为 0 等

KDA 函数的签名大抵如下:

前端挑战:十年老粉清算 uzi 的 KDA

掌握基本需求后,我们就可以启动 VSCode 上机笔试了。


小试牛刀

首先 getKda() 函数接收的参数是一个斜杠分割的字符串战绩数据,以神复出首战的战绩为例,第一场的战绩是 '4/2/6',我们需要从字符串中提取需要的数据。其次需要将字符数字化,进一步计算。计算的过程还要考虑阵亡数作为分子不为 0,所以需要判断进一步处理。

然后我们就可以啪啪啪地撸出第一版源码了。

前端挑战:十年老粉清算 uzi 的 KDA

整理完具体实现思路后,我们可以写出更加凡尔赛的版本,下面版本与上面源码功能上是“图灵等价”的,但更加简洁。

前端挑战:十年老粉清算 uzi 的 KDA

猫眼可见,一个简单的 KDA 计算功能就被我们实现了。

但这只是用来计算和统计单场比赛的 KDA,现代的电竞职业联赛赛制可能有 BO1/BO3/BO5 等,也就是可能会有三局两胜/五局三胜等不同赛制,如果要统计比赛当天选手的 KDA,我们就必须进一步设计新功能,这也是一个蛮常见的需求。

接下来,我们就来尝试计算 uzi 王者归来首战当天的整体 KDA。


举一反一

以 uzi 复出首战为例,uzi 当天打满了整个 BO3,也就是一共有三把比赛,所以我们可以按需重新设计一个计算当天 KDA 的函数,该函数不再接收一场比赛的 KDA 数据,而是以接收多场比赛数据的数组作为参数。

这里有一个细节是,多场比赛的数据统计不像单场比赛那么简单粗暴,如果只是某场比赛的阵亡数是 0,不一定需要将其修正为 1。换而言之,当且仅当当天所有比赛的阵亡总和为 0 时,我们才需要手动将阵亡数修正为 1。

假设新函数是 getAllKda(),那么祂的函数签名大抵如下:

前端挑战:十年老粉清算 uzi 的 KDA

因为我们前面已经实现了根据单场字符串数据计算 KDA 的函数,所以我们不烦直接复用起来,我们需要做的就是将整个数据数组合成为 getKda() 函数需要的数据,然后就欧了。当然,这只是其中一种实现思路,你也可以直接设计算法计算,只要结果符合需求即可。

我们需要做的是将数组的每个击杀数/阵亡数/助攻数各自累加,数组累加优先考虑 Array.prototype.reduce() API,然后将累加完毕的数据合成为一个新数组,最后将新数组转化为 getKda() 函数需要的字符串即可。

前端挑战:十年老粉清算 uzi 的 KDA

猫眼可见,我们现在也可以计算 uzi 整个 BO3 的 KDA 了。

当然,实际应用中可能还有赛季/职业生涯等 KDA 统计,可以根据具体需求设计多维数组/其他数据结构继续计算,这里就不一一赘述了,大家举一反一即可。


免责声明

诸神回归只为强,让祂一血又何妨。永远滴神今犹在,不见当年伊芙王。

前端挑战:十年老粉清算 uzi 的 KDA

吾乃前端的虔信徒,传播 BUG 的福音。

我是大家的林语冰,我们一期一会,不散不见,掰掰~