Project1

标题: 【求高人指路】回合制战斗AI,怎么为敌人增加预判 [打印本页]

作者: 电子最终龙    时间: 2012-10-21 14:34
标题: 【求高人指路】回合制战斗AI,怎么为敌人增加预判
正在改进RM默认的AI,从随机选择行动和目标改为以得分计算行动。

算法描述:
    敌人可以进行的行动有:攻击、特技、法术、防御和待机。待机不会产生任何效果,其他行动的消耗与己方角色相同。敌人会在轮到当前敌方角色行动时进行AI运算,决定具体行动。行动将以行动绩点(AP)计算,当前行动角色遍历搜索可以执行的所有动作Avalible_Action,计算行动得分,并获得得分表Action_Points[action_index]。遍历得分表获得最高得分的行动index,搜索行动表获得行动并返回。以下为AP优先级:
    最高优先级:可能使玩家方角色战斗不能(HP归零或体力归零)时,以最优化进攻方案打击目标,AP得分修正10000
      高优先级:友方HP低下,且自己可以治疗时,以最优化治疗方案治疗,AP系数5
      普通优先级:自己可以治疗时,以最优化治疗方案治疗,AP系数4
      普通优先级:可以施放或解除增益、减益效果(含法术、特技、攻击效果),且存在合适目标(即未有该效果)时,对目标施放效果,AP得分修正1000
      普通优先级:可以攻击(含施放法术和特技)时,以最优化攻击方案进攻。
    次优先级:无法造成有效伤害或有效治疗时,进行防御,AP得分修正100
      最低优先级:无法行动时待机,AP得分修正0。

AP得分计算公式:
|有效伤害或治疗值| * AP系数 + AP得分修正 – sp消耗 * 100

伪代码算法:
  1. #===========================================
  2. # AI演算的方法
  3. #===========================================
  4. Enemy_AI(Enemy enemy)
  5.     actions[] = new[] Action
  6.     action_points[][] = new[][] int
  7.     # 读取有效行动表
  8.     for action in Enemy.avalible_Action
  9.         actions[] += action
  10.     end
  11.     # 计算行动得分
  12.     for action in actions
  13.         action_point = |action.damage| * action.ap_parameter + action.ap_addition – action.sp_cost * 100
  14.         action_points[action.index] = action_point
  15.     end
  16.     # 获得得分最高的行动
  17.     temp_score
  18.     temp_index = 0
  19.     while temp_index < count(actions[])
  20.             if points[temp_index][i] > temp_score
  21.             then temp_score = point
  22.                  final_action = temp_index
  23.             end
  24.             temp_index += 1
  25.     end
  26.     # 返回最终决定的行动
  27.    return actions[final_action]
  28. end
复制代码
优化什么的等代码写出来再说……
这个算法基本可以杜绝AI的弱智行为,比如玩家角色红血时自己刷BUFF,比如盯着进行防御的战士集火任由后面的法师乱BIU。
缺点是简单的行动积分制无法完成行动预判,例如,当对方(玩家)角色准备施放法术,这个法术一次把AI角色全A死。
而AI角色只会全力治疗或者集火这个法师,而不会考虑使用伤害较低但是有打断效果的攻击。
如果单纯提高打断效果的AP加成,又会导致AI无脑打断直到放不出技能……

求一个更好的预判算法改进,如果能预测两三回合就更完美了orz
作者: 虾米£浪子    时间: 2012-11-8 10:18
# 计算行动得分 路人表示啥意思不明。
理论:求得敌人可以攻击的范围内所有角色,应该是移动后可攻击也包括在内,读取角色各种信息,然后进行判断是否选择攻击。

作者: 电子最终龙    时间: 2012-11-8 11:34
虾米£浪子 发表于 2012-11-8 12:18
# 计算行动得分 路人表示啥意思不明。
理论:求得敌人可以攻击的范围内所有角色,应该是移动后可攻击也包括 ...

行動得分就是判定行動優先級,打個比方

你在一個時間內可以同時攻擊一個戰士和一個法師
戰士防高,法師皮脆,顯然攻擊法師製造的有效傷害更高
那麼行動得分應該引導AI優先攻擊法師

但是,如果戰士剩下一絲血,法師滿血
雖然攻擊戰士的有效輸出低,但是實際收益比攻擊法師高
那麼對殘血敵人補刀的優先級就應該比集火脆皮高
作者: devilg    时间: 2012-11-9 23:22
复杂判定代码如果不能用general语句套的话就要设定每个情况了吧。虽然不知道具体行动分怎么算的……你写好了就发出来呗:S
想想真复杂。就按你说的那个情况改进的话,在判定角色威胁度的时候大规模法术要提高,而且要在“此时”打断法术的优先度要提高。是嘛?
如果这样,威胁度就不能只用int排(如果你是这样做的),要array+额外判定。
ex:角色2在释放大杀器。获取威胁度后,角色1是[100,[]]角色2是[999,[“打断”]](由于大杀器效果判定提高,这个额外string可以技能return)此时排威胁度顺序还是用array[0]排,而在判定什么action好的时候,就可以if action.打断? && array[1].include?("打断") actionPoint = 99999提高打断技能的排序。当然你想要ai有超级团队配合(一个打断就不管第二个)那更复杂了,还要加团队额外处理。
ps.把boss的技能换成大范围超高杀伤和单体近似秒杀完全解决了所有问题。。。
作者: 柳之一    时间: 2012-11-17 13:10
用西洋棋ai算法就可以了
作者: 电子最终龙    时间: 2012-11-17 15:01
柳之一 发表于 2012-11-17 15:10
用西洋棋ai算法就可以了

將玩家後續行動列入計算再評分選取么?
問題RPG戰鬥有隨機數,最基本的命中暴擊和傷害浮動率都會影響實際結果,AI思考計算最多只能根據這些變數追加價值參數,預判未必準確。
嘛,也是一個辦法,先試試
作者: 柳之一    时间: 2012-11-17 17:15
电子最终龙 发表于 2012-11-17 15:01
將玩家後續行動列入計算再評分選取么?
問題RPG戰鬥有隨機數,最基本的命中暴擊和傷害浮動率都會影響實際 ...

就算是有變數也要考慮啊

有%15幾率 暴擊 和有12%記錄用哪個技能 實際上是一樣的,所以預判一定準確,只不過可能性多了而已.
你的系統比起西洋棋還是簡單得多的




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