From 2d0af7a2afcf08a03b5392fd8f34a74c8bd915b6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 14:09:56 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=A6=E6=A0=87=E8=B5=9B=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/champship_mgr.go | 59 ++++++++++++++++++++++++------- src/server/test/champship_test.go | 5 +++ src/server/test/fix_test.go | 2 +- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/server/game/champship_mgr.go b/src/server/game/champship_mgr.go index c18232e3..fdcf7db6 100644 --- a/src/server/game/champship_mgr.go +++ b/src/server/game/champship_mgr.go @@ -116,12 +116,16 @@ func (c *ChampshipMgr) Init() { }) } -func (c *ChampshipMgr) NotifyAll() (interface{}, error) { +// 每天零点30分通知所有在线玩家领取奖励 +func (c *ChampshipMgr) ZeroNotifyAll() (interface{}, error) { NotifyAllPlayerMsg(&msg.Msg{ Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, HandleType: msg.HANDLE_MOD_PLAYER_MSG, End: GoUtil.Now() + onehour, }) + c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration()+1800)*time.Second, func() { + c.ZeroNotifyAll() + }) return nil, nil } @@ -163,8 +167,8 @@ func (c *ChampshipMgr) ZeroUpdate() (interface{}, error) { c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { c.ZeroUpdate() }) - c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { - c.NotifyAll() + c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration()+1800)*time.Second, func() { + c.ZeroNotifyAll() }) // 在锁外通知玩家,避免在持有锁时调用外部函数 go c.NotifyPlayer() @@ -457,13 +461,13 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { } else { x = n } + x = max(x, 1) _, ok := g[x] if !ok { g[x] = make([]int, 0) } g[x] = append(g[x], k) } - for i := 11; i > 0; i-- { if len(g[i]) == 0 { continue @@ -481,21 +485,29 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { } ChampshipData.AutoId++ StartId := ChampshipData.AutoId - numGroups := (len(g[i]) + 9) / 10 // 向上取整,计算需要的组数 - ChampshipData.AutoId += numGroups for j := 0; j < len(g[i]); j++ { - groupIndex := StartId + j/10 - ChampshipData.GroupInfo[g[i][j]] = groupIndex + if len(ChampshipData.Rank[ChampshipData.AutoId]) >= 10 { + log.Error("championship error: more than 10 players in a group") + } + ChampshipData.GroupInfo[g[i][j]] = ChampshipData.AutoId UserData := ChampshipData.Pool[g[i][j]] - ChampshipData.Rank[groupIndex] = append(ChampshipData.Rank[groupIndex], &ChampshipRank{ + ChampshipData.Rank[ChampshipData.AutoId] = append(ChampshipData.Rank[ChampshipData.AutoId], &ChampshipRank{ Uid: UserData.Uid, Score: UserData.Score, Time: UserData.Time, }) - log.Debug("group AutoId:%d, Uid:%d, Score:%f, Time:%d", groupIndex, UserData.Uid, UserData.Score, UserData.Time) + log.Debug("group AutoId:%d, Uid:%d, Score:%.2f, Time:%d", ChampshipData.AutoId, UserData.Uid, UserData.Score, UserData.Time) + if len(ChampshipData.Rank[ChampshipData.AutoId]) >= 10 && j != len(g[i])-1 { + ChampshipData.AutoId++ + } } for j := StartId; j <= ChampshipData.AutoId; j++ { // 填充机器人 + if len(ChampshipData.Rank[j]) >= 30 || len(ChampshipData.Rank[j]) == 0 { + log.Error("championship error: more than 30 players in a group or no player in a group") + continue + } RobotNum := 30 - len(ChampshipData.Rank[j]) + log.Debug("group AutoId:%d, player num:%d, need robot num:%d", j, len(ChampshipData.Rank[j]), RobotNum) RobotList := CreateRobotList(i, RobotNum, j) for i := 0; i < RobotNum; i++ { FormatRobotInfo(RobotList[i], i+1) @@ -513,8 +525,6 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { sort.Slice(ChampshipData.Rank[j], func(x, y int) bool { // 排序 从大到小 数值相等按时间排序 if ChampshipData.Rank[j][x].Score > ChampshipData.Rank[j][y].Score { return true - } else if ChampshipData.Rank[j][x].Score == ChampshipData.Rank[j][y].Score { - return ChampshipData.Rank[j][x].Time < ChampshipData.Rank[j][y].Time } return false }) @@ -966,6 +976,31 @@ func (c *ChampshipMgr) SetRankCache(Uid int) { db.RedisSetKey(key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId), time.Second*172800) } +func (c *ChampshipMgr) Debug() { + ChampshipData := c.getData() + ChampshipData.Pool = make(map[int]*GroupInfo) + ChampshipData.Rank = make(map[int][]*ChampshipRank) + for i := 1; i <= 1000; i++ { + ChampshipData.Pool[i+10000] = &GroupInfo{ + Uid: i + 10000, + Score: float64(GoUtil.RandNum(20, 21680)), + Time: GoUtil.Now(), + N: GoUtil.RandNum(1, 99), + H: GoUtil.RandNum(1, 99), + } + } + c.group(true) + var i int + for _, v := range ChampshipData.Rank { + for _, v1 := range v { + if v1.Type == 0 { + i++ + } + } + } + log.Debug("Debug player num:%d", i) +} + func GetRankCache(Uid int) (int, int, int, int) { key := fmt.Sprintf("champship_rank_cache_%d", Uid) data, err := db.RedisGetKey(key) diff --git a/src/server/test/champship_test.go b/src/server/test/champship_test.go index 6a636f7d..61df8926 100644 --- a/src/server/test/champship_test.go +++ b/src/server/test/champship_test.go @@ -47,3 +47,8 @@ func TestChampionshipCreateRobot(t *testing.T) { } fmt.Print("success") } + +func TestChampionshipGroup(t *testing.T) { + game.G_GameLogicPtr.CreateChampshipMgr() + game.G_GameLogicPtr.ChampshipMgr.Debug() +} diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 27530992..12679938 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -100,7 +100,7 @@ func TestRandInt(t *testing.T) { } func TestII(t *testing.T) { - for i := 10; i >= 0; i-- { + for i := 0; i < 10; i++ { fmt.Printf("i: %d\n", i) } }