Skip to content

Commit 9e5152f

Browse files
committed
添加匹配算法
1 parent 3e7908f commit 9e5152f

File tree

2 files changed

+68
-43
lines changed

2 files changed

+68
-43
lines changed

game/match/match.go

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package match
22

33
import (
44
"fmt"
5+
"math"
56
"sort"
67
"strconv"
78
"sync"
@@ -88,46 +89,70 @@ func (m *MatchPool) match() {
8889
return true
8990
})
9091
ratingMap.Range(func(key, value interface{}) bool {
91-
m.matchUser(key, value)
92+
m.matchUser(ratingMap, key, value)
9293
return true
9394
})
9495

9596
}
9697

97-
func (m *MatchPool) matchUser(key, value interface{}) {
98+
func (m *MatchPool) matchUser(ratingMap sync.Map, key, value interface{}) {
9899
//找出同一分数段里,等待时间最长的玩家
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 //该分段没有数据
102105
return
103106
}
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 {
118125
continue
119126
}
120-
MatchUser = append(MatchUser, v)
121-
if len(MatchUser) >= m.num {
122-
break
127+
rankArray := rank.([]Match)
128+
if len(rankArray) <= 0 {
129+
continue
123130
}
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)
130139

140+
}
141+
}
142+
}
131143
}
132144
}
133145

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+
}

game/match/match_test.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,53 @@
11
package match
22

33
import (
4-
"sync"
54
"testing"
65
"time"
76
)
87

98
func Test_NewMatchPool(t *testing.T) {
10-
macth := NewMatchPool(10000)
9+
macth := NewMatchPool(100000)
1110
macth.Add(&Match{
1211
Uid: 1,
1312
Rating: 1599,
1413
StartTime: time.Now().UnixNano() / 1e6,
1514
})
16-
time.Sleep(time.Second / 10)
15+
time.Sleep(time.Second)
1716
macth.Add(&Match{
1817
Uid: 2,
1918
Rating: 1600,
2019
StartTime: time.Now().UnixNano() / 1e6,
2120
})
22-
time.Sleep(time.Second / 10)
21+
time.Sleep(time.Second)
2322
macth.Add(&Match{
2423
Uid: 3,
2524
Rating: 1599,
2625
StartTime: time.Now().UnixNano() / 1e6,
2726
})
28-
time.Sleep(time.Second / 10)
27+
time.Sleep(time.Second)
2928
macth.Add(&Match{
3029
Uid: 4,
3130
Rating: 1599,
3231
StartTime: time.Now().UnixNano() / 1e6,
3332
})
34-
time.Sleep(time.Second / 10)
33+
time.Sleep(time.Second)
3534
macth.Add(&Match{
3635
Uid: 5,
3736
Rating: 1666,
3837
StartTime: time.Now().UnixNano() / 1e6,
3938
})
4039

41-
select {
42-
}
40+
select {}
4341
}
4442

4543
func TestMatchPool_AddV1(t *testing.T) {
46-
var data sync.Map
47-
data.Store(1,1)
48-
data.Store(2,2)
49-
data.Store(3,3)
50-
data.Range(func(key, value interface{}) bool {
51-
return true
52-
})
44+
var middle = 100
45+
for searchRankUp, searchRankDown := middle, middle; searchRankUp <= 120 && searchRankDown >= 80 ; searchRankUp, searchRankDown = searchRankUp+1, searchRankDown-1 {
46+
t.Log("searchRankUp: ", searchRankUp)
47+
t.Log("searchRankDown: ", searchRankDown)
48+
if searchRankDown != searchRankUp && searchRankDown > 0 {
49+
t.Log("searchRankDown: searchRankDownsearchRankDownsearchRankDown ", searchRankDown)
50+
}
51+
}
52+
5353
}

0 commit comments

Comments
 (0)