2025-12-05 20:15:55 +08:00
|
|
|
|
package model
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
import (
|
|
|
|
|
|
model2 "roserver/baseserver/model"
|
|
|
|
|
|
gameModel "roserver/game/model"
|
|
|
|
|
|
"roserver/serverproto"
|
|
|
|
|
|
)
|
2025-12-05 20:15:55 +08:00
|
|
|
|
|
|
|
|
|
|
type LiveAnswerRoom struct {
|
|
|
|
|
|
LiveRoom
|
2025-12-09 17:49:29 +08:00
|
|
|
|
questions []*QuestionInfo
|
|
|
|
|
|
userAnswers map[uint64]*AnswerInfo
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type QuestionInfo struct {
|
|
|
|
|
|
questionCfg *serverproto.LiveRoomQuestionCfg
|
|
|
|
|
|
options []int32
|
|
|
|
|
|
answer int32
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type AnswerInfo struct {
|
|
|
|
|
|
uid uint64
|
|
|
|
|
|
answers map[uint64]int32
|
|
|
|
|
|
rewardItems []*serverproto.KeyValueType
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func newLiveAnswerRoom(roomId uint32, tickInterval uint32) *LiveAnswerRoom {
|
|
|
|
|
|
room := &LiveAnswerRoom{
|
|
|
|
|
|
LiveRoom: newLiveRoom(roomId, LIVEROOM_TYPE_ANSWER, tickInterval),
|
|
|
|
|
|
}
|
|
|
|
|
|
return room
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetMaxReadyNum(roomType uint32) int {
|
|
|
|
|
|
return LIVEROOM_ANSWER_MAX_READY_NUM
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
func (self *LiveAnswerRoom) ShowStart() {
|
|
|
|
|
|
self.userAnswers = make(map[uint64]*AnswerInfo)
|
|
|
|
|
|
self.questions = make([]*QuestionInfo, 0)
|
|
|
|
|
|
liveRoomQuestionCfg := serverproto.LiveRoomQuestionCfgLoader
|
|
|
|
|
|
keys := RandomKeys(liveRoomQuestionCfg, 1)
|
|
|
|
|
|
for _, key := range keys {
|
|
|
|
|
|
cfg := liveRoomQuestionCfg[key]
|
|
|
|
|
|
options := []int32{1, 2, 3, 4}
|
|
|
|
|
|
answerIdx := cfg.Answer
|
|
|
|
|
|
ShuffleInPlace(options)
|
|
|
|
|
|
for i := 0; i < len(options); i++ {
|
|
|
|
|
|
if options[i] == answerIdx {
|
|
|
|
|
|
answerIdx = int32(i + 1)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
self.questions = append(self.questions, &QuestionInfo{
|
|
|
|
|
|
questionCfg: cfg,
|
|
|
|
|
|
options: options,
|
|
|
|
|
|
answer: answerIdx,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
func (self *LiveAnswerRoom) CheckAnswer(questionId int32, answer int32) bool {
|
|
|
|
|
|
for _, v := range self.questions {
|
|
|
|
|
|
if v.questionCfg.Id == questionId && v.answer == answer {
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 对游戏进行结算
|
|
|
|
|
|
func (self *LiveAnswerRoom) ShowEnd() {
|
|
|
|
|
|
for _, v := range self.userAnswers {
|
|
|
|
|
|
score := 0
|
|
|
|
|
|
for questionId, answer := range v.answers {
|
|
|
|
|
|
if self.CheckAnswer(int32(questionId), answer) {
|
|
|
|
|
|
score += 1
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if score > 0 {
|
|
|
|
|
|
for _, str := range self.LiveRoom.roomCfg.RewardS {
|
|
|
|
|
|
itemId, itemNum := model2.Str2Res(str)
|
|
|
|
|
|
v.rewardItems = append(v.rewardItems, &serverproto.KeyValueType{Key: itemId, Value: itemNum})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
self.LiveRoom.AddItemList(v.uid, v.rewardItems, int32(gameModel.AddFrom_LiveRoom_Answer), false)
|
|
|
|
|
|
}
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
// Play命令:用于给客户端发送命令,显示题目,这里返回客户端显示题目相关数据
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetPlayDataList(readyUidList []uint64, uid uint64, cfg *serverproto.LiveRoomTalkCfg) []*serverproto.KeyValueType64Str {
|
2025-12-05 20:15:55 +08:00
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
// 返回玩家分数排名
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetShowResultList(readyUidList []uint64, uid uint64) []*serverproto.LiveRoomPlayerInfo {
|
|
|
|
|
|
playerResults := make([]*serverproto.LiveRoomPlayerInfo, 0)
|
|
|
|
|
|
maxResultNum := 10
|
|
|
|
|
|
if userAnswerInfo, exist := self.userAnswers[uid]; exist {
|
|
|
|
|
|
playerInfo := MakeLiveRoomPlayerInfo(uid)
|
|
|
|
|
|
playerInfo.Data = "0"
|
|
|
|
|
|
for k, v := range userAnswerInfo.answers {
|
|
|
|
|
|
questionId := k
|
|
|
|
|
|
answer := v
|
|
|
|
|
|
if self.CheckAnswer(int32(questionId), answer) {
|
|
|
|
|
|
playerInfo.Data = "1"
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
playerResults = append(playerResults, playerInfo)
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, userAnswerInfo := range self.userAnswers {
|
|
|
|
|
|
if len(playerResults) < maxResultNum && userAnswerInfo.uid != uid {
|
|
|
|
|
|
playerInfo := MakeLiveRoomPlayerInfo(userAnswerInfo.uid)
|
|
|
|
|
|
playerInfo.Data = "0"
|
|
|
|
|
|
for k, v := range userAnswerInfo.answers {
|
|
|
|
|
|
questionId := k
|
|
|
|
|
|
answer := v
|
|
|
|
|
|
if self.CheckAnswer(int32(questionId), answer) {
|
|
|
|
|
|
playerInfo.Data = "1"
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
playerResults = append(playerResults, playerInfo)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return playerResults
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回玩家玩游戏得到的奖励
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetShowRewardList(readyUidList []uint64, uid uint64) []*serverproto.KeyValueType64Str {
|
|
|
|
|
|
rewardList := make([]*serverproto.KeyValueType64Str, 0)
|
|
|
|
|
|
if userAnswerInfo, exist := self.userAnswers[uid]; exist {
|
|
|
|
|
|
for _, v := range userAnswerInfo.rewardItems {
|
|
|
|
|
|
rewardList = append(rewardList, &serverproto.KeyValueType64Str{
|
|
|
|
|
|
Key: uint64(v.Key),
|
|
|
|
|
|
StrVal: string(v.Value),
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return rewardList
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (self *LiveAnswerRoom) HasShowData() bool {
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回游戏过程中的状态数据
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetShowData(readyUidList []uint64, uid uint64) []*serverproto.KeyValueType64 {
|
|
|
|
|
|
submitResult := make([]*serverproto.KeyValueType64, 0)
|
|
|
|
|
|
return submitResult
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理玩家在游戏过程中提交的输入,玩家提交选择
|
|
|
|
|
|
func (self *LiveAnswerRoom) HandleShowSubmit(uid uint64, data []*serverproto.KeyValueType64) []*serverproto.KeyValueType64 {
|
|
|
|
|
|
submitResult := make([]*serverproto.KeyValueType64, 0)
|
|
|
|
|
|
if _, exist := self.userAnswers[uid]; exist == false {
|
|
|
|
|
|
self.userAnswers[uid] = &AnswerInfo{
|
|
|
|
|
|
uid: uid,
|
|
|
|
|
|
answers: map[uint64]int32{},
|
|
|
|
|
|
rewardItems: make([]*serverproto.KeyValueType, 0),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, v := range data {
|
|
|
|
|
|
questionId := v.Key
|
|
|
|
|
|
answer := v.Value
|
|
|
|
|
|
self.userAnswers[uid].answers[questionId] = answer
|
|
|
|
|
|
}
|
|
|
|
|
|
return submitResult
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回进入游戏阶段的一些初始化配置数据,下发题库
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetStageEnterParams(stage uint32) string {
|
|
|
|
|
|
stageEnterParams := ""
|
|
|
|
|
|
switch stage {
|
|
|
|
|
|
case LIVEROOM_STAGE_SHOW:
|
|
|
|
|
|
stageEnterParams = ""
|
|
|
|
|
|
}
|
|
|
|
|
|
return stageEnterParams
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|