订单优化

This commit is contained in:
hahwu 2025-09-24 19:08:23 +08:00
parent 4566a4fa4b
commit f07499aa6c
2 changed files with 151 additions and 102 deletions

View File

@ -20,17 +20,18 @@ type OrderMod struct {
LastOrder Order // 上一个订单
LastNormalOrder Order // 上一个普通订单
EimtOrder map[string]struct{}
PreheatStep map[string]int // 预热订单步骤
EmitShuffle []string // 发射器乱序
ColorShuffle []string // 棋子系列乱序
LastColor string // 上次生成订单的棋子系列
ChessPool []int // 棋子池
OrderPool map[int]*Order // 订单池
FinishOrder []int // 已完成订单
IsCharge bool // 是否充值
AutoEmit []string // 自动发射器
LastChess int // 上次生成订单的棋子
NextDiff int // 下次订单难度
PreheatStep map[string]int // 预热订单步骤
EmitShuffle []string // 发射器乱序
ColorShuffle []string // 棋子系列乱序
LastColor string // 上次生成订单的棋子系列
ChessPool []int // 棋子池
ChessPool2 map[string][]int // 按系列分类的棋子池
OrderPool map[int]*Order // 订单池
FinishOrder []int // 已完成订单
IsCharge bool // 是否充值
AutoEmit []string // 自动发射器
LastChess int // 上次生成订单的棋子
NextDiff int // 下次订单难度
ComfortEndTime int
}
@ -94,6 +95,9 @@ func (o *OrderMod) InitData() {
delete(o.OrderList, k)
}
}
if o.ChessPool2 == nil {
o.ChessPool2 = make(map[string][]int)
}
if o.Auto_id == 0 {
o.Auto_id = 10000
}

View File

@ -1,12 +1,12 @@
package order
import (
"log"
"math"
"server/GoUtil"
mergeDataCfg "server/conf/mergeData"
orderCfg "server/conf/order"
userCfg "server/conf/user"
"sort"
)
var reflectChess = map[int]int{} // 棋子难度映射表
@ -16,63 +16,63 @@ var orderCfgMap = map[int]orderConfig{
Min: 15,
Max: 150,
Pool: map[int]orderConfigInfo{
1: {lv: 5, energy: 16, t: 1},
2: {lv: 6, energy: 32, t: 1},
3: {lv: 7, energy: 64, t: 1},
4: {lv: 8, energy: 128, t: 1},
1: {lv: 5, energy: 16, t: 0},
2: {lv: 6, energy: 32, t: 0},
3: {lv: 7, energy: 64, t: 0},
4: {lv: 8, energy: 128, t: 0},
},
},
2: {
Min: 20,
Max: 300,
Pool: map[int]orderConfigInfo{
2: {lv: 6, energy: 32, t: 1},
3: {lv: 7, energy: 64, t: 1},
4: {lv: 8, energy: 128, t: 1},
2: {lv: 6, energy: 32, t: 0},
3: {lv: 7, energy: 64, t: 0},
4: {lv: 8, energy: 128, t: 0},
},
},
3: {
Min: 40,
Max: 400,
Pool: map[int]orderConfigInfo{
1: {lv: 5, energy: 16, t: 1},
2: {lv: 6, energy: 32, t: 1},
3: {lv: 7, energy: 64, t: 1},
4: {lv: 8, energy: 128, t: 1},
5: {lv: 9, energy: 256, t: 1},
1: {lv: 5, energy: 16, t: 0},
2: {lv: 6, energy: 32, t: 0},
3: {lv: 7, energy: 64, t: 0},
4: {lv: 8, energy: 128, t: 0},
5: {lv: 9, energy: 256, t: 0},
},
},
4: {
Min: 40,
Max: 200,
Pool: map[int]orderConfigInfo{
1: {lv: 5, energy: 16, t: 0},
2: {lv: 6, energy: 32, t: 0},
3: {lv: 7, energy: 64, t: 1},
4: {lv: 8, energy: 128, t: 1},
1: {lv: 5, energy: 16, t: 1},
2: {lv: 6, energy: 32, t: 1},
3: {lv: 7, energy: 64, t: 0},
4: {lv: 8, energy: 128, t: 0},
},
},
5: {
Min: 100,
Max: 600,
Pool: map[int]orderConfigInfo{
1: {lv: 6, energy: 32, t: 0},
2: {lv: 7, energy: 64, t: 0},
3: {lv: 8, energy: 128, t: 1},
4: {lv: 9, energy: 256, t: 1},
5: {lv: 10, energy: 512, t: 1},
1: {lv: 6, energy: 32, t: 1},
2: {lv: 7, energy: 64, t: 1},
3: {lv: 8, energy: 128, t: 0},
4: {lv: 9, energy: 256, t: 0},
5: {lv: 10, energy: 512, t: 0},
},
},
6: {
Min: 500,
Max: 1200,
Pool: map[int]orderConfigInfo{
1: {lv: 6, energy: 32, t: 0},
2: {lv: 7, energy: 64, t: 0},
3: {lv: 8, energy: 128, t: 1},
4: {lv: 9, energy: 256, t: 1},
5: {lv: 10, energy: 512, t: 1},
6: {lv: 11, energy: 1024, t: 1},
1: {lv: 6, energy: 32, t: 1},
2: {lv: 7, energy: 64, t: 1},
3: {lv: 8, energy: 128, t: 0},
4: {lv: 9, energy: 256, t: 0},
5: {lv: 10, energy: 512, t: 0},
6: {lv: 11, energy: 1024, t: 0},
},
},
}
@ -686,25 +686,28 @@ func GetChessByDiff(EmitId, EnergyMul, Diff int, Color string) []int {
}
return GoUtil.UniqueInts(ChessIds)
}
func getChessLvFromConfig1(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (int, bool) {
func (o *OrderMod) getChessLvFromConfig1(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) []int {
rand := []int{}
t := 0
if LastEnergy > 0 {
t = 1
}
for _, v := range orderCfgMap {
if MinEnergy >= v.Min && MaxEnergy <= v.Max {
for _, info := range v.Pool {
if MinLv <= info.lv && MaxLv >= info.lv && LastEnergy+info.energy <= MaxEnergy && LastEnergy+info.energy >= MinEnergy && info.t == 1 {
if MinLv <= info.lv && MaxLv >= info.lv && LastEnergy+info.energy <= MaxEnergy && LastEnergy+info.energy >= MinEnergy && t >= info.t {
rand = append(rand, info.lv)
}
}
if len(rand) > 0 {
return GoUtil.RandSlice(rand), true
}
return 6, false
}
}
return 6, false
if len(rand) == 0 {
return rand
}
return rand
}
func getChessLvFromConfig2(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (int, bool) {
func (o *OrderMod) getChessLvFromConfig2(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) []int {
rand := []int{}
for _, v := range orderCfgMap {
if MinEnergy >= v.Min && MaxEnergy <= v.Max {
@ -713,15 +716,12 @@ func getChessLvFromConfig2(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (
rand = append(rand, info.lv)
}
}
if len(rand) > 0 {
return GoUtil.RandSlice(rand), true
}
return 0, false
}
}
return 0, false
return rand
}
func getChessLvFromConfig3(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (int, bool) {
func (o *OrderMod) getChessLvFromConfig3(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) []int {
rand := []int{}
for _, v := range orderCfgMap {
if MinEnergy >= v.Min && MaxEnergy <= v.Max {
@ -730,65 +730,110 @@ func getChessLvFromConfig3(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (
rand = append(rand, info.lv)
}
}
if len(rand) > 0 {
return GoUtil.RandSlice(rand), true
}
return 0, false
}
}
return 0, false
return rand
}
func (o *OrderMod) ChessPoolChess(Color string, Lv int) bool {
for _, v := range o.ChessPool2[Color] {
if v > Lv {
return true
}
}
return false
}
func (o *OrderMod) getFromPool(Emit int, Color string, Lv int) {
for i, v := range o.ChessPool2[Color] {
if v == Lv {
o.ChessPool2[Color] = append(o.ChessPool2[Color][:i], o.ChessPool2[Color][i+1:]...)
return
}
}
for i, v := range o.ChessPool {
if v > Lv {
o.ChessPool2[Color] = append(o.ChessPool2[Color][:i], o.ChessPool2[Color][i+1:]...)
for k := Lv; k < v; k++ {
o.ChessPool2[Color] = append(o.ChessPool2[Color], k)
}
return
}
}
Product := mergeDataCfg.GetEmitProduceType(Emit)
if len(Product) < 2 {
return
}
for _, v := range Product {
if Color == v {
continue
}
o.ChessPool2[Color] = append(o.ChessPool2[Color], Lv)
}
}
func (o *OrderMod) getChessIdPool(Emit []int, Color string, EnergyMul, Lv, MinEnergy, MaxEnergy, OrderDiff, LastEnergy int) (int, int) {
ChessLv := 0
EmitChessId := getEmitBySeries(Emit, Color)
ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge)
ChessLvRand := o.getChessLvFromConfig1(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy)
Pool := o.ChessPool2[Color]
ChessLvRand2 := make([]int, 0)
for _, v := range ChessLvRand {
if GoUtil.InArray(v, Pool) {
ChessLvRand2 = append(ChessLvRand2, v)
}
}
if len(ChessLvRand2) > 0 {
ChessLv = GoUtil.RandSlice(ChessLvRand2)
}
sort.Ints(ChessLvRand)
if len(ChessLvRand) > 0 && len(ChessLvRand2) == 0 && o.ChessPoolChess(Color, ChessLvRand[len(ChessLvRand)-1]) {
ChessLv = ChessLvRand[len(ChessLvRand)-1]
}
if len(ChessLvRand) > 0 && len(ChessLvRand2) == 0 && !o.ChessPoolChess(Color, ChessLvRand[len(ChessLvRand)-1]) && len(ChessLvRand) > 0 {
ChessLv = GoUtil.RandSlice(ChessLvRand)
}
if ChessLv == 0 {
ChessLv = 6
o.NextDiff = OrderDiff
}
o.getFromPool(EmitChessId, Color, ChessLv)
NewLev := mergeDataCfg.DynamicLev(ChessLv, EmitChessId, Color)
MaxLev := mergeDataCfg.GetMaxLvByColor(Color)
NewLev1 := adjustLev(NewLev, EnergyMul)
NewLev2 := min(NewLev1, MaxLev)
Chess := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, Color)
if Chess == 0 {
Chess = mergeDataCfg.GetChessIdByLvAndColor(6, Color)
}
return Chess, ChessLv
}
func getChessFromPoolByEnergy(o *OrderMod, MinEnergy, MaxEnergy, ChessNum int, Emit []int, EnergyMul, OrderDiff int) []int {
ColorArr := make([]string, 0)
for i := 0; i < ChessNum; i++ {
ColorArr = append(ColorArr, getEmitSeries(o, Emit))
}
Break := 0
for {
LastEnergy := 0
ChessArr := make([]int, 0)
for k, Color := range ColorArr {
EmitChessId := getEmitBySeries(Emit, Color)
ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge)
ChessLv := 0
ok := false
if len(ColorArr) == 1 {
ChessLv, ok = getChessLvFromConfig1(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy)
} else {
if k == 0 {
ChessLv, ok = getChessLvFromConfig2(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy)
} else {
ChessLv, ok = getChessLvFromConfig3(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy)
}
}
LastEnergy += int(math.Pow(2, float64(ChessLv-1)))
if !ok && k == 0 && len(ColorArr) == 1 {
o.NextDiff = OrderDiff
}
NewLev := mergeDataCfg.DynamicLev(ChessLv, EmitChessId, Color)
MaxLev := mergeDataCfg.GetMaxLvByColor(Color)
NewLev1 := adjustLev(NewLev, EnergyMul)
NewLev2 := min(NewLev1, MaxLev)
Chess := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, Color)
if Chess == 0 {
break
}
ChessArr = append(ChessArr, Chess)
}
if GoUtil.InArray(0, ChessArr) {
continue
}
if Break++; Break > 1000 {
return ChessArr
}
if LastEnergy < MinEnergy || LastEnergy > MaxEnergy {
continue
}
if len(ChessArr) > 0 {
log.Printf("订单棋子能量:%d,范围:%d-%d,棋子:%v", LastEnergy, MinEnergy, MaxEnergy, ChessArr)
return ChessArr
ChessArr := make([]int, 0)
if len(ColorArr) == 1 {
Chess, _ := o.getChessIdPool(Emit, ColorArr[0], EnergyMul, 0, MinEnergy, MaxEnergy, OrderDiff, 0)
if Chess == 0 {
Chess = mergeDataCfg.GetChessIdByLvAndColor(6, ColorArr[0])
}
return []int{Chess}
}
if len(ColorArr) == 2 {
Chess1, Chess1Lv := o.getChessIdPool(Emit, ColorArr[0], EnergyMul, 0, MinEnergy, MaxEnergy, OrderDiff, 0)
if Chess1 == 0 {
Chess1 = mergeDataCfg.GetChessIdByLvAndColor(6, ColorArr[0])
}
Energy := int(math.Pow(2, float64(Chess1Lv-1)))
Chess2, _ := o.getChessIdPool(Emit, ColorArr[1], EnergyMul, 0, MinEnergy, MaxEnergy, OrderDiff, Energy)
return []int{Chess1, Chess2}
}
return ChessArr
}
// 从棋子池中获取棋子