基于AS 3.0的竞答系统的设计与实现
2017-06-19郭琳
摘 要:为了提高职工的知识和业务水平,各大企事业单位及工会系统经常会开展形式多样的竞赛活动,而知识竞答是最为常见的一种竞赛形式。科学设计竞答内容和竞答形式是保证竞赛公平公正开展的前提。经过周密设计的竞答系统,可以有效地保证竞答的公平、公开、公正和高效性,大大节省时间和人力成本。该文以沈阳市总工会民管部集体合同知识竞赛竞答系统为例,较为详细地说明了竞答系统的设计流程及相关技术,针对不同题型给出了可行的竞答设计方案。
关键词:竞答系统 随机算法 AS 3.0 URLLoader XML
中图分类号:TP31 文献标识码:A 文章编号:1674-098X(2017)02(c)-0128-04
竞答设计主要包括赛制设计、题型设计、题目题量设计、评分标准设计和竞答流程设计等。而竞答系统的设计则更为复杂,除了要考虑到以上几点,还要考虑到题目抽取的随机性,答案显示的准确性、时效性,系统的可操控性,主持人与竞赛选手的互动性等要素。该文为提高可读性,突破传统的需求分析、概要设计、详细设计、编码、测试几大模块,以竞答设计的步骤为主线,逐一剖析竞答系统的设计流程。
1 赛制设计
设计分为预赛、复赛、决赛3个部分。
预赛3组,每组6队,每队3人,采用6进4制;复赛2组,每组6队,每队3人,采用6进3制;决赛1组,共6队,每队3人,最后按成绩高低决出一等奖1队,二等奖2队,三等奖3队。以上是根据实际参赛队伍情况进行的设计。
根据以上赛制设计,竞答系统界面预留预赛、复赛、决赛单选按钮,以便按不同场次抽取试卷(如图1所示)。
侦听单选按钮的鼠标点击事件并做出响应,设置场次变量(s)并设定随机抽取试卷量的基数(range)。主要功能脚本如下:
rgroup.addEventListener("click",changeFun);
function changeFun(e:MouseEvent)
{
var radg:RadioButtonGroup = e.target as RadioButtonGroup;
switch (radg.selection)
{
case r1 :
s = 1;
range = 6;
break;
case r2 :
s = 2;
range = 4;
break;
case r3 :
s = 3;
range =2;
break;
}
}
2 题型设计
集体合同竞赛主要是考查竞赛选手个人和团队对相关知识的识别、判定和分析理解能力,所以在题型设计上选用了个人必答题、小组共答题、抢答题、风险题、加试题。解读成标准的题型就是4种,即填空、判断、简答和案例分析。而无论是什么题型,因为竞答现场要求的就是显示题目,选手作答,然后显示答案,所以,竞答系统数据库设计考虑两个字段就可以了,一个是题目、一个是答案。
根据上述题型,设计竞答系统外部加载XML文件结构(以第1套必答题为例)如下:
…
3 題目题量设计
3.1 题目题量设计原则
(1)随机抽取题目作答形式决定了每种题型的题目设计量要超过实际竞答题目量,一般随机抽取题目基数与实际抽取题目数比例越高越好,也可根据实际需要。
(2)不同场次抽取的试卷基数也要也要大于实际抽取试卷数。
(3)降低不同试卷的题目重复率,最好互不重复。
(4)在试卷基数范围内每次抽取的试卷号互不相同。
(5)题号批量抽取且互不相同。
3.2 随机抽取题号的实现方法
function randomNum(total:int,current:int)
{
var currArray:Array = [];
var nums = [];
for (var i=0; i { nums.push(i); } for (i=0; i { var k = Math.floor(Math.random() *nums.length); //从nums数组中随机抽取一个元素(第k个) currArray[i] = nums[k] + 1; //把nums数组中抽出的元素值赋给currArray数组第i个元素; nums.splice(k, 1); } t1.text = currArray[0].toString();//显示抽题号 … tn.text = currArray[n].toString();
}
function chooseNum(e:MouseEvent)
{
randomNum(a,b);//从a个数中随机取不重复的b个数。
}
随机抽取试卷号方法与上面雷同。
4 评分标准设计
4.1 界面设计
因为竞答采用计分器作为计分辅助设备,所以在竞答系统界面设计中要明确给出评分标准,如图2风险题抽取题号界面所示。
4.2 不同分值题目切换实现方法
var scoretype,score:int;
scoretype=0; //分值类型,默认为0
score = 200; //默认题目分值为200分
fxtr1.group = fxtrgroup;
fxtr2.group = fxtrgroup;
fxtrgroup.addEventListener("click",fxtchangeFun);
function fxtchangeFun(e:MouseEvent)
{
var radg:RadioButtonGroup = e.target as RadioButtonGroup;
//将目标对象的引用指向到radg
switch (radg.selection)
{
case fxtr1 :
scoretype = 0;
score = 200;
fxtloadtxt = "fxt" + s + "-" + sjh + "-" + score + ".xml";
fxtsjh_txt.text = fxtloadtxt;
fxtxmlLoader.load(new URLRequest(fxtloadtxt));
fxtxmlLoader.addEventListener(Event.COMPLETE,fxtxmlLoaded);
fxtxmlLoader.addEventListener(IOErrorEvent.IO_ERROR,fxterrorHandler);
fxtnow.x = fxt_t1.x;
fxtnow.y = fxt_t1.y;
fxttm_txt.text="题目";
fxtkey_txt.visible=false;
break;
case fxtr2 :
scoretype = 1;
score = 300;
fxtloadtxt = "fxt" + s + "-" + sjh + "-" + score + ".xml";
fxtsjh_txt.text = fxtloadtxt;
fxtxmlLoader.load(new URLRequest(fxtloadtxt));
fxtxmlLoader.addEventListener(Event.COMPLETE,fxtxmlLoaded);
fxtxmlLoader.addEventListener(IOErrorEvent.IO_ERROR,fxterrorHandler);
fxtnow.x = fxt_t7.x;
fxtnow.y = fxt_t7.y;
fxttm_txt.text="题目";
fxtkey_txt.visible=false;
break;
}
}
5 競答流程设计
在抽取试卷号界面中,首先选取竞答场次,选择预赛、复赛、决赛中的一个,接着抽取该场次的试卷号,进入选取题型界面。
在选取题型界面中,选择竞答题型进入相应题型的答题界面。
在答题界面中,首先随机为每组抽取题号,然后主持人向参赛选手宣读题目,选手在指定时间内作答,作答完毕显示答案,正确加分,错误按比赛规则扣分或不扣分,并在计分器中更新分数。
所有题目作答完毕后按赛制选出优胜队伍。
6 可备选的其他题型设计
按照加载题目素材的不同,竞答系统还可支持图片、声音、视频、动画等类型的题目,以丰富竞答题目的类型,使竞答形式更加多样、内容更加全面。
具体实现方法如下。
6.1 图片、动画类题型
6.1.1 所需组件
UILoader组件。
6.1.2 加载办法
通过设置UILoader的source属性,使用ActionScript可以加载任意SWF、JPG、PNG或GIF文件到UILoader组件中,基本语法如下:
UILoaderInstanceName.source=“Path file to be loaded goes here”;
例:将名为myEg.swf的文件加载到UILoader组件中。
loadWindow.source=“myEg.swf”;
例:当点击某题号时,将名为myEg.swf的文件加载到UILoader组件中。
t1_btn.addEventListener(MouseEvent.CLICK,showt1);
function loadFile(e:Event):void{
loadWindow.source = h;
//h为中间变量,为从xml文件中读取的当前题目的UILoader的source
}
6.2 声音类题型
6.2.1 相关类
包括Sound类、SoundChannel类、SoundTransform类。
SoundChannel类控制应用程序中的声音,它包括一个stop()方法,而SoundTransform类可以控制声音的播放音量和播放位置。
6.2.2 基本用法
(1)创建Sound类的实例。
snd=new Sound();
(2)把声音加载到Sound实例。
snd.load(new URLRequest(currSong));
(3)创建SoundChannel和SoundTransform实例。
channel=new SoundChannel;
trans=new SoundTransform(currVol, currPan);
(4)播放音频并控制播放的音量和起始位置。
channel=snd.play();
channel.soundTransform=trans;
(5)停止播放聲音。
channel.stop();
在具体设计中,以上基本用法一般结合对按钮对象的事件侦听和响应函数来实现。
6.3 视频类
(1)所需组件:FLVPlayback 组件。
(2)加载办法:通过使用Flash直观的“组件检查器”设置常用属性,一般项目文件所需的大部分视频功能不用代码就能够实现。但是如果是多道视频题,则可使用外部XML文件存储视频加载路径,再通过URLLoader类的load方法来加载。
7 结论
综上所述,一个较为完备的竞答系统设计应注意以下几点。
(1)了解和熟悉竞答比赛的每一个环节。
(2)根据竞答题类型采用有针对性的技术解决方案。
(3)兼顾界面友好性和易用性。
(4)进行后期调试。需要竞赛组织者、竞答系统设计者、主持人、系统操作员、虚拟选手同时到场进行至少两次完整的流程测试并根据测试结果对系统进行再调试。
(5)给出其他可行性的竞答设计解决方案。
参考文献
[1] (美)Adobe公司.Adobe Flash CS4 ActionScript 3.0中文版经典教程[M].人民邮电出版社,2009:65,158-159.
[2] 郭琳.Flash课件平台组件技术研究[J].辽宁高职学报, 2009,11(9):102-103.
[3] (美)Roger Braunstein.ActionScript 3.0宝典[M].2版.清华大学出版社,2012:134-136,173-176,193-194.
[4] 刘欢.Flash ActionScript 3.0交互设计200例[M].人民邮电出版社,2015:304-309.
[5] Adobe Systems Incorporated.Sound Channel-AS3.ActionScript3.0 Reference for the Adobe Flash Platform[Z].2016.
[6] Adobe Systems Incorporated.Sound Transform-AS3. ActionScript 3.0 Reference for the Adobe Flash Platform[Z].2016.