205 lines
4.7 KiB
Go
205 lines
4.7 KiB
Go
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()
|
||
}
|
||
}
|