查看: 1967|回复: 6

[讨论] 和我一起读脚本--敌人行为概率。

[复制链接]
梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

发表于 2023-6-10 14:31:29 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 miantouchi 于 2023-6-10 14:45 编辑

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

[pre lang="ruby"]【概率】
这个设定是整个数据库-敌人中最难说清楚的了,概率一共分为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的出现条件了,权重就要进行调整。[/pre]
上面这段就是论坛的教程,我今天就通过脚本去验证下。
首先我把数据库制作下怪物的四种行为
1、攻击概率5
2、治疗概率4
3、水概率3
4、毒概率2
1.png

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

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

[pre lang="ruby"]# 符合条件 : 添加本行动
      available_actions.push(action)
      if action.rating > rating_max
        rating_max = action.rating
      end[/pre]

第二段,则是累加权重值,对应的是教程下面的这段文字。
  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 不成立!!!
[pre lang="ruby"]    ratings_total = 0
    for action in available_actions
      if action.rating > rating_max - 3
        ratings_total += action.rating - (rating_max - 3)
      end
    end[/pre]



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

[pre lang="ruby"] 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[/pre]

比如: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) 缩小下范围后,进行下一个行为的判定。

3.png
最后是一个游戏测试结果图片,敌人使用了行为2,value 首次是3正好和行为1判定不成功,然后进行了一次缩小范围减去3正好是0
这时value=0符合判定条件,怪物则使用了行为2.


总结下:
1、行为概率是不想象中的概率,是权重的意思,并且权重最高是3。
2、概率和最大的概率相差在2以内(包括2),那么这样的行为才有可能被采用。否则写了一堆也没用。
3、明白后可以提升怪物的AI(我不会。。。。。。我仅限于刚刚能读懂。)
4、value -= action.rating - (rating_max - 3) 这段作用我不是太通,大神可以继续发挥解读下。

评分

参与人数 1赞 +1 收起 理由
契约师Vi + 1 精品文章

查看全部评分

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2023-6-10 18:08:06 | 显示全部楼层
第4个就是实现权重分配的代码。

点评

测试了下确实是这么回事,自己构建公式的能力是没有。  发表于 2023-6-17 14:08

评分

参与人数 1赞 +1 收起 理由
miantouchi + 1 我很赞同

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
1442
在线时间
171 小时
注册时间
2019-10-4
回帖
162
发表于 2023-6-10 21:06:34 | 显示全部楼层
本帖最后由 契约师Vi 于 2023-6-10 21:10 编辑

挺给力的,要是能设置技能出招顺序就好了,比如说对己方角色进行破防,在砍一刀啥的。打出和玩家一样的操作

点评

伪CP技能https://pan.baidu.com/s/12H1yREe3a_QH_3IzSLOhJQ?pwd=vj4k  发表于 2023-6-12 11:51
哈哈,这个问题这个地方估计解决不了,这个地方是抽取。  发表于 2023-6-11 20:35
回复

使用道具 举报

梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

 楼主| 发表于 2023-6-17 14:00:38 | 显示全部楼层
本帖最后由 miantouchi 于 2023-6-17 14:07 编辑

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部