game_sync/gamerule/fortunezhishen/fortunezhishenAlgorithm.go

243 lines
5.5 KiB
Go

package fortunezhishen
import (
"math/rand"
)
func (wls *WinResult) Init(gameState int) {
wls.Cards = make([]int32, 15)
wls.WinLine = nil
wls.MakeAFortuneNum = 0
wls.GemstoneNum = 0
wls.NewAddGemstone = 0
if wls.GemstoneRate == nil || (gameState != StopAndRotate && gameState != StopAndRotate2) {
wls.MidIcon = -1
wls.GemstoneRate = make([]int64, 15)
wls.LastRes = nil
}
}
func (wls *WinResult) CreateLine(gameState int, eleLineAppearRate []int32) {
wls.Init(gameState)
//生成元素
wls.result(gameState, eleLineAppearRate)
}
func (wls *WinResult) Win(betIdx int, gameState int) {
if gameState == StopAndRotate || gameState == StopAndRotate2 {
wls.copyRes()
}
if gameState != StopAndRotate && gameState != StopAndRotate2 {
//生成输赢结果
wls.getWinLine()
}
//查询宝石
wls.initData(betIdx)
}
func (wls *WinResult) copyRes() {
if len(wls.LastRes) > 0 {
for k, v := range wls.LastRes {
if v == Gemstone {
wls.Cards[k] = v
}
}
}
}
func (wls *WinResult) initData(betIdx int) {
var mid = []int{1, 2, 3, 6, 7, 8, 11, 12, 13}
if wls.MidIcon == Gemstone {
rate := wls.GetGemstoneRate(betIdx, true)
for _, id := range mid {
if wls.GemstoneRate[id] == 0 {
wls.GemstoneRate[id] = rate
} else {
break
}
}
}
for k, v := range wls.Cards {
if v == Gemstone {
wls.GemstoneNum++
if wls.GemstoneRate[k] == 0 {
wls.NewAddGemstone++
wls.GemstoneRate[k] = wls.GetGemstoneRate(betIdx, false)
}
} else if v == MakeAFortune {
wls.MakeAFortuneNum++
}
}
}
//根据概率 获取宝石倍数
func (wls *WinResult) GetGemstoneRate(betIdx int, big bool) int64 {
grandPrize, bigPrize := true, true
if betIdx == 0 || betIdx == 1 || betIdx == 3 {
bigPrize = false
}
if betIdx == 0 || betIdx == 1 || betIdx == 2 || betIdx == 3 {
grandPrize = false
}
nowGemstoneRatePrize := make([]int, len(SmallGemstoneRatePrize))
if !big {
copy(nowGemstoneRatePrize, SmallGemstoneRatePrize)
} else {
copy(nowGemstoneRatePrize, BigGemstoneRatePrize)
bigPrize = true
}
if !grandPrize {
nowGemstoneRatePrize[0] = 0
}
if !bigPrize {
nowGemstoneRatePrize[1] = 0
}
r := randSliceIndexByWightN(nowGemstoneRatePrize)
rate := rand.Int63n(4)
switch r {
case Bet1_4:
rate += 1
case Bet5_8:
rate += 5
case Bet9_12:
rate += 9
case Bet13_16:
rate += 13
case Bet17_19:
rate = rand.Int63n(3) + 17
case BetGrandPrize:
rate = GrandPrize
case BetBigPrize:
rate = BigPrize
case BetMidPrize:
rate = MidPrize
case BetSmallPrize:
rate = SmallPrize
}
return rate
}
//获取元素值
func (wls *WinResult) result(gameState int, eleLineAppearRate []int32) {
var LineRate []int32 //正常元素概率(小宝石) 或者 正常元素概率2(大宝石)
var noWild []int32 //财神元素概率为0(第一列使用)
eleLen := len(eleLineAppearRate)
if gameState == Normal || gameState == StopAndRotate {
LineRate = make([]int32, eleLen-1)
copy(LineRate, eleLineAppearRate[:eleLen-1])
} else {
LineRate = make([]int32, eleLen-2)
copy(LineRate, eleLineAppearRate[:eleLen-2])
LineRate = append(LineRate, eleLineAppearRate[eleLen-1])
}
//财神元素概率为0
noWild = make([]int32, eleLen-1)
copy(noWild, LineRate)
noWild[Wild] = 0
//没有发财
noMakeAFortune := make([]int32, len(LineRate))
copy(noMakeAFortune, LineRate)
noMakeAFortune[MakeAFortune] = 0
//fmt.Println("元素概率 ", LineRate)
//fmt.Println("财神元素概率为0 ", noWild)
n := 0
var haveMakeAFortune = make([]int, 5)
for i := 0; i < Column; i++ {
for j := 0; j < Row; j++ {
if haveMakeAFortune[j] == 0 {
if j == 0 {
wls.Cards[n] = RandSliceInt32IndexByWightN(noWild)
} else {
wls.Cards[n] = RandSliceInt32IndexByWightN(LineRate)
}
if wls.Cards[n] == MakeAFortune {
haveMakeAFortune[j] = 1
}
} else {
if j == 0 {
wls.Cards[n] = RandSliceInt32IndexByWightN(noWild)
} else {
wls.Cards[n] = RandSliceInt32IndexByWightN(noMakeAFortune)
}
}
n++
}
}
if gameState == FreeGame {
r := RandSliceInt32IndexByWightN(LineRate)
wls.MidIcon = r
var mid = []int{1, 2, 3, 6, 7, 8, 11, 12, 13}
for _, key := range mid {
wls.Cards[key] = wls.MidIcon
}
}
}
//获取结果
func (wls *WinResult) getWinLine() {
n := 0
var flag int32 = -1
for k, cols := range LineWinNum {
flag = wls.Cards[cols[0]]
//宝石 发财不参与线数
if flag == Gemstone || flag == MakeAFortune {
continue
}
var line []int32
var pos []int32
for _, key := range cols {
if flag == wls.Cards[key] || (Wild == wls.Cards[key] && k != 0) {
n++
line = append(line, wls.Cards[key])
pos = append(pos, int32(key))
} else {
if n >= 3 || (flag == Firecrackers && n >= 2) {
wls.WinLine = append(wls.WinLine, WinLine{
Lines: line,
Poss: pos,
LineId: k + 1,
Rate: GetRate(flag, len(line)),
})
}
n = 0
pos = nil
line = nil
break
}
if n == 5 {
wls.WinLine = append(wls.WinLine, WinLine{
Lines: line,
Poss: pos,
LineId: k + 1,
Rate: GetRate(flag, len(line)),
})
n = 0
pos = nil
line = nil
}
}
}
//test code
//if len(wls.WinLine) > 0 {
// for k, v := range wls.WinLine {
// fmt.Println("=============")
// fmt.Print(k, " ")
// PrintWin(v.Lines)
// fmt.Println(k, "位置 ", v.Poss, " 中奖线号:", v.LineId)
// }
// fmt.Println("=============")
//}
}
func GetRate(ele int32, num int) int64 {
if data, ok := EleNumRate[ele]; ok {
if r, ok2 := data[num]; ok2 {
return r
}
}
return 0
}