订单优化
This commit is contained in:
parent
4566a4fa4b
commit
f07499aa6c
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
// 从棋子池中获取棋子
|
||||
|
||||
Loading…
Reference in New Issue
Block a user