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

Project1

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

敌人在战斗中的另种算法

 关闭 [复制链接]

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
跳转到指定楼层
1
发表于 2008-11-8 19:49:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
这个系统让敌人在游戏中使用一种新的智慧算法,让攻击目标的选择更加人性化。

敌人专挑以下三种目标发动攻击:
1.重攻轻守的。
2.快死的。
3.不能回避攻击的。

当然,敌人也会优先选择己方比较厉害的角色优先进行治疗与回复。

这样,电脑就和玩家一样,好像有一个活生生的“人”在幕后控制敌人的行动。


  1. #==============================================================================
  2. # ■ Game_BattleAction
  3. #------------------------------------------------------------------------------
  4. #  处理行动 (战斗中的行动) 的类。这个类在 Game_Battler 类
  5. # 的内部使用。
  6. #==============================================================================

  7. class Game_BattleAction
  8.   #--------------------------------------------------------------------------
  9.   # ● 既定目标 (敌人用)
  10.   #--------------------------------------------------------------------------
  11.   def decide_certain_target_for_enemy
  12.     # 效果范围的分支
  13.     if for_one_friend_hp0?
  14.       battler = $game_troop.certain_target_enemy_hp0
  15.     elsif for_one_friend?
  16.       battler = $game_troop.certain_target_enemy
  17.     else
  18.       battler = $game_party.certain_target_actor
  19.     end
  20.     # 对像存在的话取得索引、
  21.     # 对像不存在的场合下清除行动
  22.     if battler != nil
  23.       @target_index = battler.index
  24.     else
  25.       clear
  26.     end
  27.   end
  28. end

  29. #==============================================================================
  30. # ■ Game_Party
  31. #------------------------------------------------------------------------------
  32. #  处理同伴的类。包含金钱以及物品的信息。本类的实例
  33. # 请参考 $game_party。
  34. #==============================================================================

  35. class Game_Party
  36.   #--------------------------------------------------------------------------
  37.   # ● 对像角色的确定
  38.   #     hp0 : 限制为 HP 0 的角色
  39.   #--------------------------------------------------------------------------
  40.   def certain_target_actor(hp0 = false)
  41.     # 初始化权重值
  42.     power = 1.0
  43.     last_power = 1.0
  44.     # 初始化轮流
  45.     roulette = nil
  46.     # 循环
  47.     for actor in @actors
  48.       # 符合条件的场合
  49.       if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
  50.         power = 1.0
  51.         if actor.guarding?
  52.           power2 = 0.5
  53.         elsif actor.cant_evade?
  54.           power2 = 2.0
  55.         else
  56.           power2 = 1.0
  57.         end
  58.         # 检查其它状态:若防御修正值偏低,则权重加大,否则减小
  59.         for iii in 1...$data_states.size
  60.           if actor.state?(iii)
  61.             power2 *= 100.0 / $data_states[iii].pdef_rate
  62.             power2 *= 100.0 / $data_states[iii].mdef_rate
  63.             power2 *= 100.0 / $data_states[iii].eva
  64.           end
  65.         end
  66.         power = 1.0 * actor.hp * (actor.pdef + actor.mdef) * actor.agi / (actor.int * actor.atk * actor.str * power2)
  67.         if roulette == nil
  68.           roulette = actor
  69.           last_power = power
  70.         else
  71.           # 权重值的修正:如果下一位战斗员的权重值较小,则换人
  72.           if power < last_power
  73.             roulette = actor
  74.             last_power = power
  75.           end         
  76.         end
  77.       end
  78.     end
  79.     # 决定角色
  80.     return roulette
  81.   end
  82. end

  83. #==============================================================================
  84. # ■ Game_Troop
  85. #------------------------------------------------------------------------------
  86. #  处理队伍的类。本类的实例请参考 $game_troop
  87. #
  88. #==============================================================================

  89. class Game_Troop
  90.   #--------------------------------------------------------------------------
  91.   # ● 对像敌人的确定
  92.   #     hp0 : 限制 HP 0 的敌人
  93.   #--------------------------------------------------------------------------
  94.   def certain_target_enemy(hp0 = false)
  95.     # 初始化权重值
  96.     power = 1.0
  97.     last_power = 1.0
  98.     # 初始化轮流
  99.     roulette = nil
  100.     # 循环
  101.     for enemy in @enemies
  102.       # 符合条件的场合
  103.       if (not hp0 and enemy.exist?) or (hp0 and enemy.hp0?)
  104.         power = 1.0
  105.         if enemy.guarding?
  106.           power2 = 0.5
  107.         elsif enemy.cant_evade?
  108.           power2 = 2.0
  109.         else
  110.           power2 = 1.0
  111.         end
  112.         power = 1.0 * enemy.hp * (enemy.pdef + enemy.mdef) * enemy.agi / (enemy.int * enemy.atk * enemy.str * power2)
  113.         if roulette == nil
  114.           roulette = enemy
  115.           last_power = power
  116.         else
  117.           # 权重值的修正:如果下一位战斗员的权重值较小,则换人
  118.           if power < last_power
  119.             roulette = enemy
  120.             last_power = power
  121.           end
  122.         end
  123.       end
  124.     end
  125.     # 决定敌人
  126.     return roulette
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 对像敌人的确定 (HP 0)
  130.   #--------------------------------------------------------------------------
  131.   def certain_target_enemy_hp0
  132.     return certain_target_enemy(true)
  133.   end
  134. end

  135. #==============================================================================
  136. # ■ Game_Enemy
  137. #------------------------------------------------------------------------------
  138. #  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
  139. # 内部使用。
  140. #==============================================================================

  141. class Game_Enemy < Game_Battler
  142.   #--------------------------------------------------------------------------
  143.   # ● 生成行动
  144.   #--------------------------------------------------------------------------
  145.   def make_action
  146.     # 清除当前行动
  147.     self.current_action.clear
  148.     # 无法行动的情况
  149.     unless self.movable?
  150.       # 过程结束
  151.       return
  152.     end
  153.     # 抽取现在有效的行动
  154.     available_actions = []
  155.     rating_max = 0
  156.     for action in self.actions
  157.       # 确认回合条件
  158.       n = $game_temp.battle_turn
  159.       a = action.condition_turn_a
  160.       b = action.condition_turn_b
  161.       if (b == 0 and n != a) or
  162.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  163.         next
  164.       end
  165.       # 确认 HP 条件
  166.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  167.         next
  168.       end
  169.       # 确认等级条件
  170.       if $game_party.max_level < action.condition_level
  171.         next
  172.       end
  173.       # 确认开关条件
  174.       switch_id = action.condition_switch_id
  175.       if switch_id > 0 and $game_switches[switch_id] == false
  176.         next
  177.       end
  178.       # 符合条件 : 添加本行动
  179.       available_actions.push(action)
  180.       if action.rating > rating_max
  181.         rating_max = action.rating
  182.       end
  183.     end
  184.     # 最大概率值作为 3 合计计算(0 除外)
  185.     ratings_total = 0
  186.     for action in available_actions
  187.       if action.rating > rating_max - 3
  188.         ratings_total += action.rating - (rating_max - 3)
  189.       end
  190.     end
  191.     # 概率合计不为 0 的情况下
  192.     if ratings_total > 0
  193.       # 生成随机数
  194.       value = rand(ratings_total)
  195.       # 设置对应生成随机数的当前行动
  196.       for action in available_actions
  197.         if action.rating > rating_max - 3
  198.           if value < action.rating - (rating_max - 3)
  199.             self.current_action.kind = action.kind
  200.             self.current_action.basic = action.basic
  201.             self.current_action.skill_id = action.skill_id
  202. # 修改:敌人不再盲目乱打,而是死盯一个确定目标=================================
  203.             self.current_action.decide_certain_target_for_enemy            
  204. # =============================================================================
  205.             return
  206.           else
  207.             value -= action.rating - (rating_max - 3)
  208.           end
  209.         end
  210.       end
  211.     end
  212.   end
  213. end
复制代码


范例工程:
http://rpg.blue/upload_program/d ... ��法_106573658.rar
我的个人空间:
http://434986751.qzone.qq.com
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
2
发表于 2008-11-8 19:57:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
3
 楼主| 发表于 2008-11-8 20:13:47 | 只看该作者
以下引用一路一风尘于2008-11-8 11:57:45的发言:

感觉利用权值做AI,例如血量多少,杀伤力多少,回复力多少,是否可造成异常伤害,再根据人的心理习惯,优先攻击恢复系与异常系的特征展1~2层树,或许效果会更好。


对了,我这个算法的基本原理是这样:

第一权重值的计算方法:

对象HP * (对象PDEF + 对象MDEF) * 对象AGI / (对象INT * 对象ATK * 对象STR * 第二权重值)

第二权重值的计算方法:

如果对象不能回避攻击,这个值取2;
如果对象正在防御,这个值取0.5;
对象的状态也会影响权重值:
防御降低——第二权重加大
防御升高——第二权重减小
其它情况下均取1。

第一权重值越小,被攻击的概率越高。

而第二权重的加大会导致第一权重的减小。

心理习惯。。。这个建议不错{/jy}
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
4
发表于 2008-11-9 03:05:47 | 只看该作者
敌人不再盲目乱打,而是死盯一个确定目标
self.current_action.decide_certain_target_for_enemy
这一段這似乎太殘人了~~


万一敌人一多豈不是会被围殴了!


整合到RTAB版 我试了一下 死的更惨.....
敌人都好啊~~

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
5
 楼主| 发表于 2008-11-9 06:20:22 | 只看该作者
以下引用TERENCE于2008-11-8 19:05:47的发言:

敌人不再盲目乱打,而是死盯一个确定目标
self.current_action.decide_certain_target_for_enemy
这一段這似乎太殘人了~~

万一敌人一多豈不是会被围殴了!

整合到RTAB版 我试了一下 死的更惨.....
敌人都好兇啊~~


呵呵,这才像跟人一样玩嘛,我们在玩RPG的时候不都会选择逐个击破的策略么。
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
6
发表于 2008-11-9 06:23:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
7
发表于 2008-11-9 06:23:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
8
 楼主| 发表于 2008-11-9 07:36:01 | 只看该作者
以下引用一路一风尘于2008-11-8 22:23:45的发言:
其实这样有套路可寻,反而变傻,增加点变数或许更为合适。


再试试这个新工程,50号变量操纵敌人的智能等级
http://rpg.blue/upload_program/d ... �法1_106616148.rar
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
9
发表于 2008-11-9 07:38:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
10
 楼主| 发表于 2008-11-9 07:42:33 | 只看该作者
以下引用一路一风尘于2008-11-8 23:38:09的发言:

工程下来我也无法打开,还是贴代码吧,我还阅读的了。


  1. #==============================================================================
  2. # ■ Game_BattleAction
  3. #------------------------------------------------------------------------------
  4. #  处理行动 (战斗中的行动) 的类。这个类在 Game_Battler 类
  5. # 的内部使用。
  6. #==============================================================================

  7. class Game_BattleAction
  8.   #--------------------------------------------------------------------------
  9.   # ● 既定目标 (敌人用)
  10.   #--------------------------------------------------------------------------
  11.   def decide_certain_target_for_enemy
  12.     # 效果范围的分支
  13.     if for_one_friend_hp0?
  14.       battler = $game_troop.certain_target_enemy_hp0
  15.     elsif for_one_friend?
  16.       battler = $game_troop.certain_target_enemy
  17.     else
  18.       battler = $game_party.certain_target_actor
  19.     end
  20.     # 对像存在的话取得索引、
  21.     # 对像不存在的场合下清除行动
  22.     if battler != nil
  23.       @target_index = battler.index
  24.     else
  25.       clear
  26.     end
  27.   end
  28. end

  29. #==============================================================================
  30. # ■ Game_Party
  31. #------------------------------------------------------------------------------
  32. #  处理同伴的类。包含金钱以及物品的信息。本类的实例
  33. # 请参考 $game_party。
  34. #==============================================================================

  35. class Game_Party
  36.   #--------------------------------------------------------------------------
  37.   # ● 对像角色的确定
  38.   #     hp0 : 限制为 HP 0 的角色
  39.   #--------------------------------------------------------------------------
  40.   def certain_target_actor(hp0 = false)
  41.     # 初始化权重值
  42.     power = 1.0
  43.     last_power = 1.0
  44.     # 初始化轮流
  45.     roulette = nil
  46.     # 循环
  47.     for actor in @actors
  48.       # 符合条件的场合
  49.       if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
  50.         power = 1.0
  51.         if actor.guarding?
  52.           power2 = 0.5
  53.         elsif actor.cant_evade?
  54.           power2 = 2.0
  55.         else
  56.           power2 = 1.0
  57.         end
  58.         # 检查其它状态:若防御修正值偏低,则权重加大,否则减小
  59.         for iii in 1...$data_states.size
  60.           if actor.state?(iii)
  61.             power2 *= 100.0 / $data_states[iii].pdef_rate
  62.             power2 *= 100.0 / $data_states[iii].mdef_rate
  63.             power2 *= 100.0 / $data_states[iii].eva
  64.           end
  65.         end
  66.         power = 1.0 * actor.hp * (actor.pdef + actor.mdef) * actor.agi / (actor.int * actor.atk * actor.str * power2)
  67.         if roulette == nil
  68.           roulette = actor
  69.           last_power = power
  70.         else
  71.           # 权重值的修正:如果下一位战斗员的权重值较小,则换人
  72.           if power < last_power
  73.             roulette = actor
  74.             last_power = power
  75.           end         
  76.         end
  77.       end
  78.     end
  79.     # 决定角色
  80.     return roulette
  81.   end
  82. end

  83. #==============================================================================
  84. # ■ Game_Troop
  85. #------------------------------------------------------------------------------
  86. #  处理队伍的类。本类的实例请参考 $game_troop
  87. #
  88. #==============================================================================

  89. class Game_Troop
  90.   #--------------------------------------------------------------------------
  91.   # ● 对像敌人的确定
  92.   #     hp0 : 限制 HP 0 的敌人
  93.   #--------------------------------------------------------------------------
  94.   def certain_target_enemy(hp0 = false)
  95.     # 初始化权重值
  96.     power = 1.0
  97.     last_power = 1.0
  98.     # 初始化轮流
  99.     roulette = nil
  100.     # 循环
  101.     for enemy in @enemies
  102.       # 符合条件的场合
  103.       if (not hp0 and enemy.exist?) or (hp0 and enemy.hp0?)
  104.         power = 1.0
  105.         if enemy.guarding?
  106.           power2 = 0.5
  107.         elsif enemy.cant_evade?
  108.           power2 = 2.0
  109.         else
  110.           power2 = 1.0
  111.         end
  112.         power = 1.0 * enemy.hp * (enemy.pdef + enemy.mdef) * enemy.agi / (enemy.int * enemy.atk * enemy.str * power2)
  113.         if roulette == nil
  114.           roulette = enemy
  115.           last_power = power
  116.         else
  117.           # 权重值的修正:如果下一位战斗员的权重值较小,则换人
  118.           if power < last_power
  119.             roulette = enemy
  120.             last_power = power
  121.           end
  122.         end
  123.       end
  124.     end
  125.     # 决定敌人
  126.     return roulette
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 对像敌人的确定 (HP 0)
  130.   #--------------------------------------------------------------------------
  131.   def certain_target_enemy_hp0
  132.     return certain_target_enemy(true)
  133.   end
  134. end

  135. #==============================================================================
  136. # ■ Game_Enemy
  137. #------------------------------------------------------------------------------
  138. #  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
  139. # 内部使用。
  140. #==============================================================================

  141. class Game_Enemy < Game_Battler
  142.   #--------------------------------------------------------------------------
  143.   # ● 生成行动
  144.   #--------------------------------------------------------------------------
  145.   def make_action
  146.     # 清除当前行动
  147.     self.current_action.clear
  148.     # 无法行动的情况
  149.     unless self.movable?
  150.       # 过程结束
  151.       return
  152.     end
  153.     # 抽取现在有效的行动
  154.     available_actions = []
  155.     rating_max = 0
  156.     for action in self.actions
  157.       # 确认回合条件
  158.       n = $game_temp.battle_turn
  159.       a = action.condition_turn_a
  160.       b = action.condition_turn_b
  161.       if (b == 0 and n != a) or
  162.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  163.         next
  164.       end
  165.       # 确认 HP 条件
  166.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  167.         next
  168.       end
  169.       # 确认等级条件
  170.       if $game_party.max_level < action.condition_level
  171.         next
  172.       end
  173.       # 确认开关条件
  174.       switch_id = action.condition_switch_id
  175.       if switch_id > 0 and $game_switches[switch_id] == false
  176.         next
  177.       end
  178.       # 符合条件 : 添加本行动
  179.       available_actions.push(action)
  180.       if action.rating > rating_max
  181.         rating_max = action.rating
  182.       end
  183.     end
  184.     # 最大概率值作为 3 合计计算(0 除外)
  185.     ratings_total = 0
  186.     for action in available_actions
  187.       if action.rating > rating_max - 3
  188.         ratings_total += action.rating - (rating_max - 3)
  189.       end
  190.     end
  191.     # 概率合计不为 0 的情况下
  192.     if ratings_total > 0
  193.       # 生成随机数
  194.       value = rand(ratings_total)
  195.       # 设置对应生成随机数的当前行动
  196.       for action in available_actions
  197.         if action.rating > rating_max - 3
  198.           if value < action.rating - (rating_max - 3)
  199.             self.current_action.kind = action.kind
  200.             self.current_action.basic = action.basic
  201.             self.current_action.skill_id = action.skill_id
  202. # 修改:敌人不再盲目乱打,而是死盯一个确定目标=================================
  203.             if $game_variables[50] == 0
  204.               self.current_action.decide_random_target_for_enemy
  205.             else
  206.               self.current_action.decide_certain_target_for_enemy
  207.             end
  208. # =============================================================================
  209.             return
  210.           else
  211.             value -= action.rating - (rating_max - 3)
  212.           end
  213.         end
  214.       end
  215.     end
  216.   end
  217. end
复制代码
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 11:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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