设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 6890|回复: 100
打印 上一主题 下一主题

[讨论] 敌人的AI

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13647
在线时间
3853 小时
注册时间
2013-7-18
帖子
2314
跳转到指定楼层
1
发表于 2018-6-24 19:55:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
敌人的AI,应该是老难题了,战斗时候,条件分歧只有判断物品,血量和开关的,最多就是敌人的状态,只有从判断敌人状态这里做文章了,让敌人判断自己中了什么状态,解除,问题就是敌人只要中了就会判断,就会解除,就像血量低于50%,他就一直会加血了,如何做出智能判断,该加血的时候加血,该解除状态就解除状态。。
山岚野人,快人快语,礼数不周,还望海涵....

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42404
在线时间
7602 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

2
发表于 2018-6-24 20:45:46 | 只看该作者
默认系统是没有这样的功能了,VA倒是有个老外的AI脚本,XP恐怕只能自己糊了。
具体可以在Game_Enemy的make_action方法里自己尝试定义……

评分

参与人数 1+1 收起 理由
y967 + 1 参与讨论

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

3
发表于 2018-6-24 22:48:59 | 只看该作者
本帖最后由 guoxiaomi 于 2018-6-24 22:56 编辑

AI这个用脚本做会发现无比的简单……感觉大多数人都把这个想复杂了,比如我的游戏AI脚本:
我这里是队友自动战斗,由于修改了战斗计算式,所以后面有几个多余的函数,但是设计思路可以照着这个来。

1. 考虑所有可以执行的行动
2. 加权计算dps
3. 取dps最大的行动执行

下面的score方法给出了计算dps的思路:
1. 目标已经阵亡,dps = -1
2. 普通攻击:dps = 攻击伤害的期望,伤害技能:dps = 技能的总伤害,治疗技能:dps = 实际的治疗量
3. 计算护甲、闪避、命中、属性修正
4. 治疗的情况下,考虑目标的生命值百分比、目标是否为自身、目标。伤害的情况下,考虑目标的剩余生命值进行加成。
...
7. dps浮动,避免每次都是一样的技能
8. 如果跟上一个队伍成员是相同目标,伤害技能dps加成,治疗技能dps减少

RUBY 代码复制
  1. class Scene_Battle
  2.   # 选项:0=随机攻击,1=仅恢复魔法,2=节省魔法,3=最大输出,
  3.   # 1:随机/固定目标,2:节省/不节省魔法,4:输出/治疗优先
  4.   #
  5.   def plan
  6.     {
  7.       'save_mana' => $game_setting['auto_battle_save_mana'] == 0,
  8.     }
  9.   end
  10.  
  11.   def set_auto_action(actor)
  12.     skills = actor.skills.select{|id| actor.skill_can_use?(id)}
  13.     skills.push 0
  14.     scores = {}
  15.     for index in 0..2 do
  16.       for skill_id in skills do
  17.         scores[[skill_id, index]] = score(actor, skill_id ,index)
  18.       end
  19.     end
  20.  
  21.     max_score = scores.values.sort{|v1, v2| v2.abs <=> v1.abs}[0]
  22.     skill_id, index = scores.index(max_score)
  23.     $last_auto_action = [index, max_score]
  24.  
  25.     if skill_id == 0
  26.       actor.current_action.kind = 0
  27.       actor.current_action.basic = 0
  28.       actor.current_action.target_index = index
  29.     else
  30.       actor.current_action.kind = 1
  31.       actor.current_action.skill_id = skill_id
  32.       actor.current_action.target_index = index
  33.     end
  34.   end
  35.  
  36.   def score(actor, skill_id, index)   
  37.     # 1. 获取目标
  38.     if skill_id == 0 || $data_skills[skill_id].scope <= 2
  39.       target = $game_troop.enemies[index]
  40.     else
  41.       target = $game_party.actors[index]
  42.     end
  43.     # 如果此目标不存在,返回 -1
  44.     return -1 if !target || !target.exist?
  45.     # 2. 计算基本伤害
  46.     if skill_id == 0
  47.       dps = actor.atk * (1 + actor.crt * 0.01 * (actor.crtd - 100) * 0.01)
  48.     else
  49.       skill = $data_skills[skill_id]
  50.       dps = get_skill_power(actor, skill)
  51.       if dps < 0
  52.         dps = [target.hp - target.maxhp, dps].max * 0.6
  53.       end
  54.     end
  55.     # 3. 计算护甲、闪避、命中
  56.     if skill_id == 0 || skill.atk_f > 0
  57.       dps = dps * def2rate(target.pdef)
  58.       eva_f = (skill_id == 0) ? 1 : skill.eva_f * 0.01
  59.       dps = dps * (1 - eva_f * target.eva * 0.01)
  60.       dps = dps * actor.hit * 0.01
  61.     else
  62.       x = 50 + (target.mdef - 50) * skill.mdef_f / 100
  63.       dps = dps * def2rate(x)
  64.       dps = dps * skill.hit * 0.01
  65.       dps = dps * target.elements_correct(skill.element_set) * 0.01
  66.     end   
  67.     # 4. 治疗/伤害 与目标生命值的关系
  68.     if dps < 0
  69.       if target.hp < target.maxhp * 0.5
  70.         dps = dps * target.maxhp / (target.hp + 1)
  71.       end
  72.       dps *= 1.5 if target == actor # 优先治疗自身
  73.     else
  74.       dps = dps * (1 + [(dps / (target.hp + 1)) ** 2, 1].min)
  75.     end
  76.     # 5. 节省魔法
  77.     if skill_id != 0 && plan['save_mana']
  78.       r = skill.sp_cost.to_f / [actor.sp, 10].max
  79.       dps = dps * [1 - r * 1.5, 0.5].max
  80.     end
  81.     # 6. spread
  82.     if skill_id != 0
  83.       enemy_size = $game_troop.enemies.select{|e| e.exist?}.size
  84.       dps = dps * (1 + actor.spread * enemy_size * 0.01)
  85.     end   
  86.     # 7. 分散度
  87.     dps = dps * (rand(0.3) + 0.85)
  88.     # 8. 上个角色的行动
  89.     if $last_auto_action
  90.       last_index, last_dps = $last_auto_action
  91.       if last_index == index
  92.         if last_dps < 0 && dps < 0
  93.           dps = dps * 0.7
  94.         elsif last_dps > 0 && dps > 0
  95.           dps = dps * 1.3
  96.         end
  97.       end
  98.     end
  99.     # 输出信息
  100.     # p [dps.abs, skill_id == 0 ? '攻击' : skill.name, target.name]
  101.     return dps
  102.   end
  103.  
  104.   def get_skill_power(user, skill)
  105.     if skill.power >= 0        
  106.       if skill.atk_f > 0
  107.         power = skill.power + user.atk * skill.atk_f / 100
  108.       else
  109.         power = skill.power + user.int * skill.eva_f / 100
  110.       end
  111.     else
  112.       if skill.atk_f > 0
  113.         power = skill.power - user.atk * skill.atk_f / 100
  114.       else
  115.         power = skill.power - user.int * skill.eva_f / 100
  116.       end
  117.     end
  118.     # 主属性
  119.     rate = 100.0
  120.     case user.main
  121.     when 0
  122.       rate += user.str * skill.str_f * 0.05
  123.     when 1
  124.       rate += user.dex * skill.dex_f * 0.05
  125.     when 2
  126.       rate += user.agi * skill.agi_f * 0.05
  127.     when 3
  128.       rate += user.int * skill.int_f * 0.05
  129.     end
  130.     # 计算基本伤害
  131.     power = (power * rate).round / 100
  132.     return power
  133.   end
  134.  
  135.   #------------------------------------------------------------------------
  136.   # ● 防御减伤公式
  137.   # x = 0, +25% | x = 20, 0% | x = 40, -20% |
  138.   #------------------------------------------------------------------------
  139.   def def2rate(x)
  140.     1.5 ** (1 - 0.02 * x)
  141.   end
  142. end

点评

无法直接用,只能按照这个思路来写,判断状态也行,比如部分状态增加dps部分减少dps……  发表于 2018-6-24 23:57
这个脚本直接就可以用的?感觉很神奇,不过好像没有判断状态,只有攻击和加血  发表于 2018-6-24 23:11

评分

参与人数 1+1 收起 理由
y967 + 1 参与讨论

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
4
发表于 2018-6-25 10:42:54 | 只看该作者
本帖最后由 灯笼菜刀王 于 2018-6-25 11:26 编辑

所谓AI就是各种分歧判断之后的结果嘛, AI有多高, 取决于你给的分歧有多细。加菲兄的积分制可以继续细分, 扩展性很强, 是个好方法, 咱无耻的收藏了

到了这年头,还用XP的人, 估计每个人的战斗系统都不会一样吧(至少也有改个伤害公式什么的呗), 尤其拥有改脚本技能的更不会去使用XP的默认战斗XD ,所以对于这个敌人AI, 人家改好的脚本基本都不能直接用~, 还是自己学学怎么改吧。

咱的坑是SRPG, 咱现在用的AI是极端化设置~ 满足条件就用这个技能,没有随机。所以咱的AI比较简单=。=

咱抛弃平砍, 同时把 装备作为技能使用, 装备是会损坏和丢失的(被偷=。=), 所以先把能用的装备和技能都塞到一个数组里作为行为的最开始判断。

咱的敌人不在数据库设置, 不过用脚本搞actions没数据库方便,所以,数据库的敌人就让咱作为actions模板存在了=。=


第一步  make_tactical_action 里, 根据模板, 生成行动 (就四个结果, 1用技能轰, 2给队友加血, 3逃跑, 4什么都不做)
先分歧, 身上没有可用技能和装备,就生成行动3,
接着队友里有血少于一半的, 持有补给技能,就生成行动2
然后 自己的移动范围+射程里没有敌人,且持有什么都不做,就生成行动4
其他情况行动1,
简单明了~

第二步, 给技能数组排列, 先按威力排列, 然后按射程排列,最后按scope排列

这样, 满足补给条件就会优先补给, 然后优先使用射程远的技能, 以及高威力技能。

第三步, 选择目标, 优先选择受伤的(集火模式,困难限定XD), 其次持有特效武器就选择针对的目标, 然后射程比自己短的, 最后选择目标里血最少的。

最后一步, 使用技能效果, 这里咱也做了个分歧, 因为这个时候目标已经有了,所以可以直接用目标的属性来判断用哪个技能(装备)是最效率的,
1,特效武器无条件使用
2,筛选出满足射程的,  
3,持有反克武器, 优先判断能否克制对方。
4,再选出克制对方武器的,没有就选择不克不被克的,都没有被克的也只好用了~
5,然后优先选高暴击的,其次高威力的,最后高命中的

点评

最简单的是优势地形和宝箱处放一个隐形的残血我方角色,通常方式带入ai公式计算权值即可;再高级的就得需要作全局的局势判断和决策……  发表于 2018-6-26 15:15
对于地形,只做到一个, 不让潜艇上岸变靶子.....  发表于 2018-6-26 14:47
-。-咱照搬火纹的敌人AI.. 不过没办法完全照搬,人家会判断地形优劣,并占有利地形,还会和你抢宝箱... 这些我无法做到~完全没头绪  发表于 2018-6-26 14:44
其实是标准的avg+srpg哦  发表于 2018-6-25 18:36
你的是arpg或act...  发表于 2018-6-25 18:21

评分

参与人数 1+1 收起 理由
defisym + 1 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33470
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

5
发表于 2018-6-25 14:58:58 | 只看该作者
本帖最后由 芯☆淡茹水 于 2018-6-25 15:06 编辑

敌人的AI,你不能太精确了,太精确了你打不过,除非级别碾压。
比如敌人全照着软柿子打,或者稍微少点血就加血,除非被秒,否则有受的。

敌人攻击,技能,回血,,,等,全部都可以计算成一个 倾向度 。
比如血越少,在有加血技能或物品情况下,加血的 倾向度 就越高,但也不是百分百会加血。
比如攻击对象的选择,血少防底的倾向度较高,大概打5次有3次选择的是软柿子,这个概率就差不多了。

还有行动类型的 倾向度。 血少时候使用技能加血的 倾向度 越高,没有加血手段有小几率的选择防御;
平时攻击的选择,角色越多,敌人使用 范围攻击技能 的倾向度越高,或者在血量少于一半的情况时(愤怒),选择高攻技能进行攻击的 倾向度 更高。
这个和加血的 倾向度 两相权重(愤怒得不管自己尽力打人和冷静的先加血保自己)。

敌人也有“犯二”的时候,做出来的AI需要更“拟人化”,而不是实打实的精确计算行动。

点评

别这么厉害啊,玩家会砸键盘的,适当来点漏洞  发表于 2018-6-25 18:12
软柿子捏,我上面的加权策略就有这个趋势,而且还会集火目标  发表于 2018-6-25 17:57
是比较高级的AI,但要是做出选择软柿子,这个AI就具备了智能AI的高度,可能比较复杂  发表于 2018-6-25 17:32
像芯大说的捡软柿子,这种已经是高级AI了,boss知道谁是比较好捏的,用什么判断,战斗力吗,还是血量,我感觉做到随机概率放控制类技能就已经  发表于 2018-6-25 17:31
人类还有高低智能,要做到的就是尽量的有“智能”  发表于 2018-6-25 17:27

评分

参与人数 1+1 收起 理由
y967 + 1 参与讨论

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
6
发表于 2018-6-25 16:58:56 | 只看该作者
字太多了,因为程序我是不行,只能从大概上试着说说。
作为没什么杂七杂八奖杯的传统单机游戏,可以考增加隐随着游戏变化的藏设置,
从传统回合制角度出发
自动记录一个变量,在本次读盘后的战斗中,玩家被杂鱼灭了N次,降低到游戏难度为easy,敌人攻击频率降低,选择防御和发呆的次数增多,再被灭N次monkey模式,敌人很少攻击
如果连续胜利,比如10场,明雷情况下同一个或者接近的敌群组,增加难度为hard,敌人会选择普通情况下不会选择的策略,比如先给自己加状态,如果速度慢于角色,会等角色攻击后再补血,
如果再连续胜利而且己方没有战斗不能,敌人会选择更厉害的方式进行攻击,比如增加平时不会使用的招式,多次行动(开挂)等等……
如果是半即时,存在吟唱或者冷却等情况,会更复杂,
即时战略,敌人ai高了只能自求多福。

点评

把统计当成就来做(本来就是一个……),扔进全局文件就不受影响了  发表于 2018-6-25 17:35
杂鱼一般是不会有AI这种东东的,杂鱼就是笨蛋才叫杂鱼,boss才会有AI这种高级东东,变得有挑战罢了  发表于 2018-6-25 17:24
基本上RPG的AI是给BOSS准备的, 杂鱼什么的都是通用模式了~ACT,SRPG,杂鱼数量一多也是会影响难度, 这个就要安排下AI了  发表于 2018-6-25 17:21
SL没影响, 那个XXX视频不是有提到, 玩家愿意这样做, 不要限制人家的玩法, 应该是要提高连续作战高难度状态下敌人的奖励,鼓励玩家打困难敌人  发表于 2018-6-25 17:19
而且敌人技能列表里高级技能的行动概率只能设置为1,然后队伍里概率调用  发表于 2018-6-25 17:19

评分

参与人数 1+1 收起 理由
y967 + 1 参与讨论

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3148
在线时间
830 小时
注册时间
2007-8-4
帖子
183
7
发表于 2018-6-25 18:03:33 | 只看该作者
本帖最后由 Distoy 于 2018-6-25 18:06 编辑

然而经过历史考验,在回合制设计上能够成为经典和范本的优秀作品,没有任何一个回去做所谓敌人AI。
不管是站在回合制RPG设计顶点的古典名作巫术系列,还是新生代的世界树迷宫。都是如此。
回合制RPG的本质是解密游戏,是对游戏系统的解构。

点评

单纯的回合制能做到的太少,如果想加入策略元素,建议抛弃回合制。  发表于 2018-6-25 20:42
以前的我想做出伟大的作品,想要不朽,经过无数次的打击,我终于明白,我只能做小虫子  发表于 2018-6-25 18:19

评分

参与人数 2+2 收起 理由
guoxiaomi + 1 我很赞同
y967 + 1 参与讨论

查看全部评分

..............................
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33470
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

8
发表于 2018-6-25 21:25:23 | 只看该作者
其实可以把要进行AI的战斗对象的所有可以行动的类型全部列出来,做一个 倾向度 的评价。

比如总分是 10 ,某个敌人列出来是    回血(9),  技能攻击A(7),  技能攻击B(5), 普通攻击A(3), 普通攻击B(2)
再给这个敌人一个 执行度, 同样满分 10 。 如果给他 5 分, 就会有 50% 的几率再 90% 的几率去执行 回血;这个不成立再依次往后。

这个 执行度 可以给 自动战斗 的角色 10 分(当然自动战斗角色最好做一个自动时使用的技能和物品等设置),
敌人的,可以随时调节变动,也相当于敌人难度调节了。
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
9
发表于 2018-6-27 10:50:48 | 只看该作者
本帖最后由 灯笼菜刀王 于 2018-6-27 11:23 编辑

芯大说的无止境补血或者全员集火软柿子,

其实咱更倾向于"战略限制"

比如 碰一下就回血的家伙, 如果它能被我方全员集火秒掉的话,那就没什么大问题, 只是会形成"开始先不去碰它, 全员憋大招秒" 这种攻略法

比如 专捏软柿子, 如果你的战斗系统是有站位设定的, 有前排队员存在, 近身攻击无法攻击后排队员, 并且拥有调整HP的装备之类的, 那就没影响还能衍生出" 控制防御高的角色血量吸引火力" 这种战法。

AI设置详细, 同时有能应付的方法, 那结果是让战斗更有策略性,并不是坏事。 不过不能全部都这样, 否则策略性会变成固定模式, 这个就是致命的。

AI设置越详细, 它的"套路" 就越明显,所以最好的方法还是根据芯大说的"倾向性", 搞出不同"行动模式"的敌人, 而且最好同类的敌人也有不同的行动模式, 会让战斗更有趣,而不仅限于几场BOSS战。

"行动模式"的意义, 在RPG里可能不太明显, 但是SLG或者ACT就是影响难度的基准。

像火纹, 虽然这个系列是以"有难度"著称, 但是新作一作比一作简单=。=, 主要就是敌人的行动模式太保守, 大部分都是守株待兔型, 不接近就不干活。BOSS还一水的靶子模式~~ 这分明就是让你各个击破以多欺少,难度直线下降~~

反观各种魔改版, 只是把敌人行动模式换成主动型, 难度就高了不只一个华莱士, 尤其是圣魔的魔改GIRLS版, 还有主动型BOSS, 和在敌人回合出现的增援(等于一出来就直接可以行动,原版增援都是在我方回合出现,我方回合结束才能行动,危险度完全不同), 紧张感一下提升了N倍~ 一片红丫丫的敌人全体压过来,那种魄力可不是原版能比的

至于ACT, 那行动模式更是直接影响这个敌人的强度, 咱印象最深的就是FC的坦克大战, 最低级的白皮坦克只会直线前进,碰到障碍随机转个头, 而跑得很快的六轮坦克, 会一直尝试往下面移动。这就让它显得很"聪明"和"麻烦", 体感上比龟壳坦克更难对付

点评

是啊,让敌人更加多变,更加难以捉摸,而不是一眼就能看到头,增加随机性,不确定性。  发表于 2018-6-27 17:12
咱现在能想到的杜绝背版的只有"风来之西林"这种迷宫系列, 地图,道具,敌人全部随机,能背的只有道具的用途和敌人的能力~  发表于 2018-6-27 14:08
背版问题大部分游戏都有,RPG也可以背XX位置有什么宝箱,XX位置会有BOSS战,XXBOSS会用什么技能  发表于 2018-6-27 14:06
一般ACT都有个背版的问题,固定位置刷固定敌人,可以而且有的必须提前预判消灭,比如忍者龙剑传系列。  发表于 2018-6-27 12:01
如果敌人ai来一个寻找最短路线并且根绝我方坦克行动来设置躲避路线,比如草丛掩护,就更难打了。  发表于 2018-6-27 11:59
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
10
发表于 2018-6-27 12:09:19 | 只看该作者
灯笼菜刀王 发表于 2018-6-27 10:50
芯大说的无止境补血或者全员集火软柿子,

其实咱更倾向于"战略限制"

RPG要难度就要让敌人以消灭我方全体为目的,进行行动优化,比如我说的那个,引入FTG基础操作的回合制,
敌人在屏幕左侧1P位置,我方在右侧2P位置
敌人攻击可以防住,但是分上中下三段,要根据敌人的类型和敌人出招的姿势预判,敌人可能出的招式然后进行防御,
敌人的攻击还可以用街霸的blog什么的,就是瞬间防御,命中的瞬间拉←,成功后可以没硬直的反击敌人
如果从这样的角度出发,增加难度就可以让敌人做假动作,敌人攻击时候延长后摇时间,等方式,干扰你的防御和瞬间防御,然后想再难,敌人会在攻击命中后叫同伴一起来打,争取在你失误的时候,在一个回合内对这个角色造成最大的伤害。

因此AI修改似乎要针对游戏进行的方式来优化,普通回合制,只要敌人行动够随机,目的是消灭我方角色,在装备不合适的情况下,就够难了。作为RPG应该让玩家有一个装备和技能使用正确了,可以较为轻松通过这段的一般敌人,这种感觉,体现出装备的重要性,体现出角色和技能搭配的重要性,否则就没必要做那么多装备了~

点评

增加随机性,不确定性。让boss“活起来”,至于难度,可以增加一个N回合外打败收益减半,N回合内打败收益加倍,这种来增加游戏的挑战性  发表于 2018-6-27 17:16
今天家里停电了半天..现在才能上..  发表于 2018-6-27 17:01
可能是……覆盖了ORZ  发表于 2018-6-27 16:57
我不是给你改成敌人的7成经验么..  发表于 2018-6-27 16:56
除非找到个好的算法,否则现在的很难用啊,我给你传个测试工程你看看……  发表于 2018-6-27 15:36
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 16:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表