game_sync/gamerule/candy/candy.go

179 lines
4.3 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 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))]
}