179 lines
4.3 KiB
Go
179 lines
4.3 KiB
Go
package candy
|
||
|
||
import (
|
||
"fmt"
|
||
"math/rand"
|
||
"time"
|
||
)
|
||
|
||
// var SpinID int64 = 100000 // todo
|
||
|
||
type LineData struct {
|
||
Index int
|
||
Element int
|
||
Count int
|
||
Score int64
|
||
Position []int32
|
||
}
|
||
|
||
//图案*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 {
|
||
return v, dataMap[v]
|
||
} else if dataMap[v] >= 2 && (v == Element_QUEKEO || v == Element_RANHMI) {
|
||
return v, dataMap[v]
|
||
}
|
||
}
|
||
return -1, -1
|
||
}
|
||
|
||
// 是否特殊线
|
||
func isSpecialLine(data []int) (flag bool, m 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]++
|
||
}
|
||
}
|
||
//if dataMap[Element_VUANGMIEN] == 1 && dataMap[Element_RONG] == 1 && dataMap[Element_NGOC] == 1 {
|
||
// flag = true
|
||
// m = LINE_BIGWILD
|
||
//}
|
||
if dataMap[Element_VUANGMIEN] == 1 && dataMap[Element_QUEKEO] == 1 && dataMap[Element_RANHMI] == 1 {
|
||
flag = true
|
||
m = LINE_SMALLWILD
|
||
}
|
||
return
|
||
}
|
||
|
||
func CalcLine(data []int, betLines []int64) (lines []LineData) {
|
||
var isBigWild bool
|
||
var cards = make([]int, len(data))
|
||
copy(cards, data)
|
||
for _, lineNum := range betLines {
|
||
index := int(lineNum)
|
||
lineTemplate := AllLineArray[index-1]
|
||
edata := []int{}
|
||
normalData := []int{}
|
||
realData := []int{}
|
||
epos := []int32{}
|
||
for _, pos := range lineTemplate {
|
||
edata = append(edata, cards[pos])
|
||
if cards[pos] != Element_VUANGMIEN {
|
||
normalData = append(normalData, cards[pos])
|
||
}
|
||
realData = append(realData, data[pos])
|
||
epos = append(epos, int32(pos+1))
|
||
}
|
||
|
||
if len(edata) == len(normalData) || len(normalData) == 0 {
|
||
head, count := isLine(edata)
|
||
if head >= 0 {
|
||
lines = append(lines, LineData{index, head, count, LineScore[head][count-1], epos[:count]})
|
||
}
|
||
} else {
|
||
normalData = DelSliceRepEle(normalData)
|
||
if len(normalData) == LINE_CELL-1 {
|
||
if f, m := isSpecialLine(edata); f {
|
||
if m == LINE_SMALLWILD {
|
||
lines = append(lines, LineData{index, Element_Min, LINE_CELL, LineScore[Element_Min][LINE_CELL-1], epos[:LINE_CELL]})
|
||
break
|
||
}
|
||
// 特殊奖励(高倍率 15,20,30,50 多个中线仅计算一次分数)
|
||
if m == LINE_BIGWILD {
|
||
var specialScore int64
|
||
if !isBigWild {
|
||
isBigWild = true
|
||
specialScore = luckyDataRate[rand.Intn(len(luckyDataRate))] * 10 // (特殊倍率 * 10倍,返回时候 / 10 还原,底注配置10,暂不会出现问题)
|
||
}
|
||
lines = append(lines, LineData{index, Element_Min, LINE_CELL, specialScore, epos[:LINE_CELL]})
|
||
continue
|
||
}
|
||
}
|
||
}
|
||
for _, value := range normalData {
|
||
replaceData := []int{}
|
||
for i := 0; i < len(edata); i++ {
|
||
if edata[i] == Element_VUANGMIEN {
|
||
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); i++ {
|
||
if eleFlag[data[i]] {
|
||
continue
|
||
}
|
||
eleFlag[data[i]] = true
|
||
res = append(res, data[i])
|
||
}
|
||
return res
|
||
}
|
||
|
||
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()
|
||
}
|
||
}
|
||
|
||
var gSeedV = time.Now().UnixNano()
|
||
|
||
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() []int {
|
||
return defalutData[rand.Intn(len(defalutData))]
|
||
}
|