game_sync/gamerule/iceage/iceage.go

205 lines
4.7 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 iceage
import (
"fmt"
"math/rand"
"sort"
"time"
)
type LineData struct {
Index int
Element int
Count int
Score int
}
var SpinID int64 = 100000 // todo
//图案*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 (e != Element_NUT && count < 3) || (e == Element_NUT && count < 4) {
return -1, -1
}
return
}
func CalcLine(data []int, betLines []int64) (lines []LineData) {
//fmt.Println("************************************************")
//fmt.Println("data:",data)
for _, lineNum := range betLines {
index := int(lineNum)
lineTemplate := AllLineArray[index-1]
edata := []int{}
normalData := []int{}
for _, pos := range lineTemplate {
edata = append(edata, data[pos])
normalData = append(normalData, data[pos])
}
//fmt.Println("edata:",edata)
//fmt.Println("normalData:",normalData)
if len(edata) == len(normalData) {
head, count := IsLine(edata)
if head >= 0 {
lines = append(lines, LineData{index, head, count, LineScore[head][count-1]})
}
} else {
//fmt.Printf("Line:%v-%v\n", index, lineTemplate)
//fmt.Println("edata:", edata)
//fmt.Println("normalData:", normalData)
normalData = DelSliceRepEle(normalData)
//fmt.Println("normalData:", normalData)
for _, value := range normalData {
_ = value
replaceData := []int{}
for i := 0; i < len(edata); i++ {
replaceData = append(replaceData, edata[i])
}
head, count := IsLine(replaceData)
if head >= 0 {
lines = append(lines, LineData{index, head, count, 0})
//fmt.Printf("*******************%v****************************\n", lines)
break
}
}
}
}
//fmt.Print("lines:",lines)
return
}
//去除切片在的重复的元素
func DelSliceRepEle(data []int) []int {
if len(data) == 1 {
return data
}
sort.Ints(data)
for i := 0; i < len(data)-1; {
if data[i] == data[i+1] {
data = append(data[:i], data[i+1:]...)
} else {
i++
}
}
return data
}
var gSeedV = time.Now().UnixNano()
//生成消消乐之后的数据distributionData为将要注入的数据源
func MakePlan(cards []int, distributionData []int32, betLines []int64) (newCards []int) {
var c = make([]int, len(cards))
for i, card := range cards {
c[i] = card
}
var lines = CalcLine(cards, betLines)
//fmt.Printf("input card:%v \n",cards)
//PrintHuman(cards)
//fmt.Printf("calc result:%v \n",lines)
if len(lines) == 0 {
return nil
}
for _, line := range lines {
//if line.Score > 0 {
var l = AllLineArray[line.Index-1]
for pos := 0; pos < line.Count; pos++ {
c[l[pos]] = -1
}
//}
}
//fmt.Printf("after trim card:%v \n",c)
//PrintHuman(c)
for i := 10; i < 15; i++ {
if c[i] == -1 && c[i-5] != -1 {
c[i], c[i-5] = c[i-5], c[i]
}
}
for i := 5; i < 10; i++ {
if c[i] == -1 && c[i-5] != -1 {
c[i], c[i-5] = c[i-5], c[i]
}
}
for i := 10; i < 15; i++ {
if c[i] == -1 && c[i-5] != -1 {
c[i], c[i-5] = c[i-5], c[i]
}
}
//fmt.Printf("after plan card:%v \n",c)
//PrintHuman(c)
var dD = make([]int, 0)
for _, e := range distributionData {
if int(e) == Element_BONUS || int(e) == Element_FREESPIN || int(e) == Element_JACKPOT {
continue
}
dD = append(dD, int(e))
}
gSeedV++
rand.Seed(gSeedV)
for i, card := range c {
if card == -1 {
c[i] = dD[rand.Intn(len(dD))]
}
}
//fmt.Printf("after fill card:%v \n",c)
//PrintHuman(c)
return c
}
type CaclResult struct {
WinLines []LineData //中奖的线
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_FREESPIN {
spinFree += FreeSpinTimesRate[line.Count-1]
continue
}
if line.Element == Element_JACKPOT && line.Count == LINE_CELL {
isJackpot = true
}
curscore = LineScore[line.Element][line.Count-1]
allscore = allscore + curscore
alllinenum++
}
bounsCount := 0
for _, card := range cards {
if card == Element_BONUS {
bounsCount++
}
}
rand.Seed(time.Now().UnixNano())
//bounsScore:= SmallGameByBouns[bounsCount][0]+rand.Intn(SmallGameByBouns[bounsCount][1])
return int32(alllinenum), int32(allscore), int32(0), int32(spinFree), 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()
}
}