package model import ( model2 "roserver/baseserver/model" gameModel "roserver/game/model" "roserver/serverproto" "strconv" ) type LiveAnswerRoom struct { LiveRoom 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 } func newLiveAnswerRoom(roomId uint32, tickInterval uint32) *LiveAnswerRoom { room := &LiveAnswerRoom{ LiveRoom: newLiveRoom(roomId, LIVEROOM_TYPE_ANSWER, tickInterval), } room.SetVF() return room } func (self *LiveAnswerRoom) SetVF() { self.VF_GetMaxReadyNum = self.GetMaxReadyNum self.VF_GetCMDPlayDataList = self.GetCMDPlayDataList self.VF_GetShowResultList = self.GetShowResultList self.VF_GetShowRewardList = self.GetShowRewardList self.VF_HasShowData = self.HasShowData self.VF_GetShowData = self.GetShowData self.VF_HandleShowSubmit = self.HandleShowSubmit self.VF_GetStageEnterParams = self.GetStageEnterParams self.VF_ReadyStart = self.ReadyStart self.VF_ShowStart = self.ShowStart self.VF_CheckIfShowEnd = self.CheckIfShowEnd self.VF_ShowEnd = self.ShowEnd self.VF_HandlePlayCMD = self.HandlePlayCMD } func (self *LiveAnswerRoom) GetMaxReadyNum(roomType uint32) int { return LIVEROOM_ANSWER_MAX_READY_NUM } 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, }) } } 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) } } // Play命令:用于给客户端发送命令,显示题目,这里返回客户端显示题目相关数据 func (self *LiveAnswerRoom) GetCMDPlayDataList(readyUidList []uint64, uid uint64, cfg *serverproto.LiveRoomTalkCfg) []*serverproto.KeyValueType64 { return nil } // 返回玩家分数排名 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.KeyValueType64 { rewardList := make([]*serverproto.KeyValueType64, 0) if userAnswerInfo, exist := self.userAnswers[uid]; exist { for _, v := range userAnswerInfo.rewardItems { rewardList = append(rewardList, &serverproto.KeyValueType64{ Key: uint64(v.Key), Value: 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 answerStr := v.StrVal answer, _ := strconv.Atoi(answerStr) self.userAnswers[uid].answers[questionId] = int32(answer) } return submitResult } // 返回进入游戏阶段的一些初始化配置数据,下发题库 func (self *LiveAnswerRoom) GetStageEnterParams(stage uint32) string { stageEnterParams := "" switch stage { case LIVEROOM_STAGE_SHOW: stageEnterParams = "" } return stageEnterParams }