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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14111
在线时间
2142 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2023-6-10 14:31:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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) 这段作用我不是太通,大神可以继续发挥解读下。

评分

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

查看全部评分

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

2
发表于 2023-6-10 18:08:06 | 只看该作者
第4个就是实现权重分配的代码。

点评

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

评分

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

查看全部评分

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

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1237
在线时间
163 小时
注册时间
2019-10-4
帖子
217
3
发表于 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
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14111
在线时间
2142 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

4
 楼主| 发表于 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 (19.63 KB, 下载次数: 11)

8.png

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

9.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-28 08:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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