243 lines
5.5 KiB
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
|
|
}
|