194 lines
4.5 KiB
Go
194 lines
4.5 KiB
Go
package tamquoc
|
||
|
||
import (
|
||
"fmt"
|
||
"math/rand"
|
||
"time"
|
||
)
|
||
|
||
var SpinID int64 = 100000 // todo
|
||
|
||
// 小游戏点击次数(起始次数)
|
||
var bonusGameNum = 10
|
||
|
||
type LineData struct {
|
||
Index int
|
||
Element int
|
||
Count int
|
||
Score int
|
||
Position []int32
|
||
FreeElementCnt int // 免费元素个数
|
||
BonusElementCnt int // Bonus元素个数
|
||
}
|
||
|
||
//图案*3+连线数量=赔率索引,返回元素值和数量
|
||
func isLine(data []int) (e int, count int) {
|
||
tempData := make([]int, LINE_CELL)
|
||
copy(tempData, data)
|
||
dataMap := make(map[int]int, LINE_CELL)
|
||
|
||
for _, v := range tempData {
|
||
if _, ok := dataMap[v]; !ok {
|
||
dataMap[v] = 1
|
||
} else {
|
||
dataMap[v]++
|
||
}
|
||
}
|
||
for _, v := range tempData {
|
||
if dataMap[v] >= 3 {
|
||
if dataMap[v] == 3 && v == Element_VUKHI { // 跨服3线不计算
|
||
continue
|
||
}
|
||
return v, dataMap[v]
|
||
}
|
||
}
|
||
return -1, -1
|
||
}
|
||
|
||
func CalcLine(data []int, betLines []int64) (lines []LineData) {
|
||
for _, lineNum := range betLines {
|
||
index := int(lineNum)
|
||
lineTemplate := AllLineArray[index-1]
|
||
edata := []int{}
|
||
epos := []int32{}
|
||
for _, pos := range lineTemplate {
|
||
edata = append(edata, data[pos])
|
||
}
|
||
if len(edata) == LINE_CELL {
|
||
head, count := isLine(edata)
|
||
for _, pos := range lineTemplate {
|
||
if data[pos] == head {
|
||
epos = append(epos, int32(pos+1))
|
||
}
|
||
}
|
||
if head >= 0 && count >= 3 && len(epos) == count {
|
||
var freeElementCnt, bonusElementCnt int // 免费元素个数/Bonus元素个数
|
||
if head == Element_FREESPIN {
|
||
freeElementCnt = count
|
||
}
|
||
if head == Element_BONUS && count >= 3 {
|
||
bonusElementCnt = count
|
||
}
|
||
lines = append(lines, LineData{index, head, count, LineScore[head][count-1], epos, freeElementCnt, bonusElementCnt})
|
||
}
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
type CaclResult struct {
|
||
WinLines [][]LineData //多次中奖的线
|
||
IsJackpot bool //是否爆奖
|
||
AllScore int //总中奖倍率
|
||
BonusScore int //小游戏奖励
|
||
SpinFreeTimes int //免费旋转次数
|
||
}
|
||
|
||
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()
|
||
}
|
||
}
|
||
|
||
type Symbol int
|
||
|
||
const (
|
||
SYMBOL1 Symbol = iota + 1
|
||
SYMBOL2
|
||
)
|
||
const (
|
||
DEFALUTROOMMODEL int = iota
|
||
ROOMMODE1
|
||
ROOMMODE2
|
||
ROOMMODE3
|
||
)
|
||
|
||
func GenerateSlotsData_v2(s Symbol) []int {
|
||
gSeedV++
|
||
rand.Seed(gSeedV)
|
||
var slotsData = make([]int, 0, ELEMENT_TOTAL)
|
||
for i := 0; i < ELEMENT_TOTAL; i++ {
|
||
if s == SYMBOL1 {
|
||
slotsData = append(slotsData, symbol1[rand.Intn(len(symbol1))])
|
||
} else if s == SYMBOL2 {
|
||
slotsData = append(slotsData, symbol2[rand.Intn(len(symbol2))])
|
||
}
|
||
}
|
||
return slotsData
|
||
}
|
||
func GenerateSlotsData_v3(roomMode int) []int {
|
||
gSeedV++
|
||
rand.Seed(gSeedV)
|
||
var slotsData = make([]int, 0)
|
||
switch roomMode {
|
||
case ROOMMODE1:
|
||
slotsData = roomMode1[rand.Intn(len(roomMode1))]
|
||
case ROOMMODE2:
|
||
slotsData = roomMode2[rand.Intn(len(roomMode2))]
|
||
case ROOMMODE3:
|
||
slotsData = roomMode3[rand.Intn(len(roomMode3))]
|
||
case DEFALUTROOMMODEL:
|
||
slotsData = defaultRoomModel[rand.Intn(len(defaultRoomModel))]
|
||
}
|
||
return slotsData
|
||
}
|
||
|
||
type BonusGameResult struct {
|
||
BonusData []int64 //每次点击的显示奖金,有几个就点击几次,最后一次点击是0
|
||
DataMultiplier int64 //第一级界面小游戏总和
|
||
Mutiplier int //最终小游戏的倍率
|
||
TotalPrizeValue int64 //最终小游戏的奖励
|
||
}
|
||
|
||
var gSeedV = time.Now().UnixNano()
|
||
|
||
func GenerateBonusGame(betValue int, startBonus int) BonusGameResult {
|
||
if betValue <= 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 i := 0; i < bonusGameNum; i++ {
|
||
var rate int
|
||
rate = bonusNormalRate[rand.Intn(len(bonusNormalRate))]
|
||
if rate == -1 {
|
||
i--
|
||
}
|
||
switch rate {
|
||
case -1: // 未中奖(客户端显示图片)
|
||
rate = 0
|
||
case 1: // 中高倍率
|
||
rate = bonusHighRate[rand.Intn(len(bonusHighRate))]
|
||
default: // 中低倍率
|
||
}
|
||
prizeValue := int64(rate) * int64(betValue)
|
||
bg.TotalPrizeValue += prizeValue
|
||
bg.DataMultiplier += prizeValue
|
||
bg.BonusData = append(bg.BonusData, prizeValue)
|
||
if bonusGameNum >= 24 {
|
||
break
|
||
}
|
||
}
|
||
bg.Mutiplier = startBonus
|
||
bg.TotalPrizeValue *= int64(bg.Mutiplier)
|
||
return bg
|
||
}
|