ESS多版本 【TA】【AI】Mode:Deity

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
Mode: Deity, a completely reworked challenging AI.
模式:上帝,一个完全重构的具有挑战性的对战AI。

因为对其他东西失去了兴趣,所以打算静下心来研究AI。
这篇帖子不是教程,也不会放代码,只能算是记录我自己想法的一个地方,可能对某些人会有帮助吧。

这篇帖子不定期更新,也不用期待啥。
 

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
基础1.0——

1.创建AI类,以及各种AI的子类,不同的子类会有不同的偏好,以满足复杂的对战要求。
2.将AI分为通用性AI和针对性AI。
3.在战斗初始化时,根据是否是训练师对战,决定是否创建AI,野生精灵不创建AI,而是循环使用每一个技能。
4.在和训练师的对战开始时,根据是否由AI接管战斗,创建2个或者1个AI的实例。
5.当AI接管和训练师的对战时,创建两个AI的实例,让两个AI完全独立运行,为将来的斗蛐蛐打下基础,不再出现对面的AI更聪明的情况。
6.创建AI时,根据某些特定的参数,决定创建哪类针对性AI,如果未指定,则创建通用性AI。
7.“某些特定的参数”指的是可根据AI自身队伍的精灵或者直接指定来创建针对性AI。
8.根据AI自身队伍的精灵来创建针对性AI的判断逻辑可能会非常复杂,所以我个人还是倾向于直接指定创建哪类针对性AI,毕竟馆主战、劲敌战、联盟战等重要剧情战斗的队伍都是精心配制过的,可以更方便的指定AI,也可以为特定的队伍写特定的AI。
9.通用性AI必须足够通用,也不能干蠢事。
10.AI不先读,先读的本质是猜拳,猜拳的本质就是50/50,没什么意思,就老老实实打,对战是策略游戏,不是运气游戏,至少运气不能是占大头。
11.正常情况下AI不会读取玩家的操作,因为窥屏是作弊。
12.只有在某些极端情况下,玩家触发了窥屏机制时,AI才会读取玩家的操作,具体是哪些情况以后再详细说。
13.AI会在战斗开始时知道玩家队伍里的每一只精灵的全部数据,包括技能、携带物品、特性(以及训练家效果,如果有的话),AI不再需要通过玩家暴露才知道精灵的配置。
 
最后编辑:

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
基础1.1——

AI需要做什么?
在战斗中,每回合开始时,需要玩家对场上的精灵进行操作,和AI对战时,即让AI模仿人的方式,进行操作。

有哪些操作?
操作分为替换和使用技能,显然使用技能的判断逻辑比替换的判断逻辑要简单的多,因为替换不仅要考虑场上的精灵的情况,还需要考虑场下即将换上场的精灵的情况。

最基本的AI——
从最基础的行为开始构建AI,AI不会进行替换,AI只会选择使用技能。

使用技能——
1.和野怪一样,循环使用每一个技能(Pass,如果是这样那也没必要专门重写AI了)。
2.随机使用某一个技能(同样Pass,这和上面的一条其实没有本质区别)。
3.根据一系列检查来选择使用的技能。
 

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
基础1.2——

AI会根据一系列检查来选择使用的技能,那么需要检查哪些内容呢?
让我们从最简单的开始——
1.不考虑携带物品的影响。
2.不考虑特性的影响。
3.不考虑伤害技能的效果。
4.不考虑使用变化技能。

所以,在这个阶段,AI应该——
1.考虑每一个技能对当前对手场上的精灵造成的伤害(会考虑属性克制、技能威力、自身攻击、本系加成、能力等级、对手防御、Multiplier*)。

2.如果自身有4个攻击技能,那么此时应该得到一个Hash,Hash以每一个技能为Key,以技能造成的伤害的实数值和百分比为对应的Value,类似于hash = { :SURF => [50, 0.2] },也就是说最后会得到4个键值对的哈希。
额外判断——是否击杀,需要几击击杀。
此条能够兼容只有1个技能的情况,为了简化计算,只有一个技能时最好不再进行任何计算,而是直接使用该技能。

3.此阶段限定了AI不会换人,但是玩家会换人,所以,还需要进行额外的检查。
因为玩家会不会换人需要额外的判断逻辑,这里暂时先不考虑,目前只先考虑玩家可能会换人,所以针对所有可能的情况进行计算。
所以,还需要计算每一个技能对玩家后排的每一个精灵造成的伤害。
所以,最后应该是得到一个嵌套的哈希,类似于——
Ruby:
damage = {
  :pokemon1 => { :move1 => [50, 0.2, 5],
                 :move2 => [50, 0.2, 5],
                 :move3 => [50, 0.2, 5],
                 :move4 => [50, 0.2, 5] },
  :pokemon2 => { :move1 => [50, 0.2, 5],
                 :move2 => [50, 0.2, 5],
                 :move3 => [50, 0.2, 5],
                 :move4 => [50, 0.2, 5] },
  :pokemon3 => { :move1 => [50, 0.2, 5],
                 :move2 => [50, 0.2, 5],
                 :move3 => [50, 0.2, 5],
                 :move4 => [50, 0.2, 5] },
  :pokemon4 => { :move1 => [50, 0.2, 5],
                 :move2 => [50, 0.2, 5],
                 :move3 => [50, 0.2, 5],
                 :move4 => [50, 0.2, 5] },
  :pokemon5 => { :move1 => [50, 0.2, 5],
                 :move2 => [50, 0.2, 5],
                 :move3 => [50, 0.2, 5],
                 :move4 => [50, 0.2, 5] },
  :pokemon6 => { :move1 => [50, 0.2, 5],
                 :move2 => [50, 0.2, 5],
                 :move3 => [50, 0.2, 5],
                 :move4 => [50, 0.2, 5] }
}

4.因为此时不考虑玩家会不会换人,所以此时应该使用计算出的伤害最高的技能。

5.暂不考虑双打,双打会让事情变得更加复杂,就我目前想到的,双打还应该考虑出手顺序、伤害溢出等。
 
最后编辑:

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
基础1.3——

以上考虑了AI精灵自身技能对对方造成的伤害,那么,尽管此阶段AI不会换人,还是需要考虑对方的每一个技能对AI场上的精灵自身以及自身后排每一只精灵造成的伤害。
也就是说,不仅需要计算自身造成的伤害,也需要计算自身会受到的伤害。

未完...
 

在线成员

论坛统计

主题
474
消息
2,137
成员
2,909
最新成员
小灵喵~