用户工具

站点工具


kmd:方针

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
kmd:方针 [2025/05/09 16:44] – 移除 - 外部编辑 (未知日期) 127.0.0.1kmd:方针 [2025/05/09 16:44] (当前版本) – ↷ 页面方针被移动至kmd:方针 dangfer
行 1: 行 1:
 +====== 方针 ======
 +
 +孔明传中,存在5种方针,分别为
 +  - 前往目标/目的地
 +  - 进攻
 +  - 禁止移动
 +  - 防御
 +  - 逃向目标/目的地
 +
 +其中,前往和逃向的区别在于前往可以进行主动攻击,而逃向不能主动攻击。
 +
 +<code>
 +方针回合: ; 按我军->敌军的顺序
 +  if 敌军回合
 +    处理武将恢复 ; 敌军先减少兵数再恢复
 +  计算行动顺序 ; 优先级: 位于可回复地形 (及时空出来给友军回复) > 兵数过低 (杂兵<=20%, 武将<=40%) > 其他
 +  处理武将方针
 +
 +处理武将方针:
 +  if 方针目标已撤退
 +    方针设为进攻
 +  if 未混乱
 +    初始化权重表
 +    if 兵数过低 且 方针非禁止移动
 +      W[可回复地形] += 50 ; 倾向于去回血
 +      if 可达自家主将
 +        设置移动权重(主将位置)
 +        搜索进攻目标
 +      else
 +        搜索缺省进攻目标
 +    match 方针
 +      case 前往目标/目的地
 +        if 无目标
 +          前往目的地
 +        elif 目标方针有目的地
 +          逃向目的地 = 目标目的地 ; 不会占住目标的目的地, 防止目标卡死
 +        if 存在目标 且 移动范围内可被攻击
 +          设置范围权重(目标位置, 20)
 +          搜索进攻目标
 +        else
 +          设置范围权重(目标位置, 10)
 +          if 可达目标
 +            设置移动权重(目标位置)
 +            搜索进攻目标
 +          else
 +            搜索缺省进攻目标
 +      case 进攻
 +        搜索缺省进攻目标
 +      case 禁止移动
 +        搜索进攻目标
 +      case 防御
 +        if 移动范围内可被攻击
 +          搜索进攻目标
 +        else
 +          停在原地
 +    移动
 +    if 方针为前往/逃向目的地 且 到达目的地
 +      方针设为防御
 +    if 可进攻
 +      if 未使用策略
 +        攻击
 +      else
 +        策略
 +        if 策略为施策 ; BUGGY: 应为回归
 +          给当前军队一次重新遍历机会
 +  检查并行事件 ; 优先级: 位置 > 区域 > 单挑 > 条件 > 自由模式随机单挑
 +  检查敌军全部撤退
 +
 +搜索缺省进攻目标:
 +  if 移动范围内可被攻击
 +    搜索进攻目标
 +  elif 场上有敌军 且 可达
 +    设置移动权重(最近的敌军)
 +    搜索进攻目标
 +  else
 +    不动
 +
 +设置移动权重:
 +  if 能到达目标位置
 +    设置范围权重(目标位置, 20)
 +  else
 +    设置范围权重(最接近目标位置, 10)
 +
 +设置范围权重(目标位置, w):
 +  if w > 8 且 目标位置未设置权重 且 目标位置无其他人
 +    W[目标位置] += w
 +  if 非砲车
 +    设置范围权重(目标位置四周, w > 10 ? w - 10 : w - 1)
 +
 +搜索进攻目标:
 +  w = W[目标位置]
 +  if 目标位置无其他人 且 可进攻 
 +    w_a = 搜索攻击目标
 +    if 可用策略
 +      w_s = 搜索策略目标
 +    w += max(w_a, w_s)
 +    w += 地形权重 ; 村5, 寨6, 兵营4, 城8, 关7, BUGGY: 当前位于城门, 权重+6 [x]
 +    if 原地 且 w_a = 0 ; 防止不打人时乱跑
 +      w += 1
 +    if 困难模式 且 当前四周有友军
 +      w -= 1
 +    if 目标位置是逃向目的地
 +      w = 0
 +    W[目标位置] = w
 +    if w_max < w
 +      更新w_max, 设置进攻目标
 +
 +搜索攻击/策略目标:
 +  each 可攻击对象B
 +    if w < 计算目标攻击/策略权重(B)
 +      更新w, 设置攻击/策略目标
 +  return w
 +
 +计算目标攻击权重:
 +  if 可以秒杀
 +    w = B为象使/毒蛇使 ? 80 : 75
 +  elif 伤害 > B.最大兵数 * 0.1
 +    w = B为象使/毒蛇使 ? 20 : 16
 +  elif B.HP <= 40%
 +    w = 16
 +  elif 方针不为进攻 或 为粮草队/物资队/军乐队
 +    w = 0
 +  if 困难模式 且 B混乱
 +    w += 8
 +  if w != 0 且 B非杂兵
 +    w += B为主将 ? 10 : 6
 +  if w < 75 且 为文官
 +    return 0 ; 等价于仅在能秒杀时攻击
 +  if 为象使/毒蛇使
 +    w += 策略影响权重(周围目标, 类型=攻击)
 +  if 困难模式 且 能被攻击到
 +    w -= 1
 +  return w
 +
 +文官: 军师, 名军师, 大军师, 粮草队, 物资队, 军乐队, 幻术师
 +
 +策略影响权重:
 +  if 无目标
 +    return -4
 +  each 目标B
 +    if (类型=回复 且 B.兵数不满) 或 (类型=攻击) 或 (类型=攻击强化 且 B.攻击非↑↑)
 +      w += 10
 +    if 类型=防御强化 且 B.防御为↑↑ ; BUGGY: 逻辑写反了
 +      w += 10
 +  return w
 +
 +计算目标策略权重:
 +  if 简单模式
 +    if 策略为物见/密侦/谍报/压迫/威压/骂声/挑衅/伪情报/伪兵/牵制/对策/封策
 +      return 0
 +    if 策略为火计 且 兵种为步兵/弓兵/羌族兵
 +      return 0
 +  if 普通模式 且 策略为对策/封策
 +    return 0
 +  if 策略为火/地/水计
 +    if (策略不为火计 或 不下雨) 且 (A.智力 >= B.智力 * 0.4) (factor: 5)
 +      w = 可以秒杀 ? 80 : 20
 +  if 策略为物见/密侦/谍报 且 B.策略 != 0 且 A.智力 >= B.智力 * 0.5 (factor: 4)
 +    w = 17
 +  if 策略为压迫/威压 且 B.攻击非↓↓ 且 A.智力 >= B.智力 * 2 / 3 (factor: 3)
 +    w = 18
 +  if 策略为骂声/挑衅 且 B.防御非↓↓ 且 A.智力 >= B.智力 * 2 / 3 (factor: 3)
 +    w = 19
 +  if 策略为伪情报/伪兵/牵制/足止/封策 且 B未处于相应状态 且 B.兵数 >= 40%
 +    if 策略为伪情报/伪兵 且 A.智力 >= B.智力 * 0.5  (factor: 4)
 +      w = 22
 +    if 策略为牵制 且 B.攻击速度 > 7
 +      w = 23
 +    if 策略为封策 且 B为文官
 +      w = 24
 +    if 策略为足止
 +      w = 25
 +  if 策略为补给/大补给/全补给/援军/大援军/输送/大输送/助言/献策/施策
 +    if 策略为补给/大补给/全补给/援军/大援军/输送/大输送 且 B.兵数 <= 40%
 +      w = 策略回复权重(类型=兵数)
 +    if 策略为助言/献策/施策 且 B.策略 <= 40%
 +      w = 策略回复权重(类型=策略)
 +      if B为物资队 或 对自身使用
 +        return 0
 +  if 策略为奋起/鼓舞/坚固/强阵 且 可攻击到敌军 且 B.攻击/防御非↑↑
 +    if B.攻击/防御未弱化
 +      if 非困难模式 或 (策略为奋起/鼓舞 且 B为文官)
 +        return 0
 +      if 策略为奋起/鼓舞
 +        w = 12
 +      if 策略为坚固/强阵
 +        w = 11
 +    else
 +      if 策略为奋起/鼓舞
 +        w = 29
 +      if 策略为坚固/强阵
 +        w = 27
 +      if B.攻击/防御为↓↓
 +        w += 2
 +    if 对自己使用
 +      w -= 1
 +  if 策略为施疗
 +    if B混乱
 +      w = 32
 +    if B兵数减少
 +      w = 31
 +    if B攻速↓
 +      w = 27
 +    if B移动↓
 +      w = 26
 +  if 策略为对策 且 B未处于对策状态 且 可攻击到敌军
 +    w = 13
 +  if 策略为回归 且 B已行动完毕
 +    w = 0 ; 永不使用
 +  if 复数策略
 +    w += 策略影响权重(周围目标)
 +  if w != 0 且 B非杂兵
 +    w += B为主将 ? 10 : 6
 +  return w
 +
 +策略回复权重:
 +  if 类型=兵数
 +    if 能回满
 +      w = 32
 +    if 回复值 >= B.兵数 * 5 / 3 ; BUGGY: 计算回复值时设置上限为$\Delta$, 因此永不触发
 +      w -= 4
 +    if B.兵数 <= 20%
 +      w += 4
 +  if 类型=策略
 +    w = 28
 +    BUGGY: 此处直接进行了策略回复 (意图为获取回复的策略值, 但存在回复策略的副作用)
 +    if 能回满
 +      w = 30
 +    if 回复值 >= B.策略 * 5 / 3
 +      w -= 4
 +    if B.策略 <= 20%
 +      w += 4
 +  if 对自己使用
 +    w += 1
 +  return w
 +
 +搜索操作存在BUG: 越过判断忽略了无视ZOC的情况.
 +移动范围内可被攻击: 在处理开始时, 先算出一张敌军攻击范围图, 每个敌军对应的攻击范围存储其战场id.
 +移动范围内可被攻击即遍历自身移动范围时, 此图中对应的位置不为无效id. 此行为应当近似实现了移动范围内可攻击到敌军的效果.
 +</code>