自己写的一个彩票生成号码程序

一个朋友要我帮他写个7色球的生成号码程序,本以为挺简单的,但是的确耗费了我满多时间,而且第一个版本还把算法搞错了 :(,用了两个晚上大概4个小时的时间才完成一个Java Swing版和一个JavaScript版,看来我的基础还真是弱啊,需要多多锻炼

要求:随机生成7个数字,前6个是1-33的整数,但是不能重复,第七个数字范围1-16,不受前面数字影响。

Java Swing版,刚开始我没在意,觉得挺容易,就用Java自己手写Frame来做,然后编译、打包并用exe4j生成.exe文件,可以说很简单一件事让我搞的挺复杂。结果是编译、打包和生成.exe文件我都搞熟了(生成的exe文件必须要有Java运行环境,Java做应用程序果然不方便),但是程序没写好, 我开了7个线程,分别由7个类来控制数字的变化,但是后来一想,前面的数字生成完毕以后,后面的数字才知道自己的取值范围,7个线程同时跑是不对的,最终放弃了这个版本,做这个版本主要是想熟悉上面几个蹩脚的过程,刚好练练Swing :P。

JS版,用动态语言做小东西真是不知道要比静态类型好多少倍,不用编译直接跑,最重要的是用JavaScript我就不用写那么多重复代码了,要是用Java实现那么多Label,不用反射就得狂拷贝代码,不知道大家有什么更好的方法。思路很简单,每次生成一个号码,点停止按钮一个数字生成,下一个开始,并且要把前面生成的数字拿出去。

由于我JS的水平实在是很烂,所以实现这个东西也着实费了好大劲。希望大家看到以后能给出意见或者提供更好的算法,谢谢!

 

DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.0 Transitional//EN " >
< HTML >
< HEAD >
< TITLE >  New Document  TITLE >
< META NAME = " Generator "  CONTENT = " EditPlus " >
< META NAME = " Author "  CONTENT = "" >
< META NAME = " Keywords "  CONTENT = "" >
< META NAME = " Description "  CONTENT = "" >
< script language = " javascript " >
/**
 * 重新定义setTimeout方法,使得可以接受一个变量做参数
 *
*/

var  _st  =  window.setTimeout; 
window.setTimeout 
=   function (fRef, mDelay) 
 
if(typeof fRef == 'function')
  
var argu = Array.prototype.slice.call(arguments,2); 
  
var f = (function(){ fRef.apply(null, argu); }); 
  
return _st(f, mDelay); 
 }
 
 
return _st(fRef,mDelay); 
}
 

/**
 * 初始化一个长度为33的数组
 *
*/

function  initArr() {
    
var arr = new Array();
    
for(i=0; i<33; i++){
        arr[i]
=i+1;
    }

    
return arr;
}

var  startArr  =  initArr();
/**
 * 数组中删除一个元素的方法
 *
*/

Array.prototype.remove
= function (num) {
    
if(isNaN(num)||num>33){
        
return false;
    }


    
for(i=0;i<this.length;i++){
        
if(num==startArr[i]){
            
this.splice(num-1,1);
            
this.length-=1;
            
break;
        }

    }

}


/**
 * 前六个数字的计算
 *
*/

function  optionChange(startNum) {
    
var obj = document.getElementById("value" + startNum);
    
var len = startArr.length;
    
var value = Math.round(Math.random()*len) + 1;

    
if(obj.value==0){
        document.getElementById(
"numberField" + startNum).innerText=value;        
        window.setTimeout(optionChange,
500,startNum);
    }

}


/**
 * 点开始按钮后从第一位开始
 *
*/

function  startChange() {
    
for(i=1;i<=7;i++){
        document.getElementById(
"numberField" + i).innerText=0;
    }

    document.getElementById(
"value1").value="0";
    document.getElementById(
"startButton").disabled=true;
    optionChange(
1);
}


/**
 * 设定起始位置1
 * 按停止按钮的时候,对应位置数字停止,下一个开始
 *
*/

var  cont  =   1 ;
function  changeNumber() {
    
if(cont<6){
        document.getElementById(
"value" + cont).value=cont;
        startArr.remove(document.getElementById(
"value" + cont).innerText);
        cont
++;
        document.getElementById(
"value" + cont).value="0";
        optionChange(cont);
    }
 else if(cont==6){
        document.getElementById(
"value6").value=cont;
        document.getElementById(
"value7").value=0;
        cont
++;
        optionChange7();
    }
 else if(cont==7){
        document.getElementById(
"value7").value=cont;
        document.getElementById(
"startButton").disabled=false;
        cont
=1;
    }

}

/**
 * 第7个数字时特别处理
 *
*/

function  optionChange7() {
    
var value = document.getElementById("value7").value;
    
if(value==0){
        document.getElementById(
"numberField7").innerText=Math.round(Math.random()*16+1);
        setTimeout(
"optionChange7()",500);
    }

}

script >
HEAD >

< BODY >
< table width = " 100% " >
< tr >
    随机数生成:
    
< span id = " numberField1 " > 0 span >< input type = " hidden "  name = " value1 "  value = " 1 "   />& nbsp; & nbsp;
    
< span id = " numberField2 " > 0 span >< input type = " hidden "  name = " value2 "  value = " 2 "   />& nbsp; & nbsp;
    
< span id = " numberField3 " > 0 span >< input type = " hidden "  name = " value3 "  value = " 3 "   />& nbsp; & nbsp;
    
< span id = " numberField4 " > 0 span >< input type = " hidden "  name = " value4 "  value = " 4 "   />& nbsp; & nbsp;
    
< span id = " numberField5 " > 0 span >< input type = " hidden "  name = " value5 "  value = " 5 "   />& nbsp; & nbsp;
    
< span id = " numberField6 " > 0 span >< input type = " hidden "  name = " value6 "  value = " 6 "   />& nbsp; & nbsp;
    
< span id = " numberField7 " > 0 span >< input type = " hidden "  name = " value7 "  value = " 7 "   />
tr >
< tr >
    
< input type = " button "  value = " 开始 "  name = " startButton "  id = " startButton "  onclick = " startChange(); " />& nbsp; & nbsp;
    
< input type = " button "  value = " 结束 "  name = " stopButton "  id = " stopButton "  onclick = " changeNumber(); " />
tr >
table >
BODY >
HTML >

代码直接拷贝出来放在一个html文件中就可以执行,我想如果谁再让我做些什么小东西我都得选择JS+HTML了,是在时很方便,而且实现起来代码也要少得多。

写这段代码我还是学习到一些新的东西,第一个就是重构setTimeout方法,JS中提供的setTimeout方法如果想在定时的方法中传递参数有一种方法setTimeout("(+param+)",delayMilliseconds),但是这个做法只能传递字串,明显达不到要求,所以在网上搞来这个重构的方法,挺难理解的,所以就先搬过来用,里面的代码都是书上很难找到的方法,值得注意和积累,比如var argu = Array.prototype.slice.call(arguments,2); 这段代码我大概知道是在构造参数,以及var f = (function(){ fRef.apply(null, argu); })是在构造方法,这些都是动态语言天生的特性带来的好处,实现起来比Java等静态语言来的简单的多,但是想理解和熟练使用的确不那么容易。还有一个地方就是自定义删除数组中指定元素的方法,比起基础的JS代码,我看起来都满迷糊的。

都说动态语言入门容易、精通难,我认为真的是很有道理,但是动态语言的时代即将来临,我们该给予更多的重视。

你可能感兴趣的:(Ajax/RoR)