全民电竞时代悄然而至?网红教授称:全民皆可从中获利

2019/4/19278 浏览综合
李永乐老师的理论果然无敌,不明觉厉,一亿我是不奢望了,但看完之后感觉中国区的全民选拔赛奖金还是可以拼一拼的!搬运李永乐老师的文章,全文如下——
《“菜鸡”也能赢电竞奖金吗?用计算机模拟分析一亿美金鹿死谁手》
电竞比赛越来越火,奖金也越来越高。最近有人告诉我,他玩的游戏《堡垒之夜》要举办一项比赛,总奖金池高达一个亿美金!不知道自己参加是否有机会分一杯羹。
TapTap
《堡垒之夜》是一款射击类游戏,所有玩家都能参与比赛,且人员是随机分配的,每100人进行一局比赛。如果实力不够参加世界总决赛,还可以赢周赛奖金。周赛的奖金和拿奖的规则如下:
比赛规则
TapTap
奖金分配
TapTap
那么问题来了:就算是全民选拔,没有俱乐部组队,玩家水平也有高有低,“菜鸡”玩家能拿到奖金吗?是不是要每局比赛击杀几十个人,才能问鼎冠军呢?
这些问题可以通过计算计程序来模拟,最后大家会发现:这1亿美元离我们还挺近的。
TapTap
一. 模型设计:
1.1战斗力
堡垒之夜是一款射击游戏,王者手里拿着枪,青铜手里也是枪,俩人对射还不一定谁射死谁。所以,我们需要设定一种方案,既要体现出玩家水平的差异,又要体现出随机的运气成分。
按照比赛规则:参赛的玩家,在一周内要完成十局比赛。我们假设一共有1000个玩家参与了比赛,为了评价每个人的实力,我们在计算中赋予每个玩家“战斗力”数值,按照战斗力从最弱到最强进行排序,就设战斗力是1、2、3、…、1000.
刚才说过,实力强的人只是能以更大的概率取胜,实力弱的人也可能会击杀实力强的玩家。所以当战斗力分别为a和b的A和B两个人遭遇时击杀对方概率如下:
TapTap
战斗力和击杀概率关系
​ 其实,这就是我们射击玩家“战斗力”的初衷:表示遭遇战中击杀对方的概率。
例如,战斗力为100的A和战斗力为300的B遭遇了, 那么A击杀B的概率为25%,而B击杀A的概率为75%。如果战斗力为100的A遭遇了战斗力为900的C,那么A只有10%的可能击杀C, 而C有90%的概率击杀A。
TapTap
击杀
1.2 随机分组
堡垒之夜参赛选手按照每100人一局的方式进行比赛,所以这1000个人会被随机的分成十组进行比赛。比赛结束之后再重新分组,一共进行十次。计算出每个玩家的总击杀数进行排名。为了模拟这个过程,可以将这1000名战斗力不同的玩家顺序打乱,然后切割成十个100人。
TapTap
不同组的玩家战斗力
这样的一轮比赛一共有10场,每个玩家都进行了一次比赛。然后我们再次打乱顺序重新比赛,这样的过程重复十次,完成一个周赛。
二. 模拟过程
现在有一百个随机组成的玩家开始比赛了,我们模拟游戏的进程。
2.1 开局:
让这些玩家随机的落在一张100*100的地图上,比如情况如下:
TapTap
开局不同玩家位置
如果两个玩家落入了同一个区域,就会发生遭遇战,根据刚才所说的击杀概率,只有一个人活了下来,击杀数加1。如果没有两个人落在同一区域,就进行下一步操作。
2.2 移动
玩家占有有利地形,就可以保持潜伏。玩家在空旷地带,就会快速移动。我们在模拟时认为这个过程是随机的,并且每次移动都只能移动到相邻的格子里。比如图中114这个玩家,他可能的移动区域是他周围的八个格子,再加上静止不动,一共九种操作,每种可能性都是1/9。
TapTap
玩家可能移动区
如果玩家处于棋盘边缘,那么可能移动区就变小了。比如处于边缘的15号玩家只有5种移动可能,角落的357号只有3种移动可能。
TapTap
玩家可能移动区
2.3 战斗
每一个玩家都发生了移动之后,两名玩家就可能会处于同一个区域,此时发生遭遇,开始战斗,按照战斗力和概率得出生存情况。
TapTap
981号和114号发生战斗
假如981号玩家胜利了,那么114号玩家就退出游戏,然后所有玩家在棋盘上的位置发生变化,再继续游戏。
2.4. 细化
不过,还有两个需要解决的问题:
一个是如果三个玩家同时到了一个格子里怎么办?处理方法是对三个人进行随机排序,首先前两个人战斗,然后胜利者再和第三个人战斗。
还有一个是对安全区的模拟:当战场上只剩下很少的人,为了避免长时间不相遇,我们还原了游戏内安全区的概念。每一次玩家移动结束后,最外层的一圈格子为“风暴圈”,风暴圈逐渐缩小,限制了边缘区的玩家移动,保证了游戏可以在一定的时间内结束。
TapTap
风暴圈和安全区
每个玩家都进行了十场比赛,就可以统计每个人的击杀数排名,把周赛反复模拟一千次,就知道每个玩家拿奖金的概率了。
三. 程序运行
把刚才的想法编辑成一个程序,大概长这样子…
template <typename T, typename... Args> il void read(T &x, Args &...args) {
char ch = getchar(); int f = 1; x = 0;
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') x = x*10+ch-'0', ch = getchar();
x *= f;
read(args...);
TapTap
运行时候大概长这个样子。
TapTap
模拟程序正在运行
TapTap
这不重要,看结果就好。
四. 结果分析
在某次周赛模拟中,排名前20的玩家如下:
TapTap
某场比赛前二十名
发现了吗? 战斗力为1000的那个最强玩家,没进前20!!!
TapTap
4.1 前20名玩家分布:
进了前二十名的玩家,战斗力900+的有7人,战斗力800到900的有9人,战斗力700到800的有2人,居然还有一个战斗力596的中等玩家也在1000人中进了前20!!!
TapTap
如果一局比赛说明不了问题,我们模拟1000场周赛。下图是1000场周赛每个玩家进入前20名的次数:
TapTap
战斗力越高的人,进入前20名的次数越多。进入过前20名的玩家中,战斗力最低的是377,他有一次进入了前20名;战斗力为600的玩家有11次进入了前20名;战斗力为800的玩家有37次进入前20;战斗力为1000的玩家有112次进入前20。所以就算是一个菜鸟玩家,一样可以有可能进前二十!
4.2 周赛冠军玩家分布
我们再来看获得第一名的次数。一千局周赛中,规律是实力越强获得第一名的次数越多,但是二者并不是严格线性的:战斗力为574的玩家就在这1000场比赛中获得了一次第一名,而获得第一名次数最多的是战斗力为993的玩家,获得了14次冠军,战斗力最高的1000号玩家获得冠军的次数只有6次。
TapTap
我只能说:在堡垒之夜这款游戏中,玩家要靠自己的实力,但是运气也很重要。
TapTap
4.3 周赛冠军击杀数
再看击杀数。理论上讲,一局比赛最多可以击杀99人,每一周十局比赛最多可以击杀990人。我们把1000场周赛第一名的击杀数量画在一张图上。
TapTap
第一名的击杀数在30到60之间,平均击杀数38.26人。就是说,如果我们在每场比赛中能击杀4个人,就有很大可能获得第一名,赢取周赛的5000美元大奖!
TapTap
4.4 前20名生存时间
我们再看生存时间:如果某一局比赛生存到最后,生存时间即为1。刚开场就被干掉,生存时间为0。这样计算出来生存时间之和。我把模拟的1000场比赛中的部分前二十名的生存时间画在下图中:
TapTap
前20名生存时间
​ 看,进入前20名的选手,生存时间大多在3~7之间,平均生存时间4.33,每局生存度在43.3%。就是说:只要在一局比赛中坚持到43%以上的生存时间,就有希望进入前20名,就有美金了。
TapTap
好了,就分析到这了,祝各位“菜鸡”好运!
7
1
3