@@ -2,6 +2,7 @@ package match
2
2
3
3
import (
4
4
"fmt"
5
+ "math"
5
6
"sort"
6
7
"strconv"
7
8
"sync"
@@ -88,46 +89,70 @@ func (m *MatchPool) match() {
88
89
return true
89
90
})
90
91
ratingMap .Range (func (key , value interface {}) bool {
91
- m .matchUser (key , value )
92
+ m .matchUser (ratingMap , key , value )
92
93
return true
93
94
})
94
95
95
96
}
96
97
97
- func (m * MatchPool ) matchUser (key , value interface {}) {
98
+ func (m * MatchPool ) matchUser (ratingMap sync. Map , key , value interface {}) {
98
99
//找出同一分数段里,等待时间最长的玩家
99
- rating , err := strconv .Atoi (key .(string ))
100
- fmt .Println ("当前分数" ,rating )
101
- if err != nil {
100
+ //continueMatch := true
101
+ //for continueMatch {
102
+ userArray := value .([]Match )
103
+ if len (userArray ) <= 0 {
104
+ //continueMatch = false //该分段没有数据
102
105
return
103
106
}
104
- continueMatch := true
105
- for continueMatch {
106
- userArray := value .([]Match )
107
- if len (userArray ) <= 0 {
108
- continueMatch = false //该分段没有数据
109
- return
110
- }
111
- var MatchUser []Match
112
- maxUser := userArray [0 ]
113
- MatchUser = append (MatchUser , maxUser )
114
- fmt .Println ("用户 UID" , maxUser .Uid , "是分数" , maxUser .Rating , " 上等待最久的玩家" , "已经等待时间 " , time .Now ().UnixNano ()/ 1e6 - maxUser .StartTime , "开始匹配时间 " , time .Now ().UnixNano ()/ 1e6 )
115
- //先从本分数段上取数据
116
- for _ , v := range userArray {
117
- if v .Uid == maxUser .Uid {
107
+ var MatchUser []Match
108
+ maxUser := userArray [0 ] //等待时间最长的用户
109
+ MatchUser = append (MatchUser , maxUser )
110
+ fmt .Println ("用户 UID" , maxUser .Uid , "是分数" , maxUser .Rating , " 上等待最久的玩家" , "已经等待时间 " , time .Now ().UnixNano ()/ 1e6 - maxUser .StartTime , "开始匹配时间 " , time .Now ().UnixNano ()/ 1e6 )
111
+ waitSecond := time .Now ().Unix () - maxUser .StartTime / 1000
112
+ step := getRatingStep (waitSecond )
113
+ min := maxUser .Rating - step
114
+ if min < 0 {
115
+ min = 0
116
+ }
117
+ max := maxUser .Rating + step
118
+ fmt .Println ("用户 UID " , maxUser .Uid , "本次搜索 rating 范围下限 " , min , "rating 范围上限 " , max )
119
+ //TODO 再上下每次加1分取 如果加到都没成功者失败
120
+ middle := maxUser .Rating //设置 rating 区间中位数
121
+ for searchRankUp , searchRankDown := middle , middle ; searchRankUp <= max && searchRankDown >= min ; searchRankUp , searchRankDown = searchRankUp + 1 , searchRankDown - 1 {
122
+ if searchRankDown != searchRankUp && searchRankDown > 0 { //目前只选择比我评分低的人,体验会好一些
123
+ rank , ok := ratingMap .Load (searchRankDown )
124
+ if ! ok {
118
125
continue
119
126
}
120
- MatchUser = append ( MatchUser , v )
121
- if len (MatchUser ) >= m . num {
122
- break
127
+ rankArray := rank .([] Match )
128
+ if len (rankArray ) <= 0 {
129
+ continue
123
130
}
124
- }
125
- if len (MatchUser ) >= m .num { //人员已经够了,不再判断
126
- //移除已经匹配成功的数据
127
- continue
128
- }
129
- //TODO 再上下每次加1分取 如果加到50都没成功者失败
131
+ if len (rankArray ) < m .num { //数量大于需要匹配的人数 TODO 这里多人的话需要优化
132
+ continue
133
+ }
134
+ for _ , v := range rankArray {
135
+ if v .Uid != maxUser .Uid {
136
+ MatchUser = append (MatchUser , v )
137
+ //移除该数据
138
+ fmt .Println ("用户 UID " , maxUser .Uid , "在 rating" , searchRankDown , " 找到匹配用户 " , v .Uid )
130
139
140
+ }
141
+ }
142
+ }
131
143
}
132
144
}
133
145
146
+ //waitSecond 该用户等待了多少秒
147
+ func getRatingStep (waitSecond int64 ) int {
148
+ var (
149
+ step = 1.3
150
+ baseStep float64 = 3
151
+ maxStep float64 = 100
152
+ )
153
+ u := math .Pow (float64 (waitSecond ), step )
154
+ u = u + baseStep
155
+ u = math .Round (u )
156
+ u = math .Min (u , maxStep ) //等待时间越长,rating 区间越大
157
+ return int (u )
158
+ }
0 commit comments