APP下载

基于NIO和Spring Boot的选择题对战系统的设计与实现

2020-02-03陶宇阳蒋玉茹刘林峰王岩

电子技术与软件工程 2020年19期
关键词:对局自动机服务端

陶宇阳 蒋玉茹 刘林峰 王岩

(北京信息科技大学计算机学院 北京市 100101)

随着互联网在的快速发展,学生们拥有了许多可以获取知识的渠道,但是如何短期提升学生获取知识的成就感使学生进一步提升学习的动力仍是一大重要问题,同时在一局快节奏的对战游戏中,利用自己已有的知识和问题分析能力赢得比赛正是一种能快速获得成就感的方式。

目前,已存在许多成熟的大型网络学习平台及互动答题游戏形式,这些平台普遍拥有很多的学习资源而游戏也拥有较为成熟的游戏方案,但是学习平台很容易陷入“学不动,不想学”的困境,单纯的游戏又与学习不相关。鉴于此,立足于当前广大学生的学习模式单一的情况,根据学生的学习需要,结合网络对战游戏能够快速获得成就感的特点,本文设计并开发了一款可以在线匹配多人组队答题(专业知识)的网络对战游戏,致力于提供在线匹配、多人组队、同步答题、积分多者获胜等轻量化、个性化的游戏平台解决方案。

本项目所设计与开发的系统与北京信息科技大学计算机学院的程序设计基础(C 语言)过程化考核平台紧密融合,已经部署在校园内网环境中。系统既以学生为主体,寓学于乐,为学生提供更加轻松的学习环境,又在潜移默化中提高学生的程序设计及C 语言应用水平,同时,系统亦可帮助教师了解学生的学习情况,及时调整教学策略,最终使学生、教师和学校都可以获益。

1 系统概述

本系统包括基于Spring Boot 框架搭建的服务端和Android 客户端。系统模块结构图如图1所示。

2 题目内容与对战规则

2.1 题目内容

采用北京信息科技大学计算机学院的程序设计基础(C 语言)过程化考核平台的习题库中的习题为出题内容。习题库中有困难、中等、容易三种评级的题目,由于困难评级的题目往往涉及长代码阅读或复杂计算,通常不能在短时间内解答,因此不适合在本对战系统中使用,系统仅采用简单和中等两种评级的题目。不同评级的题目有不同的答题时间,中等难度的题目答题时间为30 秒,容易难度的题目答题时间为10 秒。系统针对每一组成功匹配的用户,从题库中随机抽取若干题目作为该组用户的对战题目。

2.2 平衡匹配

对战系统采用基于对战积分的平衡匹配算法在匹配池中找到合适的一组用户分成两个队伍组成对局。匹配算法尽可能保证对局双方的平均水平接近,同时,队内的各个成员水平接近。避免出现双方的知识水平差距过大,使得对局失去了紧张刺激的感觉,从而影响了用户的游戏体验。

2.3 对战规则

对局中,服务端通过统一消息指令的收发,保证每道题目的内容和选项尽可能同时出现在各个用户的手机屏幕上,每个客户端反应在界面上的题目答题时限(倒计时)也尽可能保持一致。

图1:选择题对战系统系统模块结构图

图2:匹配算法的存储结构简略图

每道题目都有相同的初始分数,题目分数会随着作答时间的流逝而减少。每名成员对每一道题仅有一次选择答案的机会,无论答案是否正确。若某一个成员选择了正确的答案,那么其所属的队伍就会加分。分值是该成员选择答案时的题目分数。最后,队伍得分高的一方获胜。

对战双方想获取胜利就要在尽可能短的时间内选出正确答案,这样的对战规则保证了游戏有一定的竞技性,用户在答题过程中,可以发现在课堂上没有及时掌握的知识。不同于课堂上严肃的气氛,相对紧张又不乏趣味的对战过程可以加深用户对平时容易忘记的细节知识点的记忆。同时,选择题的答题方式简单明确,不会像填空、解答题一样产生语义上的误差,适合在手机上操作,符合本系统在轻松使用时学习知识的设计初衷。

3 服务端系统设计

3.1 服务端整体结构

服务端分为对战核心模块和题目数据供给模块。其中,对战核心模块提供网络通信服务、匹配服务和对局服务;题目数据供给模块提供客户端访问数据库的HTTP 接口,按需求获取题目信息。

对战核心模块下属的各个服务独立运行于不同的线程中,通过消息队列进行线程间的通讯。

图3:自动机的图结构数据

(1)网络通信服务负责与各客户端建立连接,监听并接收消息,发送消息,封装消息为JavaBean。

(2)匹配服务运行设计好的平衡匹配算法,接受客户端的匹配请求,当匹配系统得出一组匹配结果时,将结果发送给对局服务,创建对局。

(3)对局服务负责本系统的核心功能,调度对局的进行阶段。每一个对局独立运行于对局服务的子线程中,对局服务在创建新的对局时,随机生成一个对局ID,并通过键值对保存其对象。当接收客户端消息时,通过键值对,发送给指定的线程。

每一个服务的运行模式均为:服务在各自的线程中运行时,会阻塞在从各自的消息队列中获取消息的步骤,阻塞时不会消耗CPU资源,当服务从消息队列中获取到一条消息时,会根据消息内容进行业务逻辑上的处理,处理完毕以后再一次阻塞在获取消息的步骤。

客户端收到服务端的指令后,调用服务端题目数据供给模块的相关接口,获取JSON 形式的题目信息,封装并显示。

3.2 数据库设计

本系统数据库存储三个实体信息:科目信息、题目信息和题目选项信息。其他信息,比如用户信息及用户身份验证,则通过北京信息科技大学计算机学院的程序设计基础(C 语言)过程化考核平台提供的相关接口实现管理及操作,无需单独建立数据库。

3.3 基于NIO的网络通信服务

网络通信服务基于NIO 技术,与各客户端建立TCP 长连接,负责消息的发送、接收与封装。消息分为两类,分别为服务端向客户端发送的ClientMessage,和客户端向服务端发送的ServerMessage。这两种消息均封装为JavaBean,在类中规定消息结构。当其它服务需要向客户端发送消息时,通过向网络通信服务的消息队列发送消息,网络通信服务将队列中的JavaBean 消息对象出队,并读取其中的数据,写入字节缓冲区ByteBuffer,调用SocketChannel 类的write()方法,完成消息的发送;同时,网络通信服务的下属子服务MessageReceiver,独立运行于一个线程中,负责通过NIO 的多路复用选择器Selector,阻塞式监听各客户端的连接。若收到消息,则调用SocketChannel 的read()方法,读取来自客户端的消息数据,并将其封装为JavaBean 对象,然后后消息队列发送给其它服务。

MessageReceiver的监听及接收消息的逻辑,用伪代码表示如下:

1.选择器监听到READ 事件;

2.将触发READ 事件的SocketChannel 添加到集合中;

3.获取集合的迭代器;

4.while(迭代器有剩余内容) {

5.获取触发READ 事件的SocketChannel;

6.SocketChannel.read();

7.封装消息为JavaBean;

8.发送JavaBean 给指定的服务;

9.将当前SocketChannel 从集合中删除;

10.}

3.4 平衡匹配算法

设计平衡匹配算法,以满足下述目标:

(1)多个用户进行游戏时,需要尽可能保持用户间水平相近来给用户更好的游戏体验;

(2)需要权衡用户等待时间与用户间的水平差距孰先孰后的问题。

为此,首先设计匹配队列的数据结构:

(1)将发出匹配请求的用户抽象为一个类,具有分数和等待时间两个属性;

(2)利用集合存储同一个分段的用户

(3)从0 分起,每10 分为一个分段;

(4)利用有序数组存储多个集合。

形成有序数组存储多个集合、集合存储多个用户的数据结构。

当有新的用户加入匹配队列时,根据用户的分数将其放置到数组特定下标的集合中,服务端中的实现是将用户置入数组下标为用户分数除以10 的集合中去,即用户分数为2733 则置入第273 个集合中去。

每秒以集合为单位遍历一次数组,当数组中某一集合满足游戏开始所需要的人数,则将这些用户移出匹配队列,组建成为一次游戏对局。否则将获取此集合中等待时间最长的用户,根据此用户的等待时间向两侧一定距离内的集合获取在匹配中的用户。服务端中的实现是向两侧距离小于用户等待时间的平方的集合中获取用户,即假如用户在匹配队列中等待了5 秒,分数为2307 分,那么在第230 个集合中用户,如果用户数量不足以开始游戏,那么就会在239、238……205,231、232……255,这些集合中获取用户,直到达到游戏开始的要求。

这样可以发现,只要整个匹配队列中的用户数量满足游戏开始的要求,那么在一分钟以内一定会成功组建游戏,如果匹配队列中用户较多,那么成功组建的对局中所有用户的分数的方差会尽可能小。

匹配算法的存储结构简略图如图2所示。

4 客户端中状态自动机的设计

状态自动机是控制客户端界面与后台交互逻辑的核心。其设计思想包括:

(1)以有向图结构表示并存储自动机的执行逻辑,图节点表示状态,结点间的连线表示事件。

(2)用户对客户端的互动行为(主要体现为点击手机屏幕或点击返回按钮等),以及接收来自服务器的消息,均可触发某种事件。

(3)每一个状态均可由指定的某些事件,转换成另一种状态。

(4)在自动机中维护一个变量currentStatus,表示自动机的当前状态。

(5)自动机通过刚刚被触发的事件,从有向图中查找下一个状态,并更新为当前状态。

(6)自动机独立运行在一个线程中,通过Message 向界面线程发送指令以控制界面的变化。

(7)界面线程以及其他线程通过向自动机的事件队列发送刚刚被触发的事件。

(8)自动机的任务就是根据被触发的事件,转换当前状态,并调用新状态的某个方法,执行一系列逻辑。

(9)自动机存储并调用的所有状态对象的类型,均为状态的抽象父类。

(10)不同的状态通过继承同一个抽象父类,在同一个抽象方法中写入不同的具体实现,供自动机线程调用。

自动机的图结构数据由图3 表示。

5 总结

本文设计与开发了一个选择题对战系统,基于SpringBoot 设计并实现了系统的服务端,基于Android 技术设计并实现了系统的客户端。在客户端利用自动机机制设计人机交互逻辑;在服务器端利用NIO 技术设计高效网络通讯架构。所实现系统本系统以实现劳逸结合为目的,将专业知识的学习与游戏竞技的优点融为一体,着重激发学生的学习兴趣,减轻反馈不足所学习易产生的倦怠心理。本系统已经实际部署于学校的过程考核平台之中,心里,对游戏各个环节进行设计,提供既有娱乐性质也可学习专业知识的对战游戏。本系统具有较强的实用性,可以为用户提供了完整的游戏较好的学习体验。

猜你喜欢

对局自动机服务端
{1,3,5}-{1,4,5}问题与邻居自动机
一种基于模糊细胞自动机的新型疏散模型
一种基于模糊细胞自动机的新型疏散模型
云存储中基于相似性的客户-服务端双端数据去重方法
新时期《移动Web服务端开发》课程教学改革的研究
广义标准自动机及其商自动机
在Windows Server 2008上创建应用
第29届欧洲象棋锦标赛对局选评
赵国荣先胜吕钦
摸清黑客套路防范木马侵入