Project1

标题: 求教自动战斗的评价机制 [打印本页]

作者: timiesea    时间: 2014-11-6 11:18
标题: 求教自动战斗的评价机制
在Game_Action类的evaluate和evaluate_item方法用来计算技能/物品的使用评分,用来进行自动战斗。
脚本如下:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 行动的价值评价(自动战斗用)
  3.   #    自动设置 @value 和 @target_index 。
  4.   #--------------------------------------------------------------------------
  5.   def evaluate
  6.     @value = 0
  7.     evaluate_item if valid?#如果可以行动则开始计算评价
  8.     @value += rand if @value > 0#评价为正数时加上一个随机数(0-1)
  9.     self#[color=Red][b]返回自身??????[/b][/color]
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 技能/物品的评价
  13.   # 按我的理解:评价只根据目标数量和伤害来进行计算,当目标为全体时,每一个目标都会给评价加分;当目标为单体时,则评分为当前目标的分数。
  14.   #--------------------------------------------------------------------------
  15.   def evaluate_item
  16.     item_target_candidates.each do |target|#对每一个技能的候选目标进行获取
  17.       value = evaluate_item_with_target(target)#对指定的目标计算评价
  18.       if item.for_all?#如果技能作用于全体
  19.         @value += value#将计算得来的评价累加到已有评价
  20.       elsif value > @value#或者如果计算出来的评价大于已有评价
  21.         @value = value#将已有评价重新赋值为计算出的评价
  22.         @target_index = target.index#技能目标赋值为当前计算的目标
  23.       end
  24.     end
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 技能/物品的评价(对指定目标)
  28.   #--------------------------------------------------------------------------
  29.   def evaluate_item_with_target(target)
  30.     target.result.clear#清除行动结果
  31.     target.make_damage_value(subject, item)#对目标计算伤害,不会造成伤害
  32.     if item.for_opponent?#判断技能是否对敌人有效
  33.       return target.result.hp_damage.to_f / [target.hp, 1].max#将目标受到的伤害经过计算后返回评价。当伤害越高,目标的生命值越低,评价越高
  34.     else#如果技能不是对敌人有效(对队友有效的情况)
  35.       recovery = [-target.result.hp_damage, target.mhp - target.hp].min#计算目标实际受到的治疗量。治疗溢出忽略不计。
  36.       return recovery.to_f / target.mhp#将治疗量进行计算后返回评价。当治疗越高,目标的最大生命值越低,评价越高。
  37.     end
  38.   end

简而言之:评价计算的机制是:无论是单体技能还是群体技能,都会对每一个目标计算评价,在最后进行累加(单体技能只有一个目标,因此没有累加)。目标的评价由伤害/治疗决定,并且忽略溢出。因此,伤害/治疗越高,目标生命值/最大生命值越低,评价越高。对于伤害技能而言,评价高表示该技能容易一击杀死敌人;对于治疗技能而言,评价高表示该技能容易一击回满状态。但是过高的评价会造成技能浪费。

以上就是我根据脚本理解而来的系统评价行动的机制,不知道是不是正确的,希望各位指教。

另:脚本中我有注释了一行红色加粗的文字,我暂时不知道这句话的意义。望知道的告知!
作者: taroxd    时间: 2014-11-6 12:39
Game_Actor 里面
  1.   def make_action_list
  2.     list = []
  3.     list.push(Game_Action.new(self).set_attack.evaluate)
  4.     usable_skills.each do |skill|
  5.       list.push(Game_Action.new(self).set_skill(skill.id).evaluate)
  6.     end
  7.     list
  8.   end
复制代码
这下你知道 evaluate 返回 self 的意义了吗?
作者: 你最珍贵    时间: 2014-11-6 12:41
rand是随机数




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