slot.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package rezekislot
  2. import (
  3. "sort"
  4. "bet24.com/log"
  5. )
  6. type Slot struct {
  7. SlotID int // 编号
  8. Name string // 描述
  9. IsMagic int // 万能牌
  10. Win3 float64 // 3个连线赔率
  11. Win4 float64 // 4个连线赔率
  12. Win5 float64 // 5个连线赔率
  13. }
  14. func (s *Slot) isMagic() bool {
  15. return s.IsMagic > 0
  16. }
  17. type SlotManager struct {
  18. Slots []Slot
  19. FreeSlotId int
  20. }
  21. func newSlotManager(slots []Slot, freeSlotId int) *SlotManager {
  22. ret := new(SlotManager)
  23. ret.Slots = slots
  24. ret.FreeSlotId = freeSlotId
  25. return ret
  26. }
  27. func (sm *SlotManager) getMagicSlotId() int {
  28. for _, v := range sm.Slots {
  29. if v.isMagic() {
  30. return v.SlotID
  31. }
  32. }
  33. return -1
  34. }
  35. func (sm *SlotManager) getSlot(slotId int) *Slot {
  36. for _, v := range sm.Slots {
  37. if v.SlotID == slotId {
  38. return &v
  39. }
  40. }
  41. return nil
  42. }
  43. func (sm *SlotManager) isMagic(slotId int) bool {
  44. s := sm.getSlot(slotId)
  45. if s == nil {
  46. log.Color(LogColor, "SlotManager.isMagic invlaid SlotId %d", slotId)
  47. return false
  48. }
  49. return s.isMagic()
  50. }
  51. // 查看5个组合是否中
  52. func (sm *SlotManager) getResult(slots []int) (slotId, count int, winMultiple float64) {
  53. slotId = -1
  54. winMultiple = 0.0
  55. count = 0
  56. if len(slots) != COLUMN_COUNT {
  57. log.Color(LogColor, "SlotManager.getResult invalid len %v", slots)
  58. return
  59. }
  60. for i := 0; i < COLUMN_COUNT; i++ {
  61. //免费素材不能连线
  62. if slots[i] == sm.FreeSlotId {
  63. break
  64. }
  65. //通用素材则直接通过
  66. if sm.isMagic(slots[i]) {
  67. count++
  68. continue
  69. }
  70. if slotId == -1 {
  71. slotId = slots[i]
  72. count++
  73. continue
  74. }
  75. //如果ID不相同则表示不连续
  76. if slots[i] != slotId {
  77. break
  78. }
  79. count++
  80. }
  81. //检查id是否正确
  82. if slotId == -1 {
  83. return
  84. }
  85. //检查配置表是否存在
  86. slot := sm.getSlot(slotId)
  87. if slot == nil {
  88. return
  89. }
  90. switch count {
  91. case 3:
  92. winMultiple = slot.Win3
  93. case 4:
  94. winMultiple = slot.Win4
  95. case 5:
  96. winMultiple = slot.Win5
  97. default:
  98. return
  99. }
  100. return
  101. }
  102. /*
  103. 必须由第一列开始算连线
  104. 其中第三列有第四个格子
  105. */
  106. func (sm *SlotManager) getResults(slots []int) []Result {
  107. var ret []Result
  108. for r1 := 0; r1 < ROW_COUNT; r1++ {
  109. for r2 := 0; r2 < ROW_COUNT; r2++ {
  110. //第三列有四个 倒着排
  111. for r3 := 0; r3 < 4; r3++ {
  112. for r4 := 0; r4 < ROW_COUNT; r4++ {
  113. for r5 := 0; r5 < ROW_COUNT; r5++ {
  114. slotId, count, winMultiple := sm.getResult([]int{
  115. slots[r1*COLUMN_COUNT],
  116. slots[r2*COLUMN_COUNT+1],
  117. GetSlotValue(slots, r3*COLUMN_COUNT+2),
  118. slots[r4*COLUMN_COUNT+3],
  119. slots[r5*COLUMN_COUNT+4],
  120. })
  121. //拼接连接线给到前端 第三列有4个格子取模将第三个排在最前方便前端显示 1234
  122. if winMultiple > 0 {
  123. winShape := 0
  124. if count == 3 {
  125. winShape = (r1+1)*100 + (r2+1)*10 + ((r3+1)%4 + 1)
  126. } else if count == 4 {
  127. winShape = (r1+1)*1000 + (r2+1)*100 + ((r3+1)%4+1)*10 + r4 + 1
  128. } else if count == 5 {
  129. winShape = (r1+1)*10000 + (r2+1)*1000 + ((r3+1)%4+1)*100 + (r4+1)*10 + r5 + 1
  130. }
  131. ret = append(ret, Result{
  132. SlotID: slotId,
  133. SlotCount: count,
  134. WinShape: winShape,
  135. WinRate: winMultiple,
  136. })
  137. }
  138. }
  139. }
  140. }
  141. }
  142. }
  143. // 去重,把短的去掉
  144. if len(ret) == 0 {
  145. return ret
  146. }
  147. sort.Slice(ret, func(i, j int) bool {
  148. return ret[i].WinShape < ret[j].WinShape
  149. })
  150. for i := 0; i < len(ret)-1; {
  151. flag := false
  152. for j := i + 1; j < len(ret); j++ {
  153. if ret[i].WinShape == ret[j].WinShape ||
  154. ret[i].WinShape == ret[j].WinShape/10 ||
  155. ret[i].WinShape == ret[j].WinShape/100 {
  156. flag = true
  157. break
  158. }
  159. }
  160. if flag {
  161. ret = append(ret[:i], ret[i+1:]...)
  162. } else {
  163. i++
  164. }
  165. }
  166. return ret
  167. }
  168. //根据索引获得对应数值
  169. func GetSlotValue(slots []int, index int) int {
  170. //由于第三列有4个格子 Slots生成的数据中最后一个表示第三列顶部
  171. if index > (RESULT_COUNT - 1) {
  172. index = RESULT_COUNT - 1
  173. }
  174. return slots[index]
  175. }