266 lines
6.9 KiB
Go
266 lines
6.9 KiB
Go
package caishen
|
||
|
||
import (
|
||
"fmt"
|
||
"math/rand"
|
||
"time"
|
||
)
|
||
|
||
var SpinID int64 = 100000 // todo
|
||
|
||
type LineData struct {
|
||
Index int
|
||
Element int
|
||
Count int
|
||
Score int
|
||
Position []int32
|
||
}
|
||
|
||
//图案*3+连线数量=赔率索引,返回元素值和数量
|
||
func isLine(data []int) (e int, count int) {
|
||
e = data[0]
|
||
count = 1
|
||
for i := 1; i < len(data); i++ {
|
||
if data[i] == e {
|
||
count++
|
||
} else {
|
||
break
|
||
}
|
||
}
|
||
if count < 3 {
|
||
return -1, -1
|
||
}
|
||
return
|
||
}
|
||
func CalcLine(data []int, betLines []int64) (lines []LineData) {
|
||
var cards = make([]int, len(data))
|
||
for i, v := range data {
|
||
cards[i] = v
|
||
}
|
||
for i := 10; i < 15; i++ {
|
||
if cards[i] == Element_WILD || cards[i-5] == Element_WILD || cards[i-10] == Element_WILD {
|
||
cards[i] = Element_WILD
|
||
cards[i-5] = Element_WILD
|
||
cards[i-10] = Element_WILD
|
||
}
|
||
}
|
||
for _, lineNum := range betLines {
|
||
index := int(lineNum)
|
||
lineTemplate := AllLineArray[index-1]
|
||
edata := []int{}
|
||
normalData := []int{}
|
||
realData := []int{}
|
||
epos := []int32{}
|
||
if cards[lineTemplate[0]] == Element_SCATTER || cards[lineTemplate[0]] == Element_BONUS {
|
||
continue
|
||
}
|
||
for _, pos := range lineTemplate {
|
||
edata = append(edata, cards[pos])
|
||
if cards[pos] != Element_WILD {
|
||
normalData = append(normalData, cards[pos])
|
||
}
|
||
realData = append(realData, data[pos])
|
||
epos = append(epos, int32(pos+1))
|
||
}
|
||
|
||
if len(edata) == len(normalData) {
|
||
head, count := isLine(edata)
|
||
if head >= 0 {
|
||
lines = append(lines, LineData{index, head, count, LineScore[head][count-1], epos[:count]})
|
||
}
|
||
} else {
|
||
normalData = DelSliceRepEle(normalData)
|
||
for _, value := range normalData {
|
||
replaceData := []int{}
|
||
for i := 0; i < len(edata); i++ {
|
||
if realData[0] == Element_JACKPOT { // WILD 不能替换 JACKPOT
|
||
replaceData = append(replaceData, realData[i])
|
||
} else {
|
||
if edata[i] == Element_WILD {
|
||
replaceData = append(replaceData, value)
|
||
} else {
|
||
replaceData = append(replaceData, edata[i])
|
||
}
|
||
}
|
||
}
|
||
head, count := isLine(replaceData)
|
||
if head >= 0 {
|
||
lines = append(lines, LineData{index, head, count, LineScore[head][count-1], epos[:count]})
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
//去除切片在的重复的元素
|
||
func DelSliceRepEle(data []int) (res []int) {
|
||
if len(data) == 1 {
|
||
return data
|
||
}
|
||
eleFlag := make(map[int]bool)
|
||
for i := 0; i < len(data)-1; i++ {
|
||
if eleFlag[data[i]] {
|
||
continue
|
||
}
|
||
eleFlag[data[i]] = true
|
||
res = append(res, data[i])
|
||
}
|
||
return res
|
||
}
|
||
|
||
type CaclResult struct {
|
||
WinLines [][]LineData //多次中奖的线
|
||
IsJackpot bool //是否爆奖
|
||
AllScore int //总中奖倍率
|
||
BonusScore int //小游戏奖励
|
||
SpinFreeTimes int //免费旋转次数
|
||
}
|
||
|
||
func CaclScore(cards []int, betLines []int64) (int32, int32, int32, int32, bool) {
|
||
curscore := 0
|
||
alllinenum := 0 //中奖线路总数
|
||
allscore := 0
|
||
spinFree := 0
|
||
isJackpot := false
|
||
lines := CalcLine(cards, betLines)
|
||
for _, line := range lines {
|
||
if line.Element == Element_SCATTER {
|
||
spinFree += FreeSpinTimesRate[line.Count]
|
||
continue
|
||
}
|
||
if line.Element == Element_JACKPOT && line.Count == LINE_CELL {
|
||
isJackpot = true
|
||
}
|
||
curscore = LineScore[line.Element][line.Count-1]
|
||
line.Score = curscore
|
||
allscore = allscore + curscore
|
||
alllinenum++
|
||
}
|
||
bounsCount := 0
|
||
for _, card := range cards {
|
||
if card == Element_BONUS {
|
||
bounsCount++
|
||
}
|
||
if card == Element_JACKPOT {
|
||
spinFree++
|
||
}
|
||
}
|
||
rand.Seed(time.Now().UnixNano())
|
||
//bounsScore:= SmallGameByBouns[bounsCount][0]+rand.Intn(SmallGameByBouns[bounsCount][1])
|
||
spinFreeTimes := FreeSpinTimesRate[spinFree]
|
||
return int32(alllinenum), int32(allscore), int32(0), int32(spinFreeTimes), isJackpot
|
||
}
|
||
|
||
func PrintHuman(data []int) {
|
||
var l = len(data)
|
||
if l != ELEMENT_TOTAL {
|
||
return
|
||
}
|
||
for r := 0; r < LINE_ROW; r++ {
|
||
for c := 0; c < LINE_CELL; c++ {
|
||
fmt.Printf("%5s", Element_NAME_MAP[data[r*LINE_CELL+c]])
|
||
}
|
||
fmt.Println()
|
||
}
|
||
}
|
||
|
||
//prizeFund > limit * roomId走这个检查
|
||
func CheckBigWin(slotsData []int) bool {
|
||
if slotsData[0] == Element_WILD || slotsData[5] == Element_WILD || slotsData[10] == Element_WILD || slotsData[4] == Element_WILD || slotsData[9] == Element_WILD || slotsData[14] == Element_WILD {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
//prizeFund < limit * roomId走这个更严格的检查
|
||
func CheckSuperWin(slotsData []int) bool {
|
||
if slotsData[0] == Element_WILD || slotsData[5] == Element_WILD || slotsData[10] == Element_WILD || slotsData[4] == Element_WILD || slotsData[9] == Element_WILD || slotsData[14] == Element_WILD {
|
||
return true
|
||
}
|
||
if (slotsData[1] == Element_WILD || slotsData[6] == Element_WILD || slotsData[11] == Element_WILD) && (slotsData[2] == Element_WILD || slotsData[7] == Element_WILD || slotsData[12] == Element_WILD) {
|
||
return true
|
||
}
|
||
if (slotsData[2] == Element_WILD || slotsData[7] == Element_WILD || slotsData[12] == Element_WILD) && (slotsData[3] == Element_WILD || slotsData[8] == Element_WILD || slotsData[13] == Element_WILD) {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
type Symbol int
|
||
|
||
const (
|
||
SYMBOL1 Symbol = iota + 1
|
||
SYMBOL2
|
||
)
|
||
|
||
func GenerateSlotsData_v2(s Symbol) ([]int, int) {
|
||
var tryCount = 0
|
||
Next:
|
||
gSeedV++
|
||
rand.Seed(gSeedV)
|
||
var slotsData = make([]int, 0, ELEMENT_TOTAL)
|
||
for i := 0; i < ELEMENT_TOTAL; i++ {
|
||
if s == SYMBOL1 {
|
||
if i == 0 || i == 5 || i == 10 {
|
||
slotsData = append(slotsData, symbol1[rand.Intn(len(symbol1)-3)+3])
|
||
} else {
|
||
slotsData = append(slotsData, symbol1[rand.Intn(len(symbol1))])
|
||
}
|
||
} else if s == SYMBOL2 {
|
||
if i == 0 || i == 5 || i == 10 {
|
||
slotsData = append(slotsData, symbol2[rand.Intn(len(symbol2)-5)+5])
|
||
} else {
|
||
slotsData = append(slotsData, symbol2[rand.Intn(len(symbol2))])
|
||
}
|
||
}
|
||
}
|
||
tryCount++
|
||
if (s == SYMBOL1 && CheckSuperWin(slotsData)) || (s == SYMBOL2 && CheckBigWin(slotsData)) {
|
||
goto Next
|
||
}
|
||
return slotsData, tryCount
|
||
}
|
||
|
||
type BonusGameResult struct {
|
||
BonusData []int64 //每次点击的显示奖金,有几个就点击几次,最后一次点击是0
|
||
DataMultiplier int64 //第一级界面小游戏奖金总和
|
||
Mutiplier int //最终小游戏的倍率
|
||
TotalPrizeValue int64 //最终小游戏的奖励
|
||
}
|
||
|
||
var gSeedV = time.Now().UnixNano()
|
||
|
||
func GenerateBonusGame(totalBet int, startBonus int) BonusGameResult {
|
||
if totalBet <= 0 || startBonus <= 0 {
|
||
return BonusGameResult{
|
||
BonusData: nil,
|
||
DataMultiplier: 0,
|
||
Mutiplier: 0,
|
||
TotalPrizeValue: 0,
|
||
}
|
||
}
|
||
var bg = BonusGameResult{
|
||
BonusData: make([]int64, 0),
|
||
DataMultiplier: 0,
|
||
Mutiplier: 0,
|
||
TotalPrizeValue: int64(0),
|
||
}
|
||
gSeedV++
|
||
rand.Seed(gSeedV)
|
||
for _, e := range BonusStepArr {
|
||
rnd := rand.Intn(len(e))
|
||
prizeValue := int64(e[rnd]*float64(totalBet) + 0.00001)
|
||
bg.TotalPrizeValue += prizeValue
|
||
bg.DataMultiplier += prizeValue
|
||
bg.BonusData = append(bg.BonusData, prizeValue)
|
||
if prizeValue == 0 {
|
||
break
|
||
}
|
||
}
|
||
bg.Mutiplier = startBonus + rand.Intn(3)
|
||
bg.TotalPrizeValue *= int64(bg.Mutiplier)
|
||
return bg
|
||
}
|