From 96d80dd4398958c77130ee61e21e90118d7f8fea Mon Sep 17 00:00:00 2001 From: udieudie Date: Fri, 27 Jun 2025 11:59:03 +0800 Subject: [PATCH 1/2] =?UTF-8?q?david/feat:=E8=83=9C=E7=82=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=81=9A=E4=BA=86=E4=B8=80=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/manager/gift_record_manager.go | 2 + app/manager/gift_record_mysql_storage.go | 4 +- app/models/models.go | 64 +++++++++-------- app/service/live_room_service.go | 92 ++++++++++++++++-------- app/utils/game.go | 8 +++ config/config.go | 8 ++- configs/config.prod.yaml | 4 +- 7 files changed, 118 insertions(+), 64 deletions(-) diff --git a/app/manager/gift_record_manager.go b/app/manager/gift_record_manager.go index 178949c..8bab313 100644 --- a/app/manager/gift_record_manager.go +++ b/app/manager/gift_record_manager.go @@ -48,6 +48,7 @@ type GiftRecordWithUserInfo struct { Value int `json:"value"` TotalValue int `json:"total_value"` Score int `json:"score"` + WinPoint int `json:"win_point"` TotalScore int `json:"total_score"` GiftLevel int `json:"gift_level"` GiftUpgrading int `json:"gift_upgrading"` @@ -290,6 +291,7 @@ func (grm *GiftRecordManager) GetGiftRecordWithUserInfoByLiveRoomAndTimes(liveRo Value: recordInfo.OneValue, // Value 对应 单个礼物的value TotalValue: recordInfo.TotalValue, Score: recordInfo.Score, + WinPoint: recordInfo.WinPoint, TotalScore: recordInfo.TotalScore, GiftLevel: recordInfo.GiftLevel, GiftUpgrading: recordInfo.GiftUpgrading, diff --git a/app/manager/gift_record_mysql_storage.go b/app/manager/gift_record_mysql_storage.go index e8a18f7..9817c0b 100644 --- a/app/manager/gift_record_mysql_storage.go +++ b/app/manager/gift_record_mysql_storage.go @@ -43,6 +43,7 @@ type GiftRecordWithUserInfoMysqlInfo struct { OneValue int `db:"one_value"` TotalValue int `db:"total_value"` Score int `db:"score"` + WinPoint int `db:"win_point"` TotalScore int `db:"total_score"` GiftLevel int `db:"gift_level"` GiftUpgrading int `db:"gift_upgrading"` @@ -336,7 +337,7 @@ func (grm *GiftRecordMysqlStorage) GetGiftRecordWithUserInfoByLiveRoomAndTimes(l SELECT grs.msg_id, grs.live_room_id, grs.times, grs.track, grs.job, grs.user_id, grs.gift_id, grs.gift_name, grs.amount, grs.one_value, grs.total_value, grs.score, grs.total_score, grs.gift_level, grs.gift_upgrading, - us.user_name, us.head_img, us.level, us.score, us.expire_at, + us.user_name, us.head_img, us.level, us.score, us.win_point, us.expire_at, grs.create_at, grs.update_at FROM gift_records grs left join users us on us.user_id = grs.user_id @@ -373,6 +374,7 @@ func (grm *GiftRecordMysqlStorage) GetGiftRecordWithUserInfoByLiveRoomAndTimes(l &record.OneValue, &record.TotalValue, &record.Score, + &record.WinPoint, &record.TotalScore, &record.GiftLevel, &record.GiftUpgrading, diff --git a/app/models/models.go b/app/models/models.go index 2062a1a..e714df9 100644 --- a/app/models/models.go +++ b/app/models/models.go @@ -54,36 +54,40 @@ type FinishTrackInfo struct { // LiveRoomResult 表示 live_room_result 表的结构 type LiveRoomResult struct { - LiveRoomID string `json:"live_room_id"` - Times int `json:"times"` - UserID string `json:"user_id"` - GameScore int `json:"game_score"` - Track int `json:"track"` - Job int `json:"job"` - IsChampion int `json:"is_champion"` - IsFinish int `json:"is_finish"` - IsBiggest int `json:"is_biggest"` - GiftValue int `json:"gift_value"` - GiftScore int `json:"gift_score"` - GetScore int `json:"get_score"` - HasDone int `json:"has_done"` - UserName string `json:"user_name"` - HeadImg string `json:"head_img"` - UserLevel int `json:"user_level"` - UserScore int `json:"user_score"` - TargetLevel int `json:"target_level"` - TargetScore int `json:"target_score"` - Mileage int `json:"mileage"` - JumpHeight float32 `json:"jump_height"` - FinishTime int `json:"finish_time"` - FinishTime1 int `json:"finish_time1"` - FinishTime2 int `json:"finish_time2"` - FastestSpeed int `json:"fastest_speed"` - AttackPower int `json:"attack_power"` - ExpireAt sql.NullTime `json:"expire_at"` - CreateAt sql.NullTime `json:"create_at"` - UpdateAt sql.NullTime `json:"update_at"` - TotalRank int `json:"total_rank"` + LiveRoomID string `json:"live_room_id"` + Times int `json:"times"` + UserID string `json:"user_id"` + GameScore int `json:"game_score"` + Track int `json:"track"` + Job int `json:"job"` + IsChampion int `json:"is_champion"` + IsFinish int `json:"is_finish"` + IsBiggest int `json:"is_biggest"` + GiftValue int `json:"gift_value"` + GiftScore int `json:"gift_score"` + GetScore int `json:"get_score"` + HasDone int `json:"has_done"` + UserName string `json:"user_name"` + HeadImg string `json:"head_img"` + UserLevel int `json:"user_level"` + UserScore int `json:"user_score"` + TargetLevel int `json:"target_level"` + GetExtraScore int `json:"get_extra_score"` + TargetScore int `json:"target_score"` + NowWinPoint int `json:"now_win_point"` + ChangeWinPoint int `json:"change_win_point"` + TargetWinPoint int `json:"target_win_point"` + Mileage int `json:"mileage"` + JumpHeight float32 `json:"jump_height"` + FinishTime int `json:"finish_time"` + FinishTime1 int `json:"finish_time1"` + FinishTime2 int `json:"finish_time2"` + FastestSpeed int `json:"fastest_speed"` + AttackPower int `json:"attack_power"` + ExpireAt sql.NullTime `json:"expire_at"` + CreateAt sql.NullTime `json:"create_at"` + UpdateAt sql.NullTime `json:"update_at"` + TotalRank int `json:"total_rank"` } type RankInfo struct { Index int `json:"index"` diff --git a/app/service/live_room_service.go b/app/service/live_room_service.go index 49249e6..136c56b 100644 --- a/app/service/live_room_service.go +++ b/app/service/live_room_service.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/google/uuid" "github.com/gorilla/websocket" + "math" "strconv" "time" ) @@ -488,6 +489,7 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac type userScoreRecord struct { Value int Score int + WinPoint int Track int Job int UserName string @@ -528,6 +530,7 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac liveRoomUserScoreRecord[giftRecord.UserId] = userScoreRecord{ Value: giftRecord.TotalValue, Score: giftRecord.TotalScore, + WinPoint: giftRecord.WinPoint, Track: giftRecord.Track, Job: giftRecord.Job, UserName: giftRecord.UserName, @@ -579,20 +582,44 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac championScore := partScore * championShare // 冠军队伍分得积分 remainingScore := partScore * remainingShare //非冠军完成队伍分得积分 + winPointRobedNum := 0 + + // 计算获胜方能够获得多少的胜点 + for _, scoreRecord := range liveRoomUserScoreRecord { + // 没有完赛的队伍的连胜需要分给冠军队伍30% + if scoreRecord.Track != championTrack && !utils.Exists(finishTrackArr, scoreRecord.Track) { + winPointRobedNum += int(math.Floor(float64(scoreRecord.WinPoint)*0.3 + 0.5)) + } + } + results := []models.LiveRoomResult{} for userId, scoreRecord := range liveRoomUserScoreRecord { - getScore := 0 + getOriginScore := 0 + getExtraScore := 0 + getFinalScore := 0 isFinish := 0 isChampion := 0 + changeWinPoint := 0 if scoreRecord.Track == championTrack { - getScore = championScore * scoreRecord.Score / liveRoomChampionTrackTotalScore + getOriginScore = championScore * scoreRecord.Score / liveRoomChampionTrackTotalScore + // 按照积分贡献比例,分赢得的积分 + changeWinPoint = winPointRobedNum * scoreRecord.Score / liveRoomChampionTrackTotalScore + // 根据胜场次数计算获得的加成分数 + getExtraScore, _ = utils.CalculateExtraScoreByWinPoint(getOriginScore) + isFinish = 1 isChampion = 1 } else if utils.Exists(finishTrackArr, scoreRecord.Track) { - getScore = remainingScore * scoreRecord.Score / liveRoomOtherFinishTrackTotalScore + getOriginScore = remainingScore * scoreRecord.Score / liveRoomOtherFinishTrackTotalScore isFinish = 1 isChampion = 0 + } else { + // 未完赛就被抢夺一部分胜点 + changeWinPoint = -int(math.Floor(float64(scoreRecord.WinPoint)*0.3 + 0.5)) } + + getFinalScore = getOriginScore + getExtraScore + isBiggest := 0 if trackBiggestInfo, exists := trackBiggestMap[scoreRecord.Track]; exists { if trackBiggestInfo.UserId == userId { @@ -601,7 +628,8 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac } // 计算用户将获得的积分和等级 - targetScore := scoreRecord.UserScore + getScore + targetWinPoint := scoreRecord.WinPoint + changeWinPoint + targetScore := scoreRecord.UserScore + getFinalScore targetLevelInfo, err := manager.Get().LevelManager().GetLevelInfoByUpperScore(targetScore) targetLevel := 1 if err != nil { @@ -637,32 +665,36 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac } results = append(results, models.LiveRoomResult{ - LiveRoomID: liveRoomId, - Times: liveRoomInfo.Times, - UserID: userId, - GameScore: liveRoomTotalScore, - Track: scoreRecord.Track, // 需要根据实际情况设置 - Job: scoreRecord.Job, // 需要根据实际情况设置 - IsChampion: isChampion, - IsFinish: isFinish, - IsBiggest: isBiggest, - GiftValue: scoreRecord.Value, // 需要根据实际情况设置 - GiftScore: scoreRecord.Score, - GetScore: getScore, - HasDone: 0, - UserName: scoreRecord.UserName, - HeadImg: scoreRecord.HeadImg, - UserLevel: scoreRecord.UserLevel, - UserScore: scoreRecord.UserScore, - TargetLevel: targetLevel, - TargetScore: targetScore, - Mileage: mileage, - JumpHeight: jumpHeight, - FinishTime: finishTime, - FinishTime1: finishTime1, - FinishTime2: finishTime2, - FastestSpeed: fastestSpeed, - AttackPower: attackPower, + LiveRoomID: liveRoomId, + Times: liveRoomInfo.Times, + UserID: userId, + GameScore: liveRoomTotalScore, + Track: scoreRecord.Track, // 需要根据实际情况设置 + Job: scoreRecord.Job, // 需要根据实际情况设置 + IsChampion: isChampion, + IsFinish: isFinish, + IsBiggest: isBiggest, + GiftValue: scoreRecord.Value, // 需要根据实际情况设置 + GiftScore: scoreRecord.Score, + GetExtraScore: getExtraScore, + GetScore: getFinalScore, + NowWinPoint: scoreRecord.WinPoint, + ChangeWinPoint: changeWinPoint, + TargetWinPoint: targetWinPoint, + HasDone: 0, + UserName: scoreRecord.UserName, + HeadImg: scoreRecord.HeadImg, + UserLevel: scoreRecord.UserLevel, + UserScore: scoreRecord.UserScore, + TargetLevel: targetLevel, + TargetScore: targetScore, + Mileage: mileage, + JumpHeight: jumpHeight, + FinishTime: finishTime, + FinishTime1: finishTime1, + FinishTime2: finishTime2, + FastestSpeed: fastestSpeed, + AttackPower: attackPower, ExpireAt: sql.NullTime{ Time: time.Now(), Valid: true, diff --git a/app/utils/game.go b/app/utils/game.go index 9a13b4a..9ef0fc5 100644 --- a/app/utils/game.go +++ b/app/utils/game.go @@ -4,6 +4,7 @@ package utils import ( "BlazeRider-backend/config" "fmt" + "math" "math/rand" "strconv" "strings" @@ -83,3 +84,10 @@ func GetRandomJobId() (int, error) { track := jobArr[randomIndex] // 获取随机值 return track, nil } + +// CalculateExtraScoreByWinPoint 通过配置的胜点抢夺积分倍率来计算额外获取积分 +func CalculateExtraScoreByWinPoint(score int) (int, error) { + winPointRobRate := config.Get().Game.WinPointRobRate + extraScore := int(math.Floor(float64(winPointRobRate * float32(score)))) + return extraScore, nil +} diff --git a/config/config.go b/config/config.go index 46d73c3..d7986d4 100644 --- a/config/config.go +++ b/config/config.go @@ -34,8 +34,9 @@ type DouyinConfig struct { } type GameConfig struct { - Team string `yaml:"team"` - Job string `yaml:"job"` + Team string `yaml:"team"` + Job string `yaml:"job"` + WinPointRobRate float32 `yaml:"win_point_rob_rate"` // 胜点抢夺倍率 } type Config struct { @@ -252,5 +253,8 @@ func mergeGameConfig(base, override GameConfig) GameConfig { if override.Job != "" { base.Job = override.Job } + if override.WinPointRobRate != 0 { + base.WinPointRobRate = override.WinPointRobRate + } return base } diff --git a/configs/config.prod.yaml b/configs/config.prod.yaml index 4a9b1d2..ef3141e 100644 --- a/configs/config.prod.yaml +++ b/configs/config.prod.yaml @@ -14,4 +14,6 @@ database: game: team: "1,2,3" - job: "" \ No newline at end of file + job: "" + # 胜场抢夺比例 + win_point_rob_rate: 0.3 \ No newline at end of file -- Gitee From cf1911c2ff73cab3502ce19aa003511bd0dec87f Mon Sep 17 00:00:00 2001 From: udieudie Date: Sat, 28 Jun 2025 16:09:13 +0800 Subject: [PATCH 2/2] =?UTF-8?q?david/feat:=E5=A2=9E=E5=8A=A0=E8=83=9C?= =?UTF-8?q?=E5=9C=BA=E6=95=B0=E5=8F=8A=E8=8E=B7=E8=83=9C=E6=96=B9=E6=8A=A2?= =?UTF-8?q?=E5=A4=BA=E8=83=9C=E5=9C=BA=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/dyPushController.go | 2 +- app/controller/httpController.go | 4 +- app/controller/indexController.go | 6 ++ app/manager/gift_record_mysql_storage.go | 2 +- app/manager/live_room_mamanger.go | 62 ++++++++++--------- app/manager/live_room_mysql_storage.go | 76 +++++++++++++----------- app/manager/user_manager.go | 3 +- app/manager/user_mysql_storage.go | 60 ++++++++++++------- app/models/models.go | 2 + app/service/live_room_service.go | 46 +++++++++++--- app/utils/game.go | 37 +++++++++++- templates/index.html | 6 +- 12 files changed, 205 insertions(+), 101 deletions(-) diff --git a/app/controller/dyPushController.go b/app/controller/dyPushController.go index b77ef08..013835d 100644 --- a/app/controller/dyPushController.go +++ b/app/controller/dyPushController.go @@ -180,7 +180,7 @@ func (h *dyPushController) dyPushPingLun(c *gin.Context) { UserName: existingUser.UserName, HeadImg: existingUser.HeadImg, Level: existingUser.Level, - Rank: existingUser.Rank, + UserRank: existingUser.UserRank, Score: existingUser.Score, }) } diff --git a/app/controller/httpController.go b/app/controller/httpController.go index 8083de9..d568dec 100644 --- a/app/controller/httpController.go +++ b/app/controller/httpController.go @@ -702,7 +702,7 @@ func (h *HttpController) GetPingLun(c *gin.Context) { UserName: existingUser.UserName, HeadImg: existingUser.HeadImg, Level: existingUser.Level, - Rank: existingUser.Rank, + UserRank: existingUser.UserRank, Score: existingUser.Score, }) } @@ -890,7 +890,7 @@ func (h *HttpController) getPingLunChuanQi(c *gin.Context) { UserName: existingUser.UserName, HeadImg: existingUser.HeadImg, Level: existingUser.Level, - Rank: existingUser.Rank, + UserRank: existingUser.UserRank, Score: existingUser.Score, }) } diff --git a/app/controller/indexController.go b/app/controller/indexController.go index 74bd116..3810a0c 100644 --- a/app/controller/indexController.go +++ b/app/controller/indexController.go @@ -227,6 +227,8 @@ func (i *IndexController) HandleStartGameMessage(conn *websocket.Conn, msg Messa Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -303,6 +305,8 @@ func (i *IndexController) HandleEndGameMessage(conn *websocket.Conn, msg Message Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -437,6 +441,8 @@ func (i *IndexController) GenerateScoreMessage(currentScore int) models.LiveEven Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) diff --git a/app/manager/gift_record_mysql_storage.go b/app/manager/gift_record_mysql_storage.go index 9817c0b..d9c9b2f 100644 --- a/app/manager/gift_record_mysql_storage.go +++ b/app/manager/gift_record_mysql_storage.go @@ -374,7 +374,6 @@ func (grm *GiftRecordMysqlStorage) GetGiftRecordWithUserInfoByLiveRoomAndTimes(l &record.OneValue, &record.TotalValue, &record.Score, - &record.WinPoint, &record.TotalScore, &record.GiftLevel, &record.GiftUpgrading, @@ -382,6 +381,7 @@ func (grm *GiftRecordMysqlStorage) GetGiftRecordWithUserInfoByLiveRoomAndTimes(l &record.UserHeadImg, &record.UserLevel, &record.UserScore, + &record.WinPoint, &record.ExpireAt, &record.CreateAt, &record.UpdateAt, diff --git a/app/manager/live_room_mamanger.go b/app/manager/live_room_mamanger.go index 168b9d4..8cb77ae 100644 --- a/app/manager/live_room_mamanger.go +++ b/app/manager/live_room_mamanger.go @@ -288,35 +288,39 @@ func (lrm *LiveRoomManager) BatchInsertLiveRoomResults(results []models.LiveRoom var mysqlResults []LiveRoomResultMysqlInfo for _, result := range results { mysqlResults = append(mysqlResults, LiveRoomResultMysqlInfo{ - LiveRoomID: result.LiveRoomID, - Times: result.Times, - UserID: result.UserID, - GameScore: result.GameScore, - Track: result.Track, - Job: result.Job, - IsChampion: result.IsChampion, - IsFinish: result.IsFinish, - IsBiggest: result.IsBiggest, - GiftValue: result.GiftValue, - GiftScore: result.GiftScore, - GetScore: result.GetScore, - HasDone: result.HasDone, - UserName: result.UserName, - HeadImg: result.HeadImg, - UserLevel: result.UserLevel, - UserScore: result.UserScore, - TargetLevel: result.TargetLevel, - TargetScore: result.TargetScore, - Mileage: result.Mileage, - JumpHeight: result.JumpHeight, - FinishTime: result.FinishTime, - FinishTime1: result.FinishTime1, - FinishTime2: result.FinishTime2, - FastestSpeed: result.FastestSpeed, - AttackPower: result.AttackPower, - ExpireAt: result.ExpireAt, - CreateAt: result.CreateAt, - UpdateAt: result.UpdateAt, + LiveRoomID: result.LiveRoomID, + Times: result.Times, + UserID: result.UserID, + GameScore: result.GameScore, + Track: result.Track, + Job: result.Job, + IsChampion: result.IsChampion, + IsFinish: result.IsFinish, + IsBiggest: result.IsBiggest, + GiftValue: result.GiftValue, + GiftScore: result.GiftScore, + GetExtraScore: result.GetExtraScore, + GetScore: result.GetScore, + NowWinPoint: result.NowWinPoint, + ChangeWinPoint: result.ChangeWinPoint, + TargetWinPoint: result.TargetWinPoint, + HasDone: result.HasDone, + UserName: result.UserName, + HeadImg: result.HeadImg, + UserLevel: result.UserLevel, + UserScore: result.UserScore, + TargetLevel: result.TargetLevel, + TargetScore: result.TargetScore, + Mileage: result.Mileage, + JumpHeight: result.JumpHeight, + FinishTime: result.FinishTime, + FinishTime1: result.FinishTime1, + FinishTime2: result.FinishTime2, + FastestSpeed: result.FastestSpeed, + AttackPower: result.AttackPower, + ExpireAt: result.ExpireAt, + CreateAt: result.CreateAt, + UpdateAt: result.UpdateAt, }) } diff --git a/app/manager/live_room_mysql_storage.go b/app/manager/live_room_mysql_storage.go index 2221b1e..a929d33 100644 --- a/app/manager/live_room_mysql_storage.go +++ b/app/manager/live_room_mysql_storage.go @@ -51,36 +51,40 @@ type LiveTrackWithUserMysqlInfo struct { // LiveRoomResultMysqlInfo 表示 live_room_result 表的结构 type LiveRoomResultMysqlInfo struct { - LiveRoomID string `db:"live_room_id"` - Times int `db:"times"` - UserID string `db:"user_id"` - GameScore int `db:"game_score"` - Track int `db:"track"` - Job int `db:"job"` - IsChampion int `db:"is_champion"` - IsFinish int `db:"is_finish"` - IsBiggest int `db:"is_biggest"` - GiftValue int `db:"gift_value"` - GiftScore int `db:"gift_score"` - GetScore int `db:"get_score"` - HasDone int `db:"has_done"` - UserName string `db:"user_name"` - HeadImg string `db:"head_img"` - UserLevel int `db:"user_level"` - UserScore int `db:"user_score"` - TargetLevel int `db:"target_level"` - TargetScore int `db:"target_score"` - Mileage int `db:"mileage"` - JumpHeight float32 `db:"jump_height"` - FinishTime int `db:"jump_height"` - FinishTime1 int `db:"jump_height1"` - FinishTime2 int `db:"jump_height2"` - FastestSpeed int `db:"jump_height"` - AttackPower int `db:"attack_power"` - ExpireAt sql.NullTime `db:"expire_at"` - CreateAt sql.NullTime `db:"create_at"` - UpdateAt sql.NullTime `db:"update_at"` - TotalRank int `db:"total_rank"` + LiveRoomID string `db:"live_room_id"` + Times int `db:"times"` + UserID string `db:"user_id"` + GameScore int `db:"game_score"` + Track int `db:"track"` + Job int `db:"job"` + IsChampion int `db:"is_champion"` + IsFinish int `db:"is_finish"` + IsBiggest int `db:"is_biggest"` + GiftValue int `db:"gift_value"` + GiftScore int `db:"gift_score"` + GetExtraScore int `db:"get_extra_score"` + GetScore int `db:"get_score"` + NowWinPoint int `db:"now_win_point"` + ChangeWinPoint int `db:"change_win_point"` + TargetWinPoint int `db:"target_win_point"` + HasDone int `db:"has_done"` + UserName string `db:"user_name"` + HeadImg string `db:"head_img"` + UserLevel int `db:"user_level"` + UserScore int `db:"user_score"` + TargetLevel int `db:"target_level"` + TargetScore int `db:"target_score"` + Mileage int `db:"mileage"` + JumpHeight float32 `db:"jump_height"` + FinishTime int `db:"jump_height"` + FinishTime1 int `db:"jump_height1"` + FinishTime2 int `db:"jump_height2"` + FastestSpeed int `db:"jump_height"` + AttackPower int `db:"attack_power"` + ExpireAt sql.NullTime `db:"expire_at"` + CreateAt sql.NullTime `db:"create_at"` + UpdateAt sql.NullTime `db:"update_at"` + TotalRank int `db:"total_rank"` } type GameDataMysqlInfo struct { @@ -403,10 +407,11 @@ func (lrm *LiveRoomMysqlStorage) GetLiveTrackInfosWithUserInfoByTime(liveRoomId func (lrm *LiveRoomMysqlStorage) BatchInsertLiveRoomResults(results []LiveRoomResultMysqlInfo) error { stmt, err := db.GetDB().Prepare(`INSERT INTO live_room_result ( live_room_id, times, user_id, game_score, track, job, is_champion, is_finish, is_biggest, gift_value, gift_score, - get_score, has_done, user_name, head_img, user_level, user_score, target_level, target_score, - mileage, jump_height, finish_time, finish_time1, finish_time2, fastest_speed, attack_power, + get_extra_score, get_score, has_done, user_name, head_img, user_level, user_score, target_level, target_score, + now_win_point, change_win_point, target_win_point, + mileage, jump_height, finish_time, finish_time1, finish_time2, fastest_speed, attack_power, expire_at, create_at, update_at - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`) if err != nil { return fmt.Errorf("prepare statement error: %v", err) } @@ -415,9 +420,10 @@ func (lrm *LiveRoomMysqlStorage) BatchInsertLiveRoomResults(results []LiveRoomRe for _, result := range results { _, err := stmt.Exec( result.LiveRoomID, result.Times, result.UserID, result.GameScore, result.Track, result.Job, - result.IsChampion, result.IsFinish, result.IsBiggest, result.GiftValue, result.GiftScore, result.GetScore, + result.IsChampion, result.IsFinish, result.IsBiggest, result.GiftValue, result.GiftScore, result.GetExtraScore, result.GetScore, result.HasDone, result.UserName, result.HeadImg, result.UserLevel, result.UserScore, - result.TargetLevel, result.TargetScore, result.Mileage, result.JumpHeight, + result.TargetLevel, result.TargetScore, result.NowWinPoint, result.ChangeWinPoint, result.TargetWinPoint, + result.Mileage, result.JumpHeight, result.FinishTime, result.FinishTime1, result.FinishTime2, result.FastestSpeed, result.AttackPower, result.ExpireAt, ) diff --git a/app/manager/user_manager.go b/app/manager/user_manager.go index c3caa17..5281bfc 100644 --- a/app/manager/user_manager.go +++ b/app/manager/user_manager.go @@ -12,7 +12,8 @@ type UserInfo struct { UserName string HeadImg string Level int - Rank int + UserRank int + WinPoint int Score int } diff --git a/app/manager/user_mysql_storage.go b/app/manager/user_mysql_storage.go index 8472b50..212fb60 100644 --- a/app/manager/user_mysql_storage.go +++ b/app/manager/user_mysql_storage.go @@ -41,7 +41,7 @@ func (s *userMySQLStorage) InitializeUser(userID, userName, headImg string, leve func (um *userMySQLStorage) GetUser(userID string) (*UserInfo, error) { var user UserInfo err := db.GetDB().QueryRow(` - SELECT user_id, user_name, head_img, level, score + SELECT user_id, user_name, head_img, level, score, user_rank, win_point FROM users WHERE user_id = ? `, userID).Scan( @@ -50,6 +50,8 @@ func (um *userMySQLStorage) GetUser(userID string) (*UserInfo, error) { &user.HeadImg, &user.Level, &user.Score, + &user.UserRank, + &user.WinPoint, ) if err != nil { @@ -96,26 +98,42 @@ func (um *userMySQLStorage) UpdateScore(userID string, delta int) error { func (um *userMySQLStorage) SetUserScoreByLiveRoomResult() error { // 更新用户积分 _, err := db.GetDB().Exec(` - INSERT INTO users (user_id, user_name, head_img, score, mileage, jump_height) - SELECT - lrr.user_id , - ANY_VALUE ( u.user_name ) AS user_name,-- 随机取一个值(因主键依赖,实际唯一) - ANY_VALUE ( u.head_img ) AS head_img, - SUM( - COALESCE ( lrr.get_score, 0 )) AS total_score, - SUM( - COALESCE ( lrr.mileage, 0 )) AS total_mileage, - SUM( - COALESCE ( lrr.jump_height, 0 )) AS total_jump_height - FROM - live_room_result lrr - left JOIN users u ON lrr.user_id = u.user_id - GROUP BY - user_id - ON DUPLICATE KEY UPDATE score = VALUES(score), - mileage = VALUES(mileage), - jump_height = VALUES(jump_height), - updated_at = CURRENT_TIMESTAMP; + INSERT INTO users (user_id, user_name, head_img, score, win_point, mileage, jump_height, user_rank) + SELECT + user_id, + user_name, + head_img, + total_score, + total_win_point, + total_mileage, + total_jump_height, + CASE + WHEN total_score > 0 + THEN RANK() OVER (ORDER BY total_score DESC) + ELSE NULL + END AS user_rank + FROM ( + SELECT + lrr.user_id, + ANY_VALUE(lrr.user_name) AS user_name, + ANY_VALUE(lrr.head_img) AS head_img, + SUM(IF(lrr.get_score > 0, COALESCE(lrr.get_score, 0), 0)) AS total_score, + SUM(COALESCE(lrr.change_win_point, 0)) + + COUNT(CASE WHEN lrr.is_champion = 1 THEN 1 END) AS total_win_point, + SUM(COALESCE(lrr.mileage, 0)) AS total_mileage, + SUM(COALESCE(lrr.jump_height, 0)) AS total_jump_height + FROM live_room_result lrr + GROUP BY lrr.user_id + ) AS aggregated_data + ON DUPLICATE KEY UPDATE + score = VALUES(score), + win_point = VALUES(win_point), + mileage = VALUES(mileage), + jump_height = VALUES(jump_height), + user_name = VALUES(user_name), + head_img = VALUES(head_img), + user_rank = VALUES(user_rank), + updated_at = CURRENT_TIMESTAMP; `) if err != nil { return err diff --git a/app/models/models.go b/app/models/models.go index e714df9..8f3b328 100644 --- a/app/models/models.go +++ b/app/models/models.go @@ -19,6 +19,8 @@ type LiveEventData struct { Data struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 diff --git a/app/service/live_room_service.go b/app/service/live_room_service.go index 136c56b..72a9c82 100644 --- a/app/service/live_room_service.go +++ b/app/service/live_room_service.go @@ -49,14 +49,18 @@ func (ls LiveRoomService) OneUserJoinTrack(liveRoomID string, userId string, nic userName := "" userHeadImg := "" level := 0 - UserScore := 0 + userScore := 0 + userRank := 0 + winPoint := 0 //userInfo, err := i.userManager.GetUser(userId) userInfo, err := manager.Get().UserManager().GetUser(userId) if err == nil { userName = userInfo.UserName userHeadImg = userInfo.HeadImg level = userInfo.Level - UserScore = userInfo.Score + userScore = userInfo.Score + userRank = userInfo.UserRank + winPoint = userInfo.WinPoint } if liveRoomID != utils.TestRoomId { @@ -72,6 +76,8 @@ func (ls LiveRoomService) OneUserJoinTrack(liveRoomID string, userId string, nic Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) @@ -104,7 +110,9 @@ func (ls LiveRoomService) OneUserJoinTrack(liveRoomID string, userId string, nic Nickname: userName, Level: level, AvatarURL: userHeadImg, - UserScore: UserScore, + UserScore: userScore, + UserRank: userRank, + WinPoint: winPoint, Timestamp: now.UnixMilli(), }, } @@ -121,6 +129,8 @@ func (ls LiveRoomService) SendTestPingLunNoStoage(liveRoomID string, userId, use Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) @@ -296,6 +306,8 @@ func (ls LiveRoomService) OneUserSendGift(msgID string, liveRoomID string, userI Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -361,6 +373,8 @@ func (ls LiveRoomService) SendTestGiftNoStoage(liveRoomID string, userId, userNa Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -426,6 +440,8 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -492,6 +508,7 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac WinPoint int Track int Job int + UserId string UserName string HeadImg string UserLevel int @@ -517,8 +534,10 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac liveRoomUserScoreRecord[giftRecord.UserId] = userScoreRecord{ Value: scoreRecord.Value + giftRecord.TotalValue, Score: scoreRecord.Score + giftRecord.TotalScore, + WinPoint: giftRecord.WinPoint, Track: giftRecord.Track, Job: giftRecord.Job, + UserId: giftRecord.UserId, UserName: giftRecord.UserName, HeadImg: giftRecord.UserHeadImg, UserLevel: giftRecord.UserLevel, @@ -533,6 +552,7 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac WinPoint: giftRecord.WinPoint, Track: giftRecord.Track, Job: giftRecord.Job, + UserId: giftRecord.UserId, UserName: giftRecord.UserName, HeadImg: giftRecord.UserHeadImg, UserLevel: giftRecord.UserLevel, @@ -603,9 +623,12 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac if scoreRecord.Track == championTrack { getOriginScore = championScore * scoreRecord.Score / liveRoomChampionTrackTotalScore // 按照积分贡献比例,分赢得的积分 - changeWinPoint = winPointRobedNum * scoreRecord.Score / liveRoomChampionTrackTotalScore - // 根据胜场次数计算获得的加成分数 - getExtraScore, _ = utils.CalculateExtraScoreByWinPoint(getOriginScore) + fmt.Println("here111", float64(winPointRobedNum)) + fmt.Println("here222", float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)) + fmt.Println("here333", float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)+0.5) + fmt.Println("here444", math.Floor(float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)+0.5)) + fmt.Println("here555", int(math.Floor(float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)+0.5))) + changeWinPoint = int(math.Floor(float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore) + 0.5)) isFinish = 1 isChampion = 1 @@ -618,6 +641,9 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac changeWinPoint = -int(math.Floor(float64(scoreRecord.WinPoint)*0.3 + 0.5)) } + // 根据胜场次数计算获得的加成分数 + getExtraScore, _ = utils.CalculateExtraScoreByWinPoint(getOriginScore, changeWinPoint) + getFinalScore = getOriginScore + getExtraScore isBiggest := 0 @@ -628,7 +654,7 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac } // 计算用户将获得的积分和等级 - targetWinPoint := scoreRecord.WinPoint + changeWinPoint + targetWinPoint := scoreRecord.WinPoint + changeWinPoint + isChampion targetScore := scoreRecord.UserScore + getFinalScore targetLevelInfo, err := manager.Get().LevelManager().GetLevelInfoByUpperScore(targetScore) targetLevel := 1 @@ -716,6 +742,8 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -798,6 +826,8 @@ func DealBackDataByTime(conn *websocket.Conn, liveRoomId string, times int, time Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) @@ -864,6 +894,8 @@ func DealBackDataByTime(conn *websocket.Conn, liveRoomId string, times int, time Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 diff --git a/app/utils/game.go b/app/utils/game.go index 9ef0fc5..37a132b 100644 --- a/app/utils/game.go +++ b/app/utils/game.go @@ -86,8 +86,39 @@ func GetRandomJobId() (int, error) { } // CalculateExtraScoreByWinPoint 通过配置的胜点抢夺积分倍率来计算额外获取积分 -func CalculateExtraScoreByWinPoint(score int) (int, error) { - winPointRobRate := config.Get().Game.WinPointRobRate - extraScore := int(math.Floor(float64(winPointRobRate * float32(score)))) +func CalculateExtraScoreByWinPoint(score int, winPoint int) (int, error) { + rate := float64(0) + // 10 ~ 20 5% + // 20 ~ 50 8% + // 50 ~ 100 12% + // 100 ~ 200 15% + // 200 ~ 500 18% + // 500 ~ 1000 22% + // 1000 ~ 2000 25% + // 2000 ~ 3000 30% + // 3000 ~ 5000 40% + // 5000 50% + if winPoint >= 10 && winPoint < 20 { + rate = 0.05 + } else if winPoint >= 20 && winPoint < 50 { + rate = 0.08 + } else if winPoint >= 50 && winPoint < 100 { + rate = 0.12 + } else if winPoint >= 100 && winPoint < 200 { + rate = 0.15 + } else if winPoint >= 200 && winPoint < 500 { + rate = 0.18 + } else if winPoint >= 500 && winPoint < 1000 { + rate = 0.22 + } else if winPoint >= 1000 && winPoint < 2000 { + rate = 0.25 + } else if winPoint >= 2000 && winPoint < 3000 { + rate = 0.3 + } else if winPoint >= 3000 && winPoint < 5000 { + rate = 0.4 + } else if winPoint >= 5000 { + rate = 0.5 + } + extraScore := int(math.Floor(rate * float64(score))) return extraScore, nil } diff --git a/templates/index.html b/templates/index.html index e6eb355..f0f3f87 100644 --- a/templates/index.html +++ b/templates/index.html @@ -868,6 +868,8 @@ sec_gift_id: data.sec_gift_id, content: data.content, camp: data.camp, + rank: data.user_rank, + win_point: data.win_point, job: data.job, gift_num: data.gift_num, gift_value: data.gift_value, @@ -875,7 +877,9 @@ nickname: data.nickname, timestamp: data.timestamp }; - consoleText('有用户 :', JoinTrackEvent.nickname, "(", JoinTrackEvent.sec_openid, "),加入摩托:", JoinTrackEvent.camp, ",选择职业:", JoinTrackEvent.job); + consoleText('有用户 :', JoinTrackEvent.nickname, "(", JoinTrackEvent.sec_openid, "),加入摩托:", JoinTrackEvent.camp, ",选择职业:", JoinTrackEvent.job + , ", 排名:" , JoinTrackEvent.rank, ", 胜场数:" , JoinTrackEvent.win_point + ); } // 处理用户加入直播间 -- Gitee