掼蛋比赛自动分组判分系统的设计与实现
2017-04-15郭杰
郭杰
摘要:掼蛋比赛是深受群众喜爱的扑克比赛,传统手工分组、计分,十分繁琐,耗费大量人力,且容易出现错误。该系统是采用Struts2,Spring,Hibernate框架开发的Java Web项目,客户端无须安装,打开浏览器即可访问。实现了根据比赛规则自动分组功能,比赛成绩录入功能,根据成绩级差自动判分功能,设置局数和打印输出总成绩功能。
关键词:Java;Web;Struts2;Spring;Hibernate
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)34-0091-02
Abstract: GUAN DAN game is loved by the masses of poker game, the traditional manual grouping, scoring is very tedious, spend a lot of manpower, and easy error. The system is the use of Struts2, Spring, Hibernate framework for the development of the Web Java project, the client does not need to install, open the browser to access. To realize the automatic grouping function according to the rules of the game, race entry function, according to the results of differential automatic judging function, setting function innings and print output total score.
Key words: Java; Web; Struts2; Spring; Hibernate
1 背景
掼蛋是一种起源于江苏淮安的扑克游戏,群众基础广泛,深受群众欢迎,年终及工会活动常常举办掼蛋比赛,目前缺乏相应的比赛专用软件,传统方式采用手工登记人员分组、记录每局成绩,换算得分,十分繁琐,耗费大量人力和时间,且容易出现错误。本系统采用B/S结构,使用Struts2,Spring,Hibernate框架快速开发,只需部署服务器端,客户端无须安装,打开浏览器即可访问。赛前录入人员名单进行编组,赛中按照比赛规则多轮分组,现场录入比赛成绩,自动判分,并打印输出各局成绩和分组情况,最终现场公示总成绩。大大提高比赛裁判效率,使得比赛过程公开、透明、公正。
2 技术基础
2.1 Spring框架
Spring框架是一个容器框架,通过配置文件,在程序运行时动态注入指定的类,从而大大加强了程序的灵活性和可维护性。通过Spring框架提供的事务处理,将业务逻辑层的方法统一进行事务处理,保证了业务方法的正确性和可靠性。
2.2 Strust2框架
使用Struts2框架将表示层JPS页面的调度进行统一控制,将业务处理和页面展示进行解耦,便于项目的维护。在JSP页面的数据绑定上,使用Struts2标签代码更加简洁。
2.3 Hibernate框架
模型层采用Hibernate框架自动生成实体类和配置文件,数据访问层采用Spring框架的HibernateDaoSupport类实现增、删、改、查的操作。
3 系统设计
3.1 比赛流程设计
系统包括三种角色:管理员、主裁判、裁判助理。赛前管理员新增比赛信息,包括比賽名称、地点、场次、每场时间、比赛状态。裁判助理从Excel文件中导入比赛选手名单,并打印张贴。
比赛过程中,主裁判宣布比赛规则,宣布选手分组名单表,参赛选手记住自己的组号。主裁判进行比赛分组并公示,首轮比赛随机分组,确保同一部门两组选手不会分在同一桌。参赛选手查看分组情况,到指定牌桌就位。主裁判开始倒计时,比赛正式开始。同一桌两组选手在规定时间内一组打过A则该桌比赛结束,裁判助理记录该桌成绩并将成绩录入至系统中,根据分差自动计算为每局积分。
主裁判根据第一轮比赛积分排名,进行第二轮分组,第一名和第二名分在第一桌,第三名和第四名分在第二桌,依次类推。第二轮之后的每一轮保证打过的两组选手不再碰面。
每轮比赛结束后,裁判助理导出成绩排名至Excel文件,打印并张贴。最后一轮比赛结束后,主裁判公示比赛名次。
3.2 功能设计
系统总体功能设计如下图所示。
3.3 架构设计
本系统采用B/S分层架构开发,包括:模型层、业务逻辑层、表示层、数据访问层、控制层、通用层。
3.3.1 模型层(Java Bean)
该层为简单的POJO(Plain Ordinary Java Object)类,包含与数据库表相对应的实体类,由于各层都需要使用该项目中的类,我们可以将该项目独立出来,称为“模型层”,实体类是各层数据传递的载体。
3.3.2 表示层(JSP)
表示层包括各个JSP页面,在浏览器中输入网址和文件名就可以进入相应的页面,提供所有与用户进行交互的界面,从而完成各个功能,JSP页面使用DIV、CSS进行布局,利用Struts2标签绑定数据,表示层的跳转和数据绑定统一由控制层进行处理。
3.3.3 控制层(Action)
控制层采用Struts2框架,是表示层和业务逻辑层进行交互的桥梁,表示层录入的数据,封装为模型层实体类的对象,然后传递给业务逻辑层进行处理,返回的数据转换为json格式或实体类的对象,跳转到相应的页面并显示。
3.3.4 业务逻辑层(Service)
业务逻辑层负责处理比赛分组的算法,以及在控制层和数据访问层之间传递数据。
3.3.5 数据访问层(DAO)
数据访问层对数据进行持久化,负责增、删、改、查的基本操作。根据业务逻辑层传来的数据请求信息,调用相关的方法,将数据反馈给业务逻辑层,最终显示到页面。
3.4 数据库设计
系统分为配置表,用户表,类别表,计时表,比赛表,选手表。采用MySQL数据库建表加约束,复杂的查询采用视图进行操作。使用Hibernate框架对底层数据库的连接进行了封装,通过自动生成的XML配置文件将数据库表与实体类建立一一对应的关系,再进行数据持久化操作。
3.5 界面设计
表示层与用户交互的界面采用JSP页面,采用DIV、CSS进行布局。数据显示采用EasyUI组件。EasyUI是基于jQuery的用户界面插件集合,只需要使用简单的HTML标记即可以定义用户界面。绑定的数据是由控制层返回的JSON格式的轻量级数据,传输数据量小、效率高。EasyUI采用了Ajax异步刷新的方式显示分页数据,数据显示速度快,实现了良好的用户体验。
4 关键技术
4.1 分组算法
首轮分组采用折半随机算法,将参数选手顺序编组,所有组数分为对等的两部分,两个部分的选手部门不出现重复。两个部分的组数随机混淆,然后每两组进行匹配。
第二轮分组根据首轮比赛得分情况进行排序,得分由高到低,两两编组,确保积分相近的选手分在同一桌。
其他轮分组按照第二轮分组算法,加上打过不重复原则。即第一组、第二组打过,则第一组和第三组分在同一桌。
4.2 积分算法
规定时间内最先打过A一方获胜,一方获胜本轮比赛即结束。计时结束双方均未打过A,则记录当前各自正在打的等级。积分算法是根据双方最终的级差数值来换算相应的积分,具体级差积分如下表所示。例如:甲方打2(数值为2),乙方打过A(数值为15),则甲方乙方的级差为13分,乙方胜得26分,甲方负得0分。若甲乙双方均打到A,则级差为0,各积13分。如遇对手弃权,胜方按16分计,弃权方按0分计。若两方同时弃权,则均按0分计。
5 结束语
本文深入研究了掼蛋比赛自动分组判分系统的技术基础、系统架构、业务流程设计、功能設计、数据库设计、界面设计以及关键算法。提出了Java平台利用SSH框架搭建分层开发模式解决实际问题的方案。理清了掼蛋比赛的业务流程,实现了关键的分组和积分算法。该系统连续两年在工会牌艺比赛中得到应用,真正实现了现场高效分组、计时、录入成绩、公布名次,受到参赛选手和主办方的普遍好评。
参考文献:
[1] 夏玉敏, 华中. 基于Ajax技术的掼蛋比赛自动裁判系统设计与实现[J]. 内江科技, 2012(7): 150-151.