| 赞 | 2 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2017-11-7 |
| 在线时间 | 388 小时 |
- 梦石
- 0
- 星屑
- 55
- 在线时间
- 388 小时
- 注册时间
- 2009-8-4
- 回帖
- 212
|
发表于 2016-1-9 22:54:29
|
显示全部楼层
本帖最后由 andrewx 于 2016-1-9 22:56 编辑
据我所知并没有这样的通用增强AI,因为这个东西跟每个游戏设计密切挂钩,插件作者根本不知道你的游戏里设计的技能的公式、效果都是什么样的,以及这些技能在游戏里的比重有多少,自然没有办法写出相应的求最优行动的算法。其次这样的AI真的不好做,一个buff究竟能带来多少效用,这个buff在战斗开始和战斗结束哪个时间点上效用最高,甚至敌人与玩家可能的行为也应该是影响AI的因素。也就是说你首先要提供能够覆盖你游戏里战斗行动的reward function, transition function等,这才有可能做出一个合适的AI。如果一个插件作者连这些都没有就能做出一个好的AI...那这个AI已经是机器学习的程度了。即便是Yanfly的敌人AI插件,这些判定也是要你自己手工写的。
正因为不现实,系统默认的战斗AI也仅仅是计算HP伤害/回复比率来判定一个行动的效用(所以默认自动行动不会碰那些不影响HP的技能)。如果你想修改,去看下面两个方法:
[pre lang="javascript" line="1"]Game_Action.prototype.evaluate = function() {
var value = 0;
this.itemTargetCandidates().forEach(function(target) {
var targetValue = this.evaluateWithTarget(target);
if (this.isForAll()) {
value += targetValue;
} else if (targetValue > value) {
value = targetValue;
this._targetIndex = target.index;
}
}, this);
value *= this.numRepeats();
if (value > 0) {
value += Math.random();
}
return value;
};
Game_Action.prototype.evaluateWithTarget = function(target) {
if (this.isHpEffect()) {
var value = this.makeDamageValue(target, false);
if (this.isForOpponent()) {
return value / Math.max(target.hp, 1);
} else {
var recovery = Math.min(-value, target.mhp - target.hp);
return recovery / target.mhp;
}
}
};[/pre]
这就是自动战斗的utility function了,你可以在evaluateWithTarget里面添加一些判定,赋予一些行动权重来调节自动战斗AI,比如当target濒死时,会返回双倍的value,比如如果回合数很小的时候,buff类技能也能返回一定的value等等
正如楼上上上说的,自动战斗并不是好的战斗解决方法,所以我也懒得实践,以上仅是理论思考。
话说回来FF13的队友AI实在做得很棒,执行的行动一般都是很合理的。所以说FF13的战斗系统真的没得黑...啊咧,好像扯远了... |
|