Project1
标题: 和我一起读脚本--敌人行为概率。 [打印本页]
作者: miantouchi 时间: 2023-6-10 14:31
标题: 和我一起读脚本--敌人行为概率。
本帖最后由 miantouchi 于 2023-6-10 14:45 编辑
今天想和大家解读下 敌人行为概率。对于小白的我始终对这个地方使用的迷迷糊糊。
有幸参看:【完结】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) 这段作用我不是太通,大神可以继续发挥解读下。
作者: 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)
-
9.png
(18.59 KB, 下载次数: 25)
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |