Project1

标题: 有關最終命中與閃避的問題.. [打印本页]

作者: 亂堂和樹    时间: 2012-10-30 20:45
标题: 有關最終命中與閃避的問題..
SRPG2腳本經過上次前輩修改後
已經成功實現爆撃.命中.閃避三個數值自動產生

但是問題出現了...他原本設定中..

class Game_Battler中

  #--------------------------------------------------------------------------
  # ● 最終命中率の計算
  #     user : 攻撃者、スキルまたはアイテムの使用者
  #     obj  : スキルまたはアイテム (通常攻撃の場合は nil)
  #--------------------------------------------------------------------------
  def calc_hit(user, obj = nil)
    if obj == nil                           # 通常攻撃の場合
      hit = user.hit                        # 命中率を取得
      physical = true
    elsif obj.is_a?(RPG::Skill)             # スキルの場合
      hit = obj.donevade? ? 100 : obj.hit   # 成功率を取得
      physical = obj.physical_attack
    else                                    # アイテムの場合
      hit = 100                             # 命中率を 100% とする
      physical = obj.physical_attack
    end
    hit = 100 if user.donevade?             # 必中状態なら 100% とする
    if physical                             # 物理攻撃の場合
      hit /= 4 if user.reduce_hit_ratio?    # 使用者が暗闇なら 1/4 にする
    end
    return hit
  end
  #--------------------------------------------------------------------------
  # ● 最終回避率の計算
  #     user : 攻撃者、スキルまたはアイテムの使用者
  #     obj  : スキルまたはアイテム (通常攻撃の場合は nil)
  #--------------------------------------------------------------------------
  def calc_eva(user, obj = nil)
    eva = self.eva
    if $game_temp.unit_back_attack          # 背後攻撃ボーナス
      eva = [eva - TSRPG::BACK_ATTACK_BONUS_HIT, 0].max
    end
    unless obj == nil                       # 通常攻撃ではない場合
      eva = 0 unless obj.physical_attack    # 物理攻撃以外なら 0% とする
      eva = 0 if obj.donevade?              # 必中スキルなら 0% とする
    end
    eva = 0 if user.donevade?               # 攻撃者が必中状態なら 0% とする
    eva = 0 unless parriable?               # 回避不可能状態なら 0% とする
    return eva
  end

卻無法計算真正的命中率...以及閃避...
例如主角命中200..怪物閃避150
計算過後...應該是50%命中才對..
卻顯示"-68%"命中..還倒扣呢..

要怎麼做才能修改成
單單只依靠..
攻擊方命中-防禦方閃躲=命中率呢?
防禦方閃躲-攻擊方命中=閃避呢

另外..還有個問題...
他在實行我方回合行動攻擊時..
class Window_Status_Srpg < Window_Base中..
  #--------------------------------------------------------------------------
  # ● 命中率(回避率含む)を返す
  #--------------------------------------------------------------------------
  def get_hit_rate
#hit = @attacker.unit.hit - @target.unit.eva
<<↑這段是我後面寫上的~因為前面更新有定義refresh(attacker, target = nil)>>
    hit = @target.unit.calc_hit(@attacker.unit, @obj)
    hit = hit* (100 - @target.unit.calc_eva(@attacker.unit, @obj)) / 100
    return hit
  end

要是超過命中100的話~要如何顯示100%~而不是101.102..等等超過100的數值??
這裡只是計算數值的提示而已...跟最上面的最終命中率沒相關..
dsu_plus_rewardpost_czw
作者: a364774426    时间: 2012-10-30 21:27
不知道那个-68%是怎么计算出来的,按照你所给的脚本来看是没有经过修改的。
本身命中与回避之间的关系是很复杂的,首先单单依靠命中减回避来取得最终命中是很片面的,例如攻方命中100和受方闪避100的时候,最终命中就是0,
这本身就是一个自相矛盾的现象。另外在命中小于100的情况下,如95%,那么假设受方闪避为0,有5%的几率是打偏的,即是MISS,一旦受方闪避大于0,
那么就要考虑到在没有打偏的情况下,攻击命中的概率,同理最终闪避几率也是如此。

对于命中超过100的问题,很简单,在定义命中等数值的地方,返回值之前加入一句"n = 100 if n > 100 ########n是命中等值"
作者: 亂堂和樹    时间: 2012-10-30 21:37
本帖最后由 亂堂和樹 于 2012-10-30 21:41 编辑

a364774426前輩~感謝你回覆我啊>"<!

前輩~要是我設定改成這樣~他算出來~會跟我想要的理想數值一樣嗎?

這是我自己修改過後的結果↓
  #--------------------------------------------------------------------------
  # ● 最終命中率の計算
  #     user : 攻撃者、スキルまたはアイテムの使用者
  #     obj  : スキルまたはアイテム (通常攻撃の場合は nil)
  #--------------------------------------------------------------------------
  def calc_hit(user, obj = nil)
    if obj == nil                           # 通常攻撃の場合
      hit = user.hit                        # 命中率を取得
      physical = true
    elsif obj.is_a?(RPG::Skill)             # スキルの場合
      #hit = obj.donevade? ? 100 : obj.hit   # 成功率を取得
      #hit = obj.hit+user.hit
      #physical = obj.physical_attack
      hit = user.hit                        # 命中率を取得   <<這段是我自己新增的
      physical = true                                                <<這段是我自己新增的
    else                                    # アイテムの場合
      hit = 100                             # 命中率を 100% とする
      physical = obj.physical_attack
    end
    hit = 100 if user.donevade?             # 必中状態なら 100% とする
    if physical                             # 物理攻撃の場合
      hit /= 4 if user.reduce_hit_ratio?    # 使用者が暗闇なら 1/4 にする
    end
    return hit
  end
  #--------------------------------------------------------------------------
  # ● 最終回避率の計算
  #     user : 攻撃者、スキルまたはアイテムの使用者
  #     obj  : スキルまたはアイテム (通常攻撃の場合は nil)
  #--------------------------------------------------------------------------
  def calc_eva(user, obj = nil)
    eva = self.eva
    if $game_temp.unit_back_attack          # 背後攻撃ボーナス
      eva = [eva - TSRPG::BACK_ATTACK_BONUS_HIT, 0].max
    end
    unless obj == nil  # 通常攻撃ではない場合
      eva = eva - user.hit                                          <<這段是我自己新增的
      eva = 0 unless obj.physical_attack   
      eva = 0 if obj.donevade?            
    end
    eva = 0 if user.donevade?               # 攻撃者が必中状態なら 0% とする
    eva = 0 unless parriable?               # 回避不可能状態なら 0% とする
    return eva
  end


另外顯示部分我修改成
  def get_hit_rate
    hit = @attacker.unit.hit - @target.unit.eva          <<這段是我自己新增的
    #hit = @target.unit.calc_hit(@attacker.unit, @obj)
    #hit = hit* (100 - @target.unit.calc_eva(@attacker.unit, @obj)) / 100
    if @attacker.unit.hit - @target.unit.eva > 100     <<這段是我自己新增的
    hit =100                                                             <<這段是我自己新增的
    elsif @attacker.unit.hit - @target.unit.eva < 0     <<這段是我自己新增的
    hit = 0                                                                <<這段是我自己新增的
    end                       
    return hit
  end

這顯示部分~只是單純~超過100就顯示100%命中~低於0就是0%
所以我最終命中跟閃避...只是希望很單純的
HIT-EVA=真HIT
作者: 亂堂和樹    时间: 2012-10-30 21:58


果然自己寫的那樣...完全的有問題..
0%..一樣打中..還是物理攻擊呢..

真想說不管是物理攻擊有沒有打勾...只想把命中-閃避所剩的數值..列為100%算法..
看來又要花一晚來搞這命中跟迴避的問題了..
作者: 怪蜀黍    时间: 2012-10-30 22:08
亂堂和樹 发表于 2012-10-30 21:58
果然自己寫的那樣...完全的有問題..
0%..一樣打中..還是物理攻擊呢..

你可以:
  1. 实际命中 = 命中/(命中 + 回避) * 100%
复制代码
这个函数的值域一定是在0-1之间的。
从函数可以看出:命中占的比率越大,打中的机会就越大。如果回避占了上风,打中的机会就小。
喵~
作者: 亂堂和樹    时间: 2012-10-30 22:41
本帖最后由 亂堂和樹 于 2012-10-30 22:52 编辑

那他跳出...


是為什麼??
296行是這個



新的錯誤
少了一個什麼數值?





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