⑵界面有了,关键就是要怎样把题目显示出来给学生做,这就是第二部分的功能了。
在“出题”那个交互结构中,里面包括了八个按钮交互,分别是三个单选按钮,用来选择题目难度;一个“OK”按钮,用来根据选择的难度读入相应的题库;一个“重选”按钮,方便进行难度的重新选择;一个“开始”按钮,用来开始出第一题;一个“下一题”按钮,用来出下一题;一个“退出”按钮,用来退出程序。
实现出题这一步的思路是:首先把不同难度的题目存放到不同的TXT文、件中,用1.txt、2.txt、3.txt命名,数字越大难度越高。然后在选择难度的单选按钮中,记录选择的是1、2还是3,在按下“OK”按钮时,根据刚才选择的数字,从磁盘上读入相应的题库,存入一个变量中;当按下“开始”按钮时,用Random()函数从刚才的变量中选择题目,然后在变量中把这个题目删除,防止下次选到重复的题目;按“下一题”按钮时,再次用Random()函数选题。
①首先来介绍三个单选按钮如何设计
这三个单选按钮是互斥的,也就是说只能有一个被选中,在设计时,就要保证在单击一个单选按钮时,其它两个按钮要显示未选中的状态,要做到这一点,只要在一个单选按钮被选中时,把其它两个按钮的checked属性值设为0,以难度为“高”的单选按钮为例,它下面的【计算】图标中的代码如下:
Checked@"中":=0
Checked@"低":=0
同理,当单击“中”单选按钮时,应执行:
checked@"低":=0
checked@"高":=0
当单击“低”单选按钮时,应执行:
checked@"高":=0
checked@"中":=0。
②然后是“OK”按钮
当选完难度后,按“OK”按钮读入题库,先用一组判断语句判断是哪个单选按钮被选中(也就是哪个单选按钮的checkecd属性是等于1),然后用ReadExtFile()函数读入相应的题库,具体代码如下:
--使OK按钮失效
okClick:=1
--使选择难度的单选按钮失效
ok:=1
--使开始按钮有效
start:=1
--开始选择读入相应题库
if Checked@"高"=1 then
nandu:=3
else
if Checked@"中"=1 then
nandu:=2
else
nandu:=1
end if
end if
tiku:=ReadExtFile(FileLocation^"题库\\"^String(nandu)^".txt")
nandu变量保存选择的难度,tiku变量保存读入的题库,ReadExtFile()函数读入磁盘中的文件内容,它要求完整路径作为参数。FileLocation系统变量记录的是当前程序所在的文件夹的完整路径,string()函数把当前数据类型转换成字符串类型。如果nandu的值是1的话,FileLocation^"题库\\"^String(nandu)^".txt"的意思就是:当前程序所在文件夹下的“题库”文件夹下的1.txt。
③读入了题库
按“开始”按钮就开始出题了。出题的思路是:LineCount()函数判断题库的总行数,把它除以6就是题目总数。用Random()函数实现随机取题和随机分配答案。具体代码如下所示:
--记录题库的总行数
tikuLine:=LineCount(tiku)
--如果题库中已经没有题目了,转到题库空图标去处理
if tikuLine=0 then
start:=0
timuNext:=0
GoTo(@"清空屏幕显示")
end if
--随机取题,因为题库中每题加上答案是占5行,所以tikuLine要除以5
getnum:=Random(1,tikuLine/5,1)
--保存正确答案
right:=GetLine(tiku,getnum*5-3)
--读入选择答案
ans:=Array(0,4)
ans[1]:=GetLine(tiku,getnum*5-3)
ans[2]:=GetLine(tiku,getnum*5-2)
ans[3]:=GetLine(tiku,getnum*5-1)
ans[4]:=GetLine(tiku,getnum*5)
--读入选择的题目
timu:=GetLine(tiku,getnum*5-4)
--删除已经选择的题目及答案,防止重复选题
tiku:=DeleteLine(tiku,getnum*5-4,getnum*5)
--随机分配答案
--用于屏幕显示的数组
display:=Array(0,4)
--每次用随机取得的num,把ans数组中对应的元素传给display数组,
--再用ans数组中的剩下的最后的一个元素覆盖刚才的ans[num],保证每个答案都被选择一次
repeat with i:=1 to 4
num:=Random(1,4-i+1,1)
selex:=ans[num]
ans[num]:=ans[4-i+1]
display[i]:=selex
end repeat
GoTo(@"判断对错")
关键是随机分配答案的算法,这里用了一个循环语句来实现:
display:=Array(0,4)
repeat with i:=1 to 4
num:=Random(1,4-i+1,1)
display[i]:=ans[num]
ans[num]:=ans[4-i+1]
end repeat
display是保存并显示候选答案的数组,ans是暂时保存候选答案的数组,在循环中,首先从候选的四个答案中随机选择一个传递给display[1],然后在ans数组中用最后一个答案覆盖刚才选出来的答案,这样ans中的前三个答案就是还没有选择过的答案,下一次的循环就只要在ans的前三个答案中选择就行了,选择的结果传递给display[2],然后还是用当时的最后一个答案(也就是ans[3])覆盖刚选的答案,那ans的前两个答案就是还未选择的答案,第三次循环就只要从这两个答案中选择就行了,第四次循环也是如此。
至此,选题完毕,最后用GoTo(@"判断对错")转到判断对错的交互,等待用户的选择。