在上一篇帖子中简单介绍了连接组件,并使用连接实现了一个简单的私聊模型,今天我们来制作一个实时对战答题模型。大体的设计思路是,用户A登记进入连接并将自己的CID添加到URL中转发给好友B,B打开带有URL参数的案例创建一个房间并对A发出邀请,A进入房间后答题开始,答对加分,答错对方加分,最后统计总分数分出胜负。
一.数据库
存储题目的questionTable数据库添加了三个字段,title存放题目;options存放选项,并写成JSON格式;correctIndex存放正确答案的序号。存放玩家数据的userTable数据库中nickname字段存放玩家昵称,matchPoint存放玩家总共的胜局数。


GetQuestions服务负责将questionTable中的题目输出并发送给前台,postUser服务则负责从是数据库中找到获胜玩家(如果找不到就添加一条玩家数据),并更新其matchpoint字段。


下图是案例中使用到的变量

AnswerIndex和opponentAnswerIndex分别表示自己和对方的答题结果,即所选选项的序号,初始值都为-1。
QuestionIndex表示当前题目的序号,currentQuestion用于存储当前题目,全部题目则存放在questionList中。

roomID存放连接创建的房间的ID号;opponentInfo和userInfo分别存放对手和自己的信息,包括得分、昵称和CID码;cid存放的是分享链接中的URL参数,也就是游戏发起人的CID码。

1.第一步,对战的发起玩家A打开案例,输入昵称后点击Start按钮,这时会先对当前玩家进行登记,然后将A的信息存入userInfo,注意此时变量“cid”还是空值,所以执行的是其余的条件分支,系统会将当前用户A的CID码添加到URL中,然后显示一个横幅,上面就是添加好参数的分享链接,用户把这个链接分享给好友B即可。









上面几个步骤之后A,B两个玩家都执行到播放waitInterval触发器了,它实现的是每道题目开始答题前的准备倒计时,并且在结束时会把题目列表中的第一题赋值给“currentQuestion”,然后将自己重置并播放limitInterval触发器。




setVariate动作组会先判断questionIndex的值,如果不等于questionList的行数减1则说明当前题目还不是最后一道题,就会将questionList中的下一道题的内容赋值给currentQuestion,重置waitInterval触发器和limitInterval触发器。




现在来说一下玩家在答题倒计时结束前进行答题的情况,当玩家点击了选项行或者该选项行中的选择钮,就会把该选项的序号赋值给answerIndex,并且如果对手并未答题对局也没有结束(即opponentAnswer仍为初始值-1,finalResult仍未初始值0),则玩家会给对手发送一条method为chose的个人消息,消息内容就是自己的答题结果。然后执行checkAnswer和setVariate两个动作组。



checkAnswer动作组是用来判断当前题目的答题结果,如果opponent大于等于0(即不为初始值-1),则说明当前题目是对手答题,则再判断对手答案是否正确,如果对手答案正确给对手分数加1,choseResult赋值“Opponentscore”表示对方的分,如果错误则给自己分数加1,choseResult赋值“Our score”表示己方得分,如果opponent小于0(即仍为初始值-1),则说明当前题目是己方答题,同理进行判断和对应操作。


