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

Project1

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

[已经过期] 有關最終命中與閃避的問題..

[复制链接]

Lv1.梦旅人

梦石
0
星屑
80
在线时间
330 小时
注册时间
2010-5-4
帖子
173
跳转到指定楼层
1
发表于 2012-10-30 20:45:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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的數值??
這裡只是計算數值的提示而已...跟最上面的最終命中率沒相關..

点评

除非数据库里技能勾选了物理攻击,否则技能的命中率等于其成功率。  发表于 2012-10-30 21:49

Lv1.梦旅人

梦石
0
星屑
48
在线时间
2459 小时
注册时间
2011-12-18
帖子
1484
2
发表于 2012-10-30 21:27:43 | 只看该作者
不知道那个-68%是怎么计算出来的,按照你所给的脚本来看是没有经过修改的。
本身命中与回避之间的关系是很复杂的,首先单单依靠命中减回避来取得最终命中是很片面的,例如攻方命中100和受方闪避100的时候,最终命中就是0,
这本身就是一个自相矛盾的现象。另外在命中小于100的情况下,如95%,那么假设受方闪避为0,有5%的几率是打偏的,即是MISS,一旦受方闪避大于0,
那么就要考虑到在没有打偏的情况下,攻击命中的概率,同理最终闪避几率也是如此。

对于命中超过100的问题,很简单,在定义命中等数值的地方,返回值之前加入一句"n = 100 if n > 100 ########n是命中等值"

点评

那這有辦法解決嘛...  发表于 2012-10-30 22:04
嘛...SRPG2他設定中還蠻奇怪的.. 有些技能有特殊設定~像是必中狀態 不管敵方閃避999..還是100%命中 其他部分技能也是呢0.0..  发表于 2012-10-30 21:47

评分

参与人数 2星屑 +86 收起 理由
咕噜 + 80 我很赞同
怪蜀黍 + 6 我很赞同

查看全部评分

这是一个深不见底的坑,这是一个广袤无边的坑,我才刚刚放上了一抔泥土……

《六道·陈国篇》开坑了……↓点我
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
80
在线时间
330 小时
注册时间
2010-5-4
帖子
173
3
 楼主| 发表于 2012-10-30 21:37:12 | 只看该作者
本帖最后由 亂堂和樹 于 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
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
80
在线时间
330 小时
注册时间
2010-5-4
帖子
173
4
 楼主| 发表于 2012-10-30 21:58:38 | 只看该作者


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

真想說不管是物理攻擊有沒有打勾...只想把命中-閃避所剩的數值..列為100%算法..
看來又要花一晚來搞這命中跟迴避的問題了..

点评

就是这个意思,不光要在Game_Actor中定义,Game_Enemy中也要定义敌人的命中和回避。当然你可以用数据库中备注栏来定义,这样这两数值就可以超过99了。  发表于 2012-10-30 22:30
当我没说吧,估计你也没看懂,喵~~  发表于 2012-10-30 22:24
加个"_1"只是区分hit和eva罢了。  发表于 2012-10-30 22:23
不是这样写的。hit = user.hit_1 / (user.hit_1 + self.eva_1),不过hit_1和eva_1这两个关系到最终命中的参数还需要你自己重新定义。  发表于 2012-10-30 22:22
不是放哪,而是推荐你命中公式这样设计比HIT-EVA=真HIT更合理。即使命中和回避都超过100,这公式的值依旧在0-1之间。你可以试试。  发表于 2012-10-30 22:12
回复

使用道具 举报

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4684
在线时间
5240 小时
注册时间
2009-4-29
帖子
14318

贵宾

5
发表于 2012-10-30 22:08:10 | 只看该作者
亂堂和樹 发表于 2012-10-30 21:58
果然自己寫的那樣...完全的有問題..
0%..一樣打中..還是物理攻擊呢..

你可以:
  1. 实际命中 = 命中/(命中 + 回避) * 100%
复制代码
这个函数的值域一定是在0-1之间的。
从函数可以看出:命中占的比率越大,打中的机会就越大。如果回避占了上风,打中的机会就小。
喵~

点评

小韦说得很对,这样吧,乘个1.0即可带浮点:hit = user.hit_1 * 1.0 / (user.hit_1 + self.eva_1)[url=home.php?mod=space&username=a364774426]@a364774426[/url]  发表于 2012-10-30 22:41
按照之前你提问贴里的公式,要重新写才行。  发表于 2012-10-30 22:40
hit = user.hit / (hit + eva)*100% 这样写的话,命中或回避之一必须有浮点数,否则命中永远为0.  发表于 2012-10-30 22:39
喔~我懂了~定義是在Game_Actor中定義吧?  发表于 2012-10-30 22:28
像這樣定義? hit = user.hit # 命中率を取得 hit_1 = user.hit eva = self.eva eva_1 = eva  发表于 2012-10-30 22:26

评分

参与人数 1星屑 +80 收起 理由
咕噜 + 80 我很赞同

查看全部评分

《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
80
在线时间
330 小时
注册时间
2010-5-4
帖子
173
6
 楼主| 发表于 2012-10-30 22:41:11 | 只看该作者
本帖最后由 亂堂和樹 于 2012-10-30 22:52 编辑

那他跳出...


是為什麼??
296行是這個



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

点评

呃...我剛才才注意到不能寫100%..但是改了又跳了錯誤.. 我編輯一下貼圖  发表于 2012-10-30 22:51
下线了,喵~  发表于 2012-10-30 22:51
hit = user.hit_1 * 1.0 / (user.hit_1 + self.eva_1)  发表于 2012-10-30 22:51
系统不认识100%,我是按照数学公式来写的,写程序不能这样写。100%就等于1,不要写。还要记得乘1.0,否则像小韦说的,永远等于0.  发表于 2012-10-30 22:49
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 06:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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