2008/09/10 | “闪电记数”的课件的分析与制作
类别(Flash课件设计) | 评论(1) | 阅读(196) | 发表于 12:11

  闪航论坛里有这样一个救助贴,需要一个课件,用来练习记忆力的,要求如下:

/*要求:
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"];

0

评论Comments