package fight import ( "go_dreamfactory/modules/battle/fight/core" "math/rand" ) //战斗角色排序 func FightRoleSort(arr []core.IFightRole, pType string, pOrder core.EOrderType) []core.IFightRole { if len(arr) <= 1 { return arr } pivot := arr[rand.Intn(len(arr))] lowPart := make([]core.IFightRole, 0, len(arr)) highPart := make([]core.IFightRole, 0, len(arr)) middlePart := make([]core.IFightRole, 0, len(arr)) for _, v := range arr { switch pType { case "OperateValue": switch { case v.GetData().Operate.Value() < pivot.GetData().Operate.Value(): if pOrder == core.EOrderType_Asc { lowPart = append(lowPart, v) } else { highPart = append(highPart, v) } break case v.GetData().Operate.Value() == pivot.GetData().Operate.Value(): middlePart = append(middlePart, v) break case v.GetData().Operate.Value() > pivot.GetData().Operate.Value(): if pOrder == core.EOrderType_Asc { highPart = append(highPart, v) } else { lowPart = append(lowPart, v) } break } break case "Speed": switch { case v.GetData().Speed.Value() < pivot.GetData().Speed.Value(): if pOrder == core.EOrderType_Asc { lowPart = append(lowPart, v) } else { highPart = append(highPart, v) } break case v.GetData().Speed.Value() == pivot.GetData().Speed.Value(): middlePart = append(middlePart, v) break case v.GetData().Speed.Value() > pivot.GetData().Speed.Value(): if pOrder == core.EOrderType_Asc { highPart = append(highPart, v) } else { lowPart = append(lowPart, v) } break } break } } lowPart = FightRoleSort(lowPart, pType, pOrder) highPart = FightRoleSort(highPart, pType, pOrder) lowPart = append(lowPart, middlePart...) lowPart = append(lowPart, highPart...) return lowPart }