查看: 2665|回复: 2

[已经解决] 求教自动战斗的评价机制

[复制链接]
梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
回帖
155
发表于 2014-11-6 11:18:40 | 显示全部楼层 |阅读模式

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

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

×
在Game_Action类的evaluate和evaluate_item方法用来计算技能/物品的使用评分,用来进行自动战斗。
脚本如下:
[pre lang="ruby" line="1"]  #--------------------------------------------------------------------------
  # ● 行动的价值评价(自动战斗用)
  #    自动设置 @value 和 @target_index 。
  #--------------------------------------------------------------------------
  def evaluate
    @value = 0
    evaluate_item if valid?#如果可以行动则开始计算评价
    @value += rand if @value > 0#评价为正数时加上一个随机数(0-1)
    self#返回自身??????
  end
  #--------------------------------------------------------------------------
  # ● 技能/物品的评价
  # 按我的理解:评价只根据目标数量和伤害来进行计算,当目标为全体时,每一个目标都会给评价加分;当目标为单体时,则评分为当前目标的分数。
  #--------------------------------------------------------------------------
  def evaluate_item
    item_target_candidates.each do |target|#对每一个技能的候选目标进行获取
      value = evaluate_item_with_target(target)#对指定的目标计算评价
      if item.for_all?#如果技能作用于全体
        @value += value#将计算得来的评价累加到已有评价
      elsif value > @value#或者如果计算出来的评价大于已有评价
        @value = value#将已有评价重新赋值为计算出的评价
        @target_index = target.index#技能目标赋值为当前计算的目标
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 技能/物品的评价(对指定目标)
  #--------------------------------------------------------------------------
  def evaluate_item_with_target(target)
    target.result.clear#清除行动结果
    target.make_damage_value(subject, item)#对目标计算伤害,不会造成伤害
    if item.for_opponent?#判断技能是否对敌人有效
      return target.result.hp_damage.to_f / [target.hp, 1].max#将目标受到的伤害经过计算后返回评价。当伤害越高,目标的生命值越低,评价越高
    else#如果技能不是对敌人有效(对队友有效的情况)
      recovery = [-target.result.hp_damage, target.mhp - target.hp].min#计算目标实际受到的治疗量。治疗溢出忽略不计。
      return recovery.to_f / target.mhp#将治疗量进行计算后返回评价。当治疗越高,目标的最大生命值越低,评价越高。
    end
  end
[/pre]
简而言之:评价计算的机制是:无论是单体技能还是群体技能,都会对每一个目标计算评价,在最后进行累加(单体技能只有一个目标,因此没有累加)。目标的评价由伤害/治疗决定,并且忽略溢出。因此,伤害/治疗越高,目标生命值/最大生命值越低,评价越高。对于伤害技能而言,评价高表示该技能容易一击杀死敌人;对于治疗技能而言,评价高表示该技能容易一击回满状态。但是过高的评价会造成技能浪费。

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

另:脚本中我有注释了一行红色加粗的文字,我暂时不知道这句话的意义。望知道的告知!

点评

什么?在脚本中无法定义文字样式?  发表于 2014-11-6 11:19
游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-11-6 12:39:02 | 显示全部楼层
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 的意义了吗?

评分

参与人数 1梦石 +1 收起 理由
VIPArcher + 1 认可答案

查看全部评分

回复

使用道具 举报

故九江太守

梦石
0
星屑
314
在线时间
2158 小时
注册时间
2012-12-5
回帖
4323
发表于 2014-11-6 12:41:39 | 显示全部楼层
rand是随机数
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部