Project1

标题: 和我一起读脚本--敌人行为概率。 [打印本页]

作者: miantouchi    时间: 2023-6-10 14:31
标题: 和我一起读脚本--敌人行为概率。
本帖最后由 miantouchi 于 2023-6-10 14:45 编辑

今天想和大家解读下 敌人行为概率。对于小白的我始终对这个地方使用的迷迷糊糊。
有幸参看:【完结】RPG Maker XP(数据库及事件) 使用教程里面的文字解读。
稍后我会通过脚本方式参照教程里面去解读。

RUBY 代码复制
  1. 【概率】
  2. 这个设定是整个数据库-敌人中最难说清楚的了,概率一共分为9个等级,分别由数字1~9表示。那么敌人最终的行为的抽取满足什么规律呢?在研究完十分别扭的Game_Enemy后,本人将此规律送上。
  3. 首先,还是引入权重的概念,每一条行为都有其对应的权重,但是这个权重并不是我们设置的这个概率等级1~9。而是要从备选行为中找到最大的概率,以这个最大概率为基准,其他行为,
  4. 如果他们的概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。其他概率和最大概率相差超过2的,即使满足了所有出现的条件,也不可能被采用。
  5. 实际的权重表示为:
  6. 具有最大概率的行为:权重为3
  7. 概率比最大概率低一个等级:权重为2
  8. 概率比最大概率低两个等级:权重为1
  9.  
  10. 而后,对所有的这样的(满足出现条件的)行为进行一次有权重的随机选取,决定最终行为。
  11. 接下来给出一个例子,假设某敌人总共有5个行为(其中标明√的行为是满足出现条件的行为):
  12. 行为1:概率5(实际权重0
  13. √行为2:概率4(实际权重3
  14. √行为3:概率4(实际权重3
  15. √行为4:概率2(实际权重1
  16. √行为5:概率1(实际权重0
  17.  
  18. 那么按照如上规则,最终的总权重为3+3+1=7,在该回合内,该敌人有3/7的概率选择行为2,有3/7的概率选择行为3,有1/7的概率选择行为4
  19. 注意,行为1由于不满足出现条件,所以权重为0。但是如果条件发生改变,满足行为1的出现条件了,权重就要进行调整。

上面这段就是论坛的教程,我今天就通过脚本去验证下。
首先我把数据库制作下怪物的四种行为
1、攻击概率5
2、治疗概率4
3、水概率3
4、毒概率2


接着找到这段代码脚本对应的地方。脚本则在Game_Enemy中的make_action方法当中
我分成3部分解读。


首先这是第一段,1-4行为中获得当中最高的行为值然后赋值给 rating_max
这里攻击的rating值最高是5.

RUBY 代码复制
  1. # 符合条件 : 添加本行动
  2.       available_actions.push(action)
  3.       if action.rating > rating_max
  4.         rating_max = action.rating
  5.       end


第二段,则是累加权重值,对应的是教程下面的这段文字。
  1. 如果他们的概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。其他概率和最大概率相差超过2的,
  2. 即使满足了所有出现的条件,也不可能被采用。
  3. 实际的权重表示为:
  4. 具有最大概率的行为:权重为3
  5. 概率比最大概率低一个等级:权重为2
  6. 概率比最大概率低两个等级:权重为1
复制代码

ratings_total  = 5-(5-3) + 4-(5-3) + 3-(5-3)= 6
从这里面可以看出来4、毒概率2,最后一个行为被砍掉了,
因为action.rating > rating_max - 3 这句 2 > 5-3 不成立!!!
RUBY 代码复制
  1. ratings_total = 0
  2.     for action in available_actions
  3.       if action.rating > rating_max - 3
  4.         ratings_total += action.rating - (rating_max - 3)
  5.       end
  6.     end




第三段。
将剩下合格的行为1-行为3,挨个带入公式

RUBY 代码复制
  1. if ratings_total > 0
  2.       # 生成随机数
  3.       value = rand(ratings_total)
  4.       # 设置对应生成随机数的当前行动
  5.       for action in available_actions
  6.         if action.rating > rating_max - 3
  7.           if value < action.rating - (rating_max - 3)
  8.             self.current_action.kind = action.kind
  9.             self.current_action.basic = action.basic
  10.             self.current_action.skill_id = action.skill_id
  11.             self.current_action.decide_random_target_for_enemy
  12.             return
  13.           else
  14.             value -= action.rating - (rating_max - 3)
  15.           end
  16.         end
  17.       end
  18.     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) 这段作用我不是太通,大神可以继续发挥解读下。

作者: guoxiaomi    时间: 2023-6-10 18:08
第4个就是实现权重分配的代码。
作者: 契约师Vi    时间: 2023-6-10 21:06
本帖最后由 契约师Vi 于 2023-6-10 21:10 编辑

挺给力的,要是能设置技能出招顺序就好了,比如说对己方角色进行破防,在砍一刀啥的。打出和玩家一样的操作
作者: miantouchi    时间: 2023-6-17 14:00
本帖最后由 miantouchi 于 2023-6-17 14:07 编辑

测试value从0-5的值对应选中的动作
从这里可以看出
6分之1几率选中几率3的那个,权重1
6分之2几率选中几率4的那个,权重2
6分之3几率选中几率5的那个,权重3

8.png (19.63 KB, 下载次数: 26)

8.png

9.png (18.59 KB, 下载次数: 25)

9.png





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