package fight import ( "go_dreamfactory/modules/battle/fight/core" "math/rand" "sort" ) type FightRoleSlice []core.IFightRole func (x FightRoleSlice) Len() int { return len(x) } func (x FightRoleSlice) Less(i, j int) bool { return x[i].GetData().Operate.Value() < x[j].GetData().Operate.Value() } func (x FightRoleSlice) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x FightRoleSlice) Sort(pType string) { sort.Sort(x) } 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) highPart = FightRoleSort(highPart, pType) lowPart = append(lowPart, middlePart...) lowPart = append(lowPart, highPart...) return lowPart }