查看: 12869|回复: 12

[交流讨论] 关于自动战斗AI

[复制链接]

笑问情缘

梦石
0
星屑
68
在线时间
238 小时
注册时间
2006-5-3
回帖
544
发表于 2016-1-9 19:30:00 来自手机 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
引擎自带的自动战斗,缺点太大了,角色不会自动释放针对自己的技能,治疗技能也只会对位置1的同伴使用,除非死亡才会第2个,诸如此类,有没有优化的AI呢
梦石
0
星屑
497
在线时间
266 小时
注册时间
2015-12-8
回帖
729
发表于 2016-1-9 21:51:11 | 显示全部楼层
不要自動就好了 如果自動能這麼聰明 可以全部角色都自動了
回复

使用道具 举报

梦石
0
星屑
15346
在线时间
2995 小时
注册时间
2008-11-23
回帖
2551

开拓者贵宾

发表于 2016-1-9 22:10:43 | 显示全部楼层
自动战斗是个负面属性好吗
设成自动战斗代表这个角色是临时入队,非主要角色,无法操控
I'm the bone of my Second Grade.
回复

使用道具 举报

笑问情缘

梦石
0
星屑
68
在线时间
238 小时
注册时间
2006-5-3
回帖
544
 楼主| 发表于 2016-1-9 22:16:01 来自手机 | 显示全部楼层
但是我的游戏类似于刷装备游戏,战斗想要简单化,通常是全自动的,最多控制主角一个人
回复

使用道具 举报

梦石
0
星屑
80
在线时间
386 小时
注册时间
2007-7-27
回帖
4075

开拓者

发表于 2016-1-9 22:38:11 | 显示全部楼层
本帖最后由 trentswd 于 2016-1-9 22:41 编辑

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

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

吸吸
回复

使用道具 举报

梦石
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的战斗系统真的没得黑...啊咧,好像扯远了...
回复

使用道具 举报

梦石
0
星屑
223
在线时间
85 小时
注册时间
2015-12-22
回帖
48
发表于 2016-1-9 22:59:15 | 显示全部楼层
我是想问楼主自动刷装备怎么跳过最后的信息,切页的时候需要输入,比如某某升级得到物品什么的就会要切信息页
回复

使用道具 举报

笑问情缘

梦石
0
星屑
68
在线时间
238 小时
注册时间
2006-5-3
回帖
544
 楼主| 发表于 2016-1-10 11:12:06 来自手机 | 显示全部楼层
谢谢楼上大大热心解答,我的战斗不是挂机游戏,只是战斗不需要手动控制每个角色而已
回复

使用道具 举报

梦石
0
星屑
4230
在线时间
2671 小时
注册时间
2012-3-1
回帖
680
发表于 2016-1-10 18:55:27 | 显示全部楼层
我的自動戰鬥參考了某些戰鬥系統。也就是怒氣值滿了的話自動釋放必殺技,如果按照這個思路,AI也許會這麼做的吧?
回复

使用道具 举报

梦石
0
星屑
650
在线时间
0 小时
注册时间
2016-1-12
回帖
4
发表于 2016-1-12 11:29:41 | 显示全部楼层
不能完整的实现自动战斗AI,真可惜
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部