arrangemanager.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package pointmatch
  2. import (
  3. "math/rand"
  4. "sync"
  5. )
  6. type arrangemanager struct {
  7. targetCount int // 撮合人数
  8. maxLevel int // 最多分配多少等级的用户,超过等待,等级一般是当前已打的局数
  9. totalCount int // 剩下总人数
  10. userlist map[int]*arrangeuser
  11. lock *sync.RWMutex
  12. index int
  13. }
  14. func createArrangeManager(targetCount int) *arrangemanager {
  15. ret := new(arrangemanager)
  16. ret.targetCount = targetCount
  17. ret.ctor()
  18. return ret
  19. }
  20. func (am *arrangemanager) ctor() {
  21. am.lock = &sync.RWMutex{}
  22. am.userlist = make(map[int]*arrangeuser)
  23. }
  24. func (am *arrangemanager) getUser(userId int) *arrangeuser {
  25. am.lock.RLock()
  26. au, ok := am.userlist[userId]
  27. am.lock.RUnlock()
  28. if !ok {
  29. return nil
  30. }
  31. return au
  32. }
  33. func (am *arrangemanager) addUser(userId int, level int, ip string, tryArrange bool) [][]int {
  34. au := am.getUser(userId)
  35. if au != nil {
  36. au.Level = level
  37. au.IP = ip
  38. } else {
  39. am.lock.Lock()
  40. am.userlist[userId] = &arrangeuser{UserId: userId, Level: level, IP: ip}
  41. am.lock.Unlock()
  42. }
  43. if !tryArrange {
  44. return [][]int{}
  45. }
  46. return am.checkAndArrange()
  47. }
  48. func (am *arrangemanager) removeUser(userId int) {
  49. am.lock.Lock()
  50. delete(am.userlist, userId)
  51. am.lock.Unlock()
  52. }
  53. func (am *arrangemanager) setUserLevel(userId int, level int) {
  54. au := am.getUser(userId)
  55. if au != nil {
  56. au.Level = level
  57. }
  58. }
  59. func (am *arrangemanager) setUserIP(userId int, ip string) {
  60. au := am.getUser(userId)
  61. if au != nil {
  62. au.IP = ip
  63. }
  64. }
  65. func (am *arrangemanager) setTotalUserCount(count int) {
  66. am.totalCount = count
  67. }
  68. func (am *arrangemanager) getAllIds() []int {
  69. var ret []int
  70. am.lock.RLock()
  71. for _, v := range am.userlist {
  72. ret = append(ret, v.UserId)
  73. }
  74. am.lock.RUnlock()
  75. return ret
  76. }
  77. func (am *arrangemanager) checkAndArrange() [][]int {
  78. var ret [][]int
  79. allIds := am.getAllIds()
  80. userCount := len(allIds)
  81. if userCount < am.targetCount {
  82. return ret
  83. }
  84. // 只剩下一桌 了
  85. if am.totalCount == am.targetCount && userCount == am.targetCount {
  86. ret = append(ret, allIds)
  87. return ret
  88. }
  89. // 多余两桌才撮合
  90. if userCount < am.targetCount*2 {
  91. return ret
  92. }
  93. // 把用户打乱
  94. for i := len(allIds) - 1; i > 1; i-- {
  95. pos := rand.Intn(i)
  96. allIds[pos], allIds[i] = allIds[i], allIds[pos]
  97. }
  98. tableCount := userCount / am.targetCount
  99. for i := 0; i < tableCount; i++ {
  100. var t []int
  101. for j := 0; j < am.targetCount; j++ {
  102. t = append(t, allIds[i*am.targetCount+j])
  103. }
  104. ret = append(ret, t)
  105. }
  106. return ret
  107. }