| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- package rezekislot
- import (
- "sort"
- "bet24.com/log"
- )
- type Slot struct {
- SlotID int // 编号
- Name string // 描述
- IsMagic int // 万能牌
- Win3 float64 // 3个连线赔率
- Win4 float64 // 4个连线赔率
- Win5 float64 // 5个连线赔率
- }
- func (s *Slot) isMagic() bool {
- return s.IsMagic > 0
- }
- type SlotManager struct {
- Slots []Slot
- FreeSlotId int
- }
- func newSlotManager(slots []Slot, freeSlotId int) *SlotManager {
- ret := new(SlotManager)
- ret.Slots = slots
- ret.FreeSlotId = freeSlotId
- return ret
- }
- func (sm *SlotManager) getMagicSlotId() int {
- for _, v := range sm.Slots {
- if v.isMagic() {
- return v.SlotID
- }
- }
- return -1
- }
- func (sm *SlotManager) getSlot(slotId int) *Slot {
- for _, v := range sm.Slots {
- if v.SlotID == slotId {
- return &v
- }
- }
- return nil
- }
- func (sm *SlotManager) isMagic(slotId int) bool {
- s := sm.getSlot(slotId)
- if s == nil {
- log.Color(LogColor, "SlotManager.isMagic invlaid SlotId %d", slotId)
- return false
- }
- return s.isMagic()
- }
- // 查看5个组合是否中
- func (sm *SlotManager) getResult(slots []int) (slotId, count int, winMultiple float64) {
- slotId = -1
- winMultiple = 0.0
- count = 0
- if len(slots) != COLUMN_COUNT {
- log.Color(LogColor, "SlotManager.getResult invalid len %v", slots)
- return
- }
- for i := 0; i < COLUMN_COUNT; i++ {
- //免费素材不能连线
- if slots[i] == sm.FreeSlotId {
- break
- }
- //通用素材则直接通过
- if sm.isMagic(slots[i]) {
- count++
- continue
- }
- if slotId == -1 {
- slotId = slots[i]
- count++
- continue
- }
- //如果ID不相同则表示不连续
- if slots[i] != slotId {
- break
- }
- count++
- }
- //检查id是否正确
- if slotId == -1 {
- return
- }
- //检查配置表是否存在
- slot := sm.getSlot(slotId)
- if slot == nil {
- return
- }
- switch count {
- case 3:
- winMultiple = slot.Win3
- case 4:
- winMultiple = slot.Win4
- case 5:
- winMultiple = slot.Win5
- default:
- return
- }
- return
- }
- /*
- 必须由第一列开始算连线
- 其中第三列有第四个格子
- */
- func (sm *SlotManager) getResults(slots []int) []Result {
- var ret []Result
- for r1 := 0; r1 < ROW_COUNT; r1++ {
- for r2 := 0; r2 < ROW_COUNT; r2++ {
- //第三列有四个 倒着排
- for r3 := 0; r3 < 4; r3++ {
- for r4 := 0; r4 < ROW_COUNT; r4++ {
- for r5 := 0; r5 < ROW_COUNT; r5++ {
- slotId, count, winMultiple := sm.getResult([]int{
- slots[r1*COLUMN_COUNT],
- slots[r2*COLUMN_COUNT+1],
- GetSlotValue(slots, r3*COLUMN_COUNT+2),
- slots[r4*COLUMN_COUNT+3],
- slots[r5*COLUMN_COUNT+4],
- })
- //拼接连接线给到前端 第三列有4个格子取模将第三个排在最前方便前端显示 1234
- if winMultiple > 0 {
- winShape := 0
- if count == 3 {
- winShape = (r1+1)*100 + (r2+1)*10 + ((r3+1)%4 + 1)
- } else if count == 4 {
- winShape = (r1+1)*1000 + (r2+1)*100 + ((r3+1)%4+1)*10 + r4 + 1
- } else if count == 5 {
- winShape = (r1+1)*10000 + (r2+1)*1000 + ((r3+1)%4+1)*100 + (r4+1)*10 + r5 + 1
- }
- ret = append(ret, Result{
- SlotID: slotId,
- SlotCount: count,
- WinShape: winShape,
- WinRate: winMultiple,
- })
- }
- }
- }
- }
- }
- }
- // 去重,把短的去掉
- if len(ret) == 0 {
- return ret
- }
- sort.Slice(ret, func(i, j int) bool {
- return ret[i].WinShape < ret[j].WinShape
- })
- for i := 0; i < len(ret)-1; {
- flag := false
- for j := i + 1; j < len(ret); j++ {
- if ret[i].WinShape == ret[j].WinShape ||
- ret[i].WinShape == ret[j].WinShape/10 ||
- ret[i].WinShape == ret[j].WinShape/100 {
- flag = true
- break
- }
- }
- if flag {
- ret = append(ret[:i], ret[i+1:]...)
- } else {
- i++
- }
- }
- return ret
- }
- //根据索引获得对应数值
- func GetSlotValue(slots []int, index int) int {
- //由于第三列有4个格子 Slots生成的数据中最后一个表示第三列顶部
- if index > (RESULT_COUNT - 1) {
- index = RESULT_COUNT - 1
- }
- return slots[index]
- }
|