闪航论坛里有这样一个救助贴,需要一个课件,用来练习记忆力的,要求如下:
/*要求:
1、随机出现数字,数字大小为1000,0000----99,9999,9999,9999
( 8位数 ---- 14 位数 )
2、或随机出现6位---10位的字母。
3、数字、字母出现时间为1秒,1秒后就消失。
4、要能很方便控制,点“下一题”出现另一个题目,点“答案”则出现刚才一晃而过的数字、字母
*/
先来做个需求分析,对数字长度统计之后,发现数字的长度最小8位,最多14位,原作者的想法是控制显示时长,随机出数字或字母。
需要用到的关键技术:随机出一个长整数或长字串,计时器,相关的组件(按钮 等),考虑到计时的长度可能会变化,初学者需要更多时间来记忆,计时长度应该是个变量,并且容易调整(步长组件最适合)。
技术分析:长整数的运算常用的手段有链表和数组,Flash中基本上只需要(也只有)数组就可以解决问题。首先对数组的长度进行随机,控制到8至14位,再对每一位数字进行随机生成,首位数字为0时,会影响到实际的数位长度,所以需要修正一下,之后将数字整合输出到文本框,出题过程就算结束。
// 随机出 长整数 的长度
var numLength:int = Math.floor( Math.random()*7 ) + 8; //Math.floor( Math.random()*7 ) 值范围为0~ 6
trace( numLength );
// 定义数组用来存贮数字
var strArr:Array = new Array( numLength );
for( var i:int = 0;i< numLength; i++ ){ //通过循环,对每一个位置添加一个数字
strArr[i] = Math.floor( Math.random()*10);
}
while( strArr[0] == 0 ){ //利用不限次的循环,确保首位数字不是零
strArr[0] = Math.floor( Math.random()*10);
}
numTxt.text = strArr.join(""); //输出字串到文本框,字符间不带间隔符号
接下来可以将上面的代码用函数括起来,方便调用,再设置一个定时器,定义一下开始按钮中的代码,就可以进演示了。
beginBtn.addEventListener(MouseEvent.CLICK,onBegin );
function onBegin(evt:MouseEvent):void{
getNum();
var timer:Timer = new Timer( nStep.value,1 ); //定义一个定时器,让它从 步长组件中获取时间长度,只执行1次
timer.addEventListener("timer", timerHandler); //对定时器添加侦听
timer.start(); //启动侦听
}
function timerHandler(event:TimerEvent ):void{
numTxt.text = ""; //清空文本框
}
显示答案的按钮代码比较实现,只要重新给文本框赋值就行了。
//显示答案
showAnsBtn.addEventListener(MouseEvent.CLICK,onShowAns );
function onShowAns(event:MouseEvent):void{
numTxt.text = answer; //一个全局变量,用来存贮实际的答案
}
整合之后的效果如下:
场景中设有三个组件,一个文本框,
步长组件 实例名nSteper,每步长度为0.5秒,最小值1秒,最大值10秒,
开始按钮 实例名:beginBtn
显示答案按钮 实例名:showAnsBtn
文本框 实例名:numTxt
完整的代码如下:
var answer:String = "";
function getNum() {
// 随机出 长整数 的长度
var numLength:int = Math.round( Math.random()*6 ) + 8;
trace( numLength );
// 字义数组用来存贮数字
var strArr:Array = new Array( numLength );
for (var i:int = 0; i< numLength; i++) {
strArr[i] = Math.floor( Math.random()*10);
}
while ( strArr[0] == 0 ) {
strArr[0] = Math.floor( Math.random()*10);
}
trace( strArr );
//var num:String = String( Math.random()*100000000000);
numTxt.text = strArr.join("");
answer = numTxt.text;
}
//启动游戏
beginBtn.addEventListener(MouseEvent.CLICK,onBegin );
function onBegin(evt:MouseEvent):void{
getNum();
var timer:Timer = new Timer( 1000 * nStep.value,1 );
timer.addEventListener("timer", timerHandler);
timer.start();
}
function timerHandler(event:TimerEvent ):void{
numTxt.text = "";
}
//显示答案
showAnsBtn.addEventListener(MouseEvent.CLICK,onShowAns );
function onShowAns(event:MouseEvent):void{
numTxt.text = answer;
}
长字符串怎样生成呢?或以用一个字串将全部的字符保存起来,再对数组长度值进行随机,得到一个随机的字符位置,将该位置的字符放到出题数组中就可以了。算法代码如下:
var chrTable:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
function getChr():void {
// 随机出 字串 的长度
var chrLength:int = Math.round( Math.random()*4 ) + 6;
//trace( chrLength );
// 字义数组用来存贮字符
var strArr:Array = new Array( chrLength );
var len:int = chrTable.length;
//
for (var i:int = 0; i< chrLength; i++) {
var index = Math.floor( Math.random()* len);
strArr[i] = chrTable.charAt( index );
}
numTxt.text = strArr.join("");
answer = numTxt.text;
}
利用这个函数可以扩展使用不同的字符表,或者只是0到9的字符表,用来出随机数字或字符的题目,有兴趣的朋友可以把它再参数化一下,可以指定纯数字、字母,最小长度,最大长度,等内容。可以想至的一个功能更强的字符表是如下形式的:
var chrTable:Array = ["0123456789",
"abcdefghigklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"0123456789abcdefghigklmnopqrstuvwxyz",
"abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
"0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"];