对游戏中的敌人进行控制,一定绕不开的就是状态机,状态机配合控制状态机的代码,就可以完成敌方的AI设计。一般来说,敌人的AI进攻方式是由随机数决定的,在完成一次攻击后,回到待命状态,等待下一个随机数决定的攻击动作,所以这样的AI不够“聪明”,也比较僵硬,不过对于大多数的游戏来说,一些杂兵,一些体积较大的BOSS,运用这种模式还是可以达到要求的。为了调整难度,设计者就往往会设计更为强大的技能和攻击方式,更快的速度,更厚的血量来弥补BOSS的缺点。
所以,能不能设计出更好的AI呢?最近读完的两本书给了我灵感,一本是《神经网络》,另一本是《数据结构》。如果能够用神经网络的思想去改进状态机,或许我们就能打造一个简单好用的学习型AI。
图的结构和神经网络的结构中都有权,神经网络算法中不断改变最终输出结果的也是权,所以,如果我们将可以变化的权值加入到状态机中,就能够实现我们想要的结果。
在状态机中,我们通过布尔值判断一条路线的通断,并且通过随机数去改变布尔值,如果将随机数划分成不同区间,当随机数落入对应区间时改变相应的布尔值,区间大小和总区间大小都将会随着权值不断增加。
假设两个int变量a,b。现在触发B动作的概率为a/(a+b)。那么就以a,b作为区间长度。(下面是一段伪代码)
n = random(a+b);
switch(n)
{
case (0~a)
B();
break;
case (0~a)
B();
break;
}
a是变量,当B成功攻击到玩家时a++,相当于是一个正反馈,那么敌方就会随着训练次数的增多而更倾向于采取B攻击,但是当玩家已经能够熟练躲开B攻击时,一次偶然的A攻击将使玩家难以防备,这样B和C的权值将处于一种动态的平衡中,并随着n 的增大,a与b的比值将会收敛。
通过一个完整的加权状态机,我们可以得到一个能够学会连招的AI。并且它的连招会很实用,而不是浮华漂亮却毫无威力的招式。设计师将不必再设计完整的技能,而是会把一系列的攻击动作丢进状态机,连成网络,挂好代码,训练,或是利用上线的游戏获取玩家的数据去动态的训练,然后训练出一个AI高手。虽然在单机游戏中,BOSS是否不断成长对玩家而言并不重要。而且BOSS如果总是丢出难以防御的素质三连的话,玩家的游戏体验将会很差。但是在一些队友AI或是多人对战游戏的AI中,这种应用可能会有更广阔的天地。AI将不再受限于设计者的游戏认知,而且不会消耗大量的计算能力。在未来的独立游戏中或许会有发挥的空间。
今日的月亮已经不再是昨日的月亮,但我希望明日的你看向月亮的目光和今日一样
一定绕不开状态机?
@LouisLiu:虽然神经网络本身和状态机没有什么关系,但是状态机能够可视化的操作,对于程序苦手更友好一点。当然对于程序大神来说,直接去写一段神经网络的代码可能会更直接,更方便一点吧
a是变量,当B成功攻击到玩家时a++,相当于是一个正反馈。那没有攻击成功时要a--吗?
其实我觉得这个模型有点像 Multi-armed Bandit(多臂老虎机):每轮选取一个arm,并且只能看到选了这个arm的reward,即打中或未打中。这里的arm就相当于B和C的行为动作。
@art9:攻击失败a--的话可能会导致不必要的麻烦,比如这个技能减为零就不会触发,其他分支的增加会增大基数,也就是变相的减少B技能的概率。而且概率永远不为零。看了一下多臂老虎机问题,确实可以近似看作多臂老虎机。但是是在玩家的水平不会改变的静态基础上。玩家的水平是不断变化的,越来越强,一些低级的策略在多次学习后就很容易被躲掉,而且玩家的数量是庞大的,每个玩家还是在变化的,所以传统的多臂老虎机的较优算法就不再适用。
楼主对机器学习和游戏AI感兴趣的话,不妨去看下与增强学习有关的内容。
@sgnieb:粗略的看了一下,我和增强学习的思想还是挺像的。打算跨考计算机的研究生,将来肯定还是要学到的吧。(我本来只想安安静静的当个策划不知道什么时候被拐到程序上来的啊啊啊。。。)
今天看了下 https://zhuanlan.zhihu.com/p/34102878 好像全面战争第一代就已经在用基于神经网络的 AI 了