game_sync/gamerule/tamquoc/tamquoc.go

194 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}