Project1

标题: 关于自动战斗AI [打印本页]

作者: Denis    时间: 2016-1-9 19:30
标题: 关于自动战斗AI
引擎自带的自动战斗,缺点太大了,角色不会自动释放针对自己的技能,治疗技能也只会对位置1的同伴使用,除非死亡才会第2个,诸如此类,有没有优化的AI呢
作者: 小叮鈴    时间: 2016-1-9 21:51
不要自動就好了 如果自動能這麼聰明 可以全部角色都自動了
作者: 死伤殆尽    时间: 2016-1-9 22:10
自动战斗是个负面属性好吗
设成自动战斗代表这个角色是临时入队,非主要角色,无法操控
作者: Denis    时间: 2016-1-9 22:16
但是我的游戏类似于刷装备游戏,战斗想要简单化,通常是全自动的,最多控制主角一个人
作者: trentswd    时间: 2016-1-9 22:38
本帖最后由 trentswd 于 2016-1-9 22:41 编辑

这种游戏印象比较深的是ff12和dao
以前xp时代见过一个仿ff12的系统
搜一下居然真的有
http://www.gdunlimited.net/scrip ... -fantasy-xii-engine
扯远了

写AI树纯粹是体力活,首先要给技能分类,然后要加一堆分支
关键是别人的游戏和你的游戏不一样,换了一套技能之后AI树也要改,感觉不太靠谱
不如等人写一个gambit系统吧(


作者: andrewx    时间: 2016-1-9 22:54
本帖最后由 andrewx 于 2016-1-9 22:56 编辑

据我所知并没有这样的通用增强AI,因为这个东西跟每个游戏设计密切挂钩,插件作者根本不知道你的游戏里设计的技能的公式、效果都是什么样的,以及这些技能在游戏里的比重有多少,自然没有办法写出相应的求最优行动的算法。其次这样的AI真的不好做,一个buff究竟能带来多少效用,这个buff在战斗开始和战斗结束哪个时间点上效用最高,甚至敌人与玩家可能的行为也应该是影响AI的因素。也就是说你首先要提供能够覆盖你游戏里战斗行动的reward function, transition function等,这才有可能做出一个合适的AI。如果一个插件作者连这些都没有就能做出一个好的AI...那这个AI已经是机器学习的程度了。即便是Yanfly的敌人AI插件,这些判定也是要你自己手工写的。

正因为不现实,系统默认的战斗AI也仅仅是计算HP伤害/回复比率来判定一个行动的效用(所以默认自动行动不会碰那些不影响HP的技能)。如果你想修改,去看下面两个方法:
JAVASCRIPT 代码复制
  1. Game_Action.prototype.evaluate = function() {
  2.     var value = 0;
  3.     this.itemTargetCandidates().forEach(function(target) {
  4.         var targetValue = this.evaluateWithTarget(target);
  5.         if (this.isForAll()) {
  6.             value += targetValue;
  7.         } else if (targetValue > value) {
  8.             value = targetValue;
  9.             this._targetIndex = target.index;
  10.         }
  11.     }, this);
  12.     value *= this.numRepeats();
  13.     if (value > 0) {
  14.         value += Math.random();
  15.     }
  16.     return value;
  17. };
  18.  
  19. Game_Action.prototype.evaluateWithTarget = function(target) {
  20.     if (this.isHpEffect()) {
  21.         var value = this.makeDamageValue(target, false);
  22.         if (this.isForOpponent()) {
  23.             return value / Math.max(target.hp, 1);
  24.         } else {
  25.             var recovery = Math.min(-value, target.mhp - target.hp);
  26.             return recovery / target.mhp;
  27.         }
  28.     }
  29. };

这就是自动战斗的utility function了,你可以在evaluateWithTarget里面添加一些判定,赋予一些行动权重来调节自动战斗AI,比如当target濒死时,会返回双倍的value,比如如果回合数很小的时候,buff类技能也能返回一定的value等等

正如楼上上上说的,自动战斗并不是好的战斗解决方法,所以我也懒得实践,以上仅是理论思考。
话说回来FF13的队友AI实在做得很棒,执行的行动一般都是很合理的。所以说FF13的战斗系统真的没得黑...啊咧,好像扯远了...
作者: 梧桐晔语    时间: 2016-1-9 22:59
我是想问楼主自动刷装备怎么跳过最后的信息,切页的时候需要输入,比如某某升级得到物品什么的就会要切信息页
作者: Denis    时间: 2016-1-10 11:12
谢谢楼上大大热心解答,我的战斗不是挂机游戏,只是战斗不需要手动控制每个角色而已
作者: 卡奥尼特    时间: 2016-1-10 18:55
我的自動戰鬥參考了某些戰鬥系統。也就是怒氣值滿了的話自動釋放必殺技,如果按照這個思路,AI也許會這麼做的吧?
作者: Pepsi    时间: 2016-1-12 11:29
不能完整的实现自动战斗AI,真可惜
作者: 梦幻学习机器    时间: 2016-1-13 10:24
卡奥尼特 发表于 2016-1-10 18:55
我的自動戰鬥參考了某些戰鬥系統。也就是怒氣值滿了的話自動釋放必殺技,如果按照這個思路,AI也許會這麼 ...

mv自动战斗,本身默认就是tp满直接放tp技能的
作者: tseyik    时间: 2016-1-13 10:33
本帖最后由 tseyik 于 2018-12-14 18:21 编辑

关于自动战斗AI 問題
一個好的自动战斗AI 必須考慮到有些什麼技能
基本要參考整個戦鬥系統
不度身訂造的話
就只能做一些濫大街的AI或只能為己流行的戦鬥系統做
所以好的AI必須自己做
作者: zaiy2863    时间: 2016-1-13 14:28
楼上某些思路歪了啊,我来提供一个思路就是让玩家自己编写AI。

举个例子,给角色提供若干空格,然后让玩家把技能填进这些空格里(可以填防御,攻击,什么也不做以及需要释放的技能等,可以重复) 然后战斗开始后,角色就能按照填写在格子的顺序,循环释放这些技能。

这是不是很有趣呢?不但不用自己设计ai,而且也给了玩家一定的可控性,玩家会更倾向于思考如何配置技能,游戏性也加强了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1