近两个月来,一款 Dota2 中的内置小游戏 —— 自走棋(AutoChess)以风卷残云之势收割了各大直播平台以及游戏选手,并以 “下棋一时爽,一直下棋一直爽” 的名言俘获了无数粉丝的芳心,一度使完美的土豆服务器面临崩溃。鉴于玩家普遍痛恨 “代码哥” 的行为,笔者作为一个 CS相关专业的学生,想从源码的角度解析游戏中的某些看似不科学的巧合。
本文所参考的自走棋源码为Steam平台下 Dota2 文件中的自定义地图(版本为20190303)。
以下问题来自于不少志同道合的棋友,于精神混乱之际提出的疑问
实际上棋子的"智商"取决于棋子的 AI,在源码中我们可以看到,棋子在满蓝后技能的施法目标有15种(如下图所示)。而其中doom和火女的目标是10,也就是敌方等级最高的敌人(在最新的0314版本中火女目标被改成了1,惨遭削弱),这一设定让他们几乎稳定把技能丢在对方"大哥"身上,达到效益最大化。当然,为了不让doom太过强大,在寻找最高等级敌人的代码中,特别增加了一段,有百分之三十的几率会随机选择敌人,所以两个doom的容错率更大哟~
当然,由于doom大招的沉默给谁十分重要,这里还有一点必须指出,就是当两个棋子的等级相同时,doom的大招会给先上场的那个棋子。因为在寻找最高等级的棋子时会遍历代码中一个名为to_be_destroy的数组,而先从等待区上场的棋子会被先加入数组,一旦找到后后面的棋子等级不比它高就不会进行替换了。因此,可以将最不想被沉默的怪后上场,有最大的几率避开doom大招。
除此之外,据观察,最容易打假赛的几个(光法/风行/谜团)棋子,目标都是3,也就是点目标。点目标的实现是随机找一个场上的敌人,不会去找人多的地方释放,自然容易打假赛了。还有几个比较聪明的是骑士中的全能和死骑,他们的技能会给血量百分比最低的队友(9)。
是真的,下面这段代码是抽卡函数的一部分,在每次抽卡前,如果玩家人口大于等于7,就会在1到10000中roll两次数字,若两次数字都小于等于1,则可以获得一张ssr棋子。而ssr棋子就是死灵法师腐化和混沌骑士浴火了。学过概率论的朋友应该很容易明白,这两次roll的概率即10000*10000也就是一亿,一亿分之一的概率抽到了的话,这边建议直接去买彩票呢亲~
在源码中分配对手的机制是这样的:每次匹配前,在1到最大玩家数-1之间随机挑一个数n,然后循环n次,每一次都为玩家匹配当前对手的下一个还存活的对手。举个例子,场上还剩下4个玩家,分别为(1,2,3,4),那么循环一次,他们的对手分别为(2,3,4,1),两次则是(3,4,1,2),以此类推。
为了保证玩家不两次碰到一个对手,每次随机的数n都会与上一次随机出的数不同。但当场上有玩家死亡时,这个就不一定成立了。比如还是4个玩家,这一轮n为2,那么他们的对手分别为(3,4,1,2)。但这回合玩家3死了,那么下回合玩家(1,2,4)随机一轮的结果是(2,4,1),这时候玩家2就两轮碰到了同一个对手4。当然,从理论上说,有可能会出现这个情况的只有处于上一轮碰到死亡玩家的人到死亡玩家之间的位置的几个人(这个玩家列表从游戏一开始就固定了)。
对于没学过编程的小可爱来说理解起来有点困难,但简单来说,就是只要没有人死亡,那么这种情况就不会出现啦~
在早期的代码版本中棋子池大小是可以看见的,后来由于源码被扒,源码中只有基础数量{9,6,5,3,2},之前的倍率是5,也就是从1到5费的棋子分别有{45,30,25,15,10}个。但是现在棋子数量变多,不知道倍率是否有所提升,但一定还是基础数量的倍数。
下面是抽棋子的概率和装备掉落概率。棋子概率界面上有显示就不分析了,装备掉落概率倒是值得一看。[r] = { [x]=n } 指的是在第r回合,有(100-x)%的几率掉落等级为n的装备,当{}里有多个等式时,几率是不叠加的哦。
至于为什么抽不到想要的卡,同样脸黑的笔者仔仔细细看完了每一行跟抽卡有关的代码,只能悲伤的说,真的是看脸的TAT
1.除了doom、变羊、沉默、石化这些显而易见放不出技能的控制,斧王的嘲讽其实也是禁用技能的,也就是说跳刀斧王跳后排吼人是相当于沉默的。
2.棋子的动作优先级是释放技能>攻击>移动,这在游戏中也有据可依,比如毒龙会先放毒再跳跃等。需要注意的是,有些手长的刺客比如女王毒龙放在第二排如果能攻击到人,是不会跳到后面去切后排的,前置位TA同理。
特别说明:以上分析仅仅是广大玩家的一些好奇心,不用于商业途径,也请看到的玩家不要越界哟~
参考
Steam平台下源码阅读方法: https://www.bilibili.com/video/av43728820/