| 
本帖最后由 miantouchi 于 2023-6-10 14:45 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 今天想和大家解读下 敌人行为概率。对于小白的我始终对这个地方使用的迷迷糊糊。
 有幸参看:【完结】RPG Maker XP(数据库及事件) 使用教程里面的文字解读。
 稍后我会通过脚本方式参照教程里面去解读。
 
 【概率】这个设定是整个数据库-敌人中最难说清楚的了,概率一共分为9个等级,分别由数字1~9表示。那么敌人最终的行为的抽取满足什么规律呢?在研究完十分别扭的Game_Enemy后,本人将此规律送上。首先,还是引入权重的概念,每一条行为都有其对应的权重,但是这个权重并不是我们设置的这个概率等级1~9。而是要从备选行为中找到最大的概率,以这个最大概率为基准,其他行为,如果他们的概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。其他概率和最大概率相差超过2的,即使满足了所有出现的条件,也不可能被采用。实际的权重表示为:具有最大概率的行为:权重为3概率比最大概率低一个等级:权重为2概率比最大概率低两个等级:权重为1 而后,对所有的这样的(满足出现条件的)行为进行一次有权重的随机选取,决定最终行为。接下来给出一个例子,假设某敌人总共有5个行为(其中标明√的行为是满足出现条件的行为):行为1:概率5(实际权重0)√行为2:概率4(实际权重3)√行为3:概率4(实际权重3)√行为4:概率2(实际权重1)√行为5:概率1(实际权重0) 那么按照如上规则,最终的总权重为3+3+1=7,在该回合内,该敌人有3/7的概率选择行为2,有3/7的概率选择行为3,有1/7的概率选择行为4。注意,行为1由于不满足出现条件,所以权重为0。但是如果条件发生改变,满足行为1的出现条件了,权重就要进行调整。
【概率】 
这个设定是整个数据库-敌人中最难说清楚的了,概率一共分为9个等级,分别由数字1~9表示。那么敌人最终的行为的抽取满足什么规律呢?在研究完十分别扭的Game_Enemy后,本人将此规律送上。 
首先,还是引入权重的概念,每一条行为都有其对应的权重,但是这个权重并不是我们设置的这个概率等级1~9。而是要从备选行为中找到最大的概率,以这个最大概率为基准,其他行为, 
如果他们的概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。其他概率和最大概率相差超过2的,即使满足了所有出现的条件,也不可能被采用。 
实际的权重表示为: 
具有最大概率的行为:权重为3 
概率比最大概率低一个等级:权重为2 
概率比最大概率低两个等级:权重为1 
  
而后,对所有的这样的(满足出现条件的)行为进行一次有权重的随机选取,决定最终行为。 
接下来给出一个例子,假设某敌人总共有5个行为(其中标明√的行为是满足出现条件的行为): 
行为1:概率5(实际权重0) 
√行为2:概率4(实际权重3) 
√行为3:概率4(实际权重3) 
√行为4:概率2(实际权重1) 
√行为5:概率1(实际权重0) 
  
那么按照如上规则,最终的总权重为3+3+1=7,在该回合内,该敌人有3/7的概率选择行为2,有3/7的概率选择行为3,有1/7的概率选择行为4。 
注意,行为1由于不满足出现条件,所以权重为0。但是如果条件发生改变,满足行为1的出现条件了,权重就要进行调整。 
上面这段就是论坛的教程,我今天就通过脚本去验证下。
 首先我把数据库制作下怪物的四种行为
 1、攻击概率5
 2、治疗概率4
 3、水概率3
 4、毒概率2
 
   
 接着找到这段代码脚本对应的地方。脚本则在Game_Enemy中的make_action方法当中
 我分成3部分解读。
 
   
 首先这是第一段,1-4行为中获得当中最高的行为值然后赋值给 rating_max
 这里攻击的rating值最高是5.
 
 # 符合条件 : 添加本行动      available_actions.push(action)      if action.rating > rating_max        rating_max = action.rating      end
# 符合条件 : 添加本行动 
      available_actions.push(action) 
      if action.rating > rating_max 
        rating_max = action.rating 
      end 
 第二段,则是累加权重值,对应的是教程下面的这段文字。
 
 复制代码如果他们的概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。其他概率和最大概率相差超过2的,
即使满足了所有出现的条件,也不可能被采用。
实际的权重表示为:
具有最大概率的行为:权重为3
概率比最大概率低一个等级:权重为2
概率比最大概率低两个等级:权重为1
ratings_total  = 5-(5-3) + 4-(5-3) + 3-(5-3)= 6
 从这里面可以看出来4、毒概率2,最后一个行为被砍掉了,
 因为action.rating > rating_max - 3 这句 2 > 5-3 不成立!!!
 
 ratings_total = 0    for action in available_actions      if action.rating > rating_max - 3        ratings_total += action.rating - (rating_max - 3)      end    end
ratings_total = 0 
    for action in available_actions 
      if action.rating > rating_max - 3 
        ratings_total += action.rating - (rating_max - 3) 
      end 
    end 
 
 
 第三段。
 将剩下合格的行为1-行为3,挨个带入公式
 
 if ratings_total > 0      # 生成随机数      value = rand(ratings_total)      # 设置对应生成随机数的当前行动      for action in available_actions        if action.rating > rating_max - 3          if value < action.rating - (rating_max - 3)            self.current_action.kind = action.kind            self.current_action.basic = action.basic            self.current_action.skill_id = action.skill_id            self.current_action.decide_random_target_for_enemy            return          else            value -= action.rating - (rating_max - 3)          end        end      end    end
if ratings_total > 0 
      # 生成随机数 
      value = rand(ratings_total) 
      # 设置对应生成随机数的当前行动 
      for action in available_actions 
        if action.rating > rating_max - 3 
          if value < action.rating - (rating_max - 3) 
            self.current_action.kind = action.kind 
            self.current_action.basic = action.basic 
            self.current_action.skill_id = action.skill_id 
            self.current_action.decide_random_target_for_enemy 
            return 
          else 
            value -= action.rating - (rating_max - 3) 
          end 
        end 
      end 
    end 
 比如:value < action.rating - (rating_max - 3)
 value 是个随机数rand(6)生成0-5任意一个数,
 value < 5-(5-3)=3
 value < 4-(5-3)=2
 value < 3-(5-3)=1
 从第一个行为开始挨个行为进行比较,判定成功则执行该行为
 失败则进行value -= action.rating - (rating_max - 3) 缩小下范围后,进行下一个行为的判定。
 
 
   最后是一个游戏测试结果图片,敌人使用了行为2,value 首次是3正好和行为1判定不成功,然后进行了一次缩小范围减去3正好是0
 这时value=0符合判定条件,怪物则使用了行为2.
 
 总结下:
 1、行为概率是不想象中的概率,是权重的意思,并且权重最高是3。
 2、概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。否则写了一堆也没用。
 3、明白后可以提升怪物的AI(我不会。。。。。。我仅限于刚刚能读懂。)
 4、value -= action.rating - (rating_max - 3) 这段作用我不是太通,大神可以继续发挥解读下。
 |