Project1

标题: 【VX】敌人的行动优先值求解 [打印本页]

作者: 黑舞嗜    时间: 2011-12-15 19:09
标题: 【VX】敌人的行动优先值求解

数据库里敌人下面的那些行动优先值的几率还是不太理解,求比较详细的说明(举例最佳)
作者: 小白玩家    时间: 2011-12-15 19:15
本帖最后由 小白玩家 于 2011-12-15 19:27 编辑

同样的条件下优先值高的先执行,10最大,1最小
比如条件都是平时的话 敌人 攻击的优先值5 使用吸血技能优先值为10
那么敌人不会攻击,都是吸血了
如果 攻击优先值5 使用吸血的优先6 那么都有可能,吸血的几率大一点(差不太多
小白的理解,不对的请指出哦
作者: wbsy8241    时间: 2011-12-15 19:25
本帖最后由 wbsy8241 于 2011-12-15 19:30 编辑

所有行动值加起来再随机取最小值到最大值中间取一个值 来决定位置(我语言表达能力不行= =)

比如: 3 4 5 6
总值= 3+4+5+6 = 18
那各值的出现率是
3/18  4/18  5/18  6/18

随机1-18 比如是8
那(3+4)<8  (3+4+5)>8
所以用5的那个技能

PS:附图

作者: feizhaodan    时间: 2011-12-15 19:33
以下转自Ace的帮助,不知道VX一不一样
[行动]中定义的行动中、在战斗中使用的将根据以下规则决定

(1)收集满足条件的行动。假如没有满足条件的行动将不进行任何行动。

(2)在满足条件的行动中,选择其中最高优先级的行动和与其优先级相差2以内的行动作为候补。

(3)在采用候补中、与最高优先级相差1与2的分别赋予最高优先级的2/3、1/3的采用几率。在有复数个相同优先级的行动时、其采用几率相等。

【例1】行动优先级为[5][5]时

各为50%。

【例2】行动优先级为[6][5][4][3]时

[6]为50%、[5]为33.3%(50%的2/3)、[4]为16.6(50%的1/3)、[3]不会做为候补。

【例3】行动优先级为[5][3][3]时

[5]为60%、[3][3]各为20%(60%的1/3)。

(4)根据候补的采用几率、使用随机数来决定。

不是这个就是楼上吧= =
作者: 小白玩家    时间: 2011-12-15 19:35
那么优先值为 5和 10的话
5是普通攻击
10是吸血
总值= 5+10 = 15?
为什么我测试的时候 一次普通攻击都不会出现呢
随机1-15吗
作者: wbsy8241    时间: 2011-12-15 19:58
本帖最后由 wbsy8241 于 2011-12-15 20:11 编辑
  1.   #--------------------------------------------------------------------------
  2.   # ● 生成战斗行动
  3.   #--------------------------------------------------------------------------
  4.   def make_action
  5.     @action.clear
  6.     return unless movable?
  7.     available_actions = []
  8.     rating_max = 0
  9.     for action in enemy.actions  #循环所有行动
  10.       next unless conditions_met?(action)  #跳过条件不足项
  11.       if action.kind == 1
  12.         next unless skill_can_use?($data_skills[action.skill_id])  #跳过不能使用技能的情况
  13.       end
  14.       available_actions.push(action)  #添加到可用行动列表
  15.       rating_max = [rating_max, action.rating].max  #取所有值中间的最大优先值
  16.     end
  17.     ratings_total = 0
  18.     rating_zero = rating_max - 3  #设定最小优先值是最大优先值-3
  19.     for action in available_actions  #循环所有可用行动
  20.       next if action.rating <= rating_zero  #跳过优先值小于最小优先值项
  21.       ratings_total += action.rating - rating_zero  #总随机数+(此技能优先值-最小优先值)
  22.     end
  23.     return if ratings_total == 0
  24.     value = rand(ratings_total)  #随机取值
  25.     for action in available_actions  #循环所有可用行动
  26.       next if action.rating <= rating_zero  #跳过优先值小于最小优先值项
  27.       if value < action.rating - rating_zero  #随机值小于(此技能优先值-最小优先值)
  28.         @action.kind = action.kind              #的情况判断为使用这个技能
  29.         @action.basic = action.basic
  30.         @action.skill_id = action.skill_id
  31.         @action.decide_random_target
  32.         return
  33.       else
  34.         value -= action.rating - rating_zero  #随机值-(此技能优先值-最小优先值)
  35.       end
  36.     end
  37.   end
复制代码
例:
A:3
B:4
C:5
D:5
E:6

最大值为6
最小值为 6-3 = 3

排除优先值为 3 包括3以下的可能

重设技能的优先值
B = 4-3 = 1  (概率1/8)
C = 5-3 = 2  (概率2/8)
D = 5-3 = 2  (概率2/8)
E = 6-3 = 3  (概率3/8)
随机总值= 1+ 2+2+3 = 8

然后就根据我上面的回复计算得到用什么技能

我以前粗略看了没发现会排除 小于最大可能性-3的可能



证例3
【例3】行动优先级为[5][3][3]时

[5]为60%、[3][3]各为20%(60%的1/3)。

最小值是5-3 = 2
实际用于计算各值为
[5] = 5-2 = 3  (概率3/5 = 60%)
[3] = 3-2 = 1  (概率1/5 = 20%)
[3] = 3-2 = 1  (概率1/5 = 20%)

作者: hcm    时间: 2011-12-15 23:51
同样的条件下优先值高的执行概率高,10最大,0最小
在两行动的优先值差值相等时,两者的数值越大,优先值大的那个发动的概率越高。
比如条件都是平时的话 敌人 攻击的优先值5 某技能优先值为3,则敌人隔三差五发技能。
敌人 攻击的优先值9 某技能优先值为7,就基本都在攻击。
如果 攻击优先值10技能的优先8 就总是攻击。
我原以为是@wbsy8241那样,可我测试游戏时发现不是。




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