package input import ( "blazing/logic/service/fight/info" "math/rand" "time" ) // Shuffle 打乱切片顺序,使用 Fisher-Yates 洗牌算法,泛型支持任意类型 func Shuffle[T any](slice []T) { // 初始化随机数生成器,用当前时间作为种子,避免每次打乱结果相同 r := rand.New(rand.NewSource(time.Now().UnixNano())) // 从后往前遍历,逐个交换 for i := len(slice) - 1; i > 0; i-- { // 生成 0 到 i 之间的随机索引 j := r.Intn(i + 1) // 交换 i 和 j 位置的元素 slice[i], slice[j] = slice[j], slice[i] } } func (our *Input) GetAction() { next := our.Exec(func(t Effect) bool { return t.HookAction() }) if !next { return } // 获取己方当前宠物和对方当前宠物 selfPet := our.FightC.GetCurrPET(our.Player) //没血就切换精灵 if selfPet.Info.Hp <= 0 { for _, v := range our.AllPet { if v.Info.Hp > 0 { // println("AI出手,切换宠物") our.FightC.ChangePet(our.Player, v.Info.CatchTime) return } } // 如果没有可用宠物,则直接返回,不执行任何操作 return } //oppPet := opp.FightC.GetCurrPET(opp.Player) skills := selfPet.Skills // 空技能列表直接返回,避免错误 if len(skills) == 0 { return } //println("AI出手,选择技能") var usedskill *info.SkillEntity for _, s := range skills { if s == nil { continue } if !s.CanUse() { continue } // 计算技能对对方的伤害(假设CalculatePower返回伤害值,或需从技能中获取) s.DamageValue = our.CalculatePower(our.Opp, s) // 判断是否能秒杀(伤害 >= 对方当前生命值) if s.DamageValue.Cmp(our.Opp.CurrentPet.GetHP()) != -1 { // 假设oppPet.HP为对方当前剩余生命值 if usedskill != nil { if s.DamageValue.Cmp(usedskill.DamageValue) != -1 { usedskill = s } } else { usedskill = s } } } Shuffle(skills) if usedskill == nil { for _, s := range skills { if s == nil { continue } if !s.CanUse() { continue } usedskill = s } } if usedskill != nil { our.FightC.UseSkill(our.Player, uint32(usedskill.XML.ID)) } else { our.FightC.UseSkill(our.Player, 0) } }