《JavaScript 基础教程(第6版)》第三章中的Bingo卡片程序实例

在《JavaScript 基础教程(第6版)》第三章中有一个Bingo卡片的示例程序。

规则:在 5*5 的矩形格子中,每格都存有一个随机整数,第1列数值取1-15,第2列数值取16-30,其后的列依此类推,要求所取的随机数值是没有重复所取过的。而在矩形格子中有一个空的格子,不存数值。

HTML代码如下:

HTML Code

CSS代码如下:

CSS Code

JavaScript 代码如下:

window.onload = init;
//定义存放随机整数的容器
var usedNums = [];
usedNums.length 
= 15;

var getIdName = function(idName) {
    
if(!document.getElementById) return;
    
this.elem = document.getElementById(idName);
    
return this.elem;
}

function init() {
    elem 
= getIdName('reload');
    
if(!elem) return;
    elem.onclick 
= anotherCard;
    newCard();
};
function newCard() {
    
for(var i=0; i<24; i++) {
        setSquare(i);
    }
}
function setSquare(thisSquare) {
    
var currSquare = 'square' + thisSquare;
    
var colPlace = [012340123401340123401234];
    
var colBasis = colPlace[thisSquare] * 15;
    
var newNum;
    
do {
        newNum 
= colBasis + getNewNum() + 1;
    }
    
while(usedNums[newNum])
    usedNums[newNum] 
= true;
    elem 
= getIdName(currSquare);
    elem.innerHTML 
= newNum;
    
}
function getNewNum() {
    
//值在1与15间的随机数
    var r = Math.floor(Math.random() *15);
    
//将该值返回
    return r;
}

function anotherCard() {
    
for(i=1; i<usedNums.length; i++) {
        usedNums[i] 
= false;
    }
    newCard();
    
return false;
}

上面的程序随机算法思路:

每列的随机整数是每次取一个值,将该值放在容器里,前提是在容器中没有同样的值。这样,取的随机值既不会重复,又保证了足够的随机。是个非常巧妙的算法。

那么,我们想要红色的方格在5*5的矩形方格中随机的显示出来,将HTML代码修改如下:

Code

JavaScript代码如下:

Code
window.onload = init;
//定义存放随机整数的容器
var usedNums = [];
usedNums.length 
= 75;

var getIdName = function(idName) {
    
if(!document.getElementById) return;
    
this.elem = document.getElementById(idName);
    
return this.elem;
}
var getTagName = function(tagName) {
    
if(!document.getElementsByTagName) return;
    
this.elem = document.getElementsByTagName(tagName);
    
return this.elem;
}
function init() {
    elem 
= getIdName('reload');
    
if(!elem) return;
    elem.onclick 
= anotherCard;
    newCard();
};
function newCard() {
    
for(var i=0; i<=24; i++) {
        setSquare(i);
    }
}
function setSquare(thisSquare) {
    
var currSquare = 'square' + thisSquare;
    
var newNum;
    
do {
        newNum 
= getRandomNum(25+ 1;
    }
    
while(usedNums[newNum])
    usedNums[newNum] 
= true;
    elem 
= getTagName('td');
    
if(!elem) return;
    
if(newNum == 2)
    elem[thisSquare].id 
= 'free';
    
//elem[thisSquare].lastChild.nodeValue = newNum;
}
function getRandomNum(iNum) {
    
//在1与 iNum 间的随机数赋值于 r
    var r = Math.floor(Math.random() * iNum);
    
return r;
}

function anotherCard() {
    elem 
= getTagName('td');
    
for(i=1; i<usedNums.length; i++) {
        usedNums[i] 
= false;
        
if(!elem[i]) return;
        elem[i].style.backgroundColor 
= '#FFF';
    }
    newCard();
    
return false;
}

我们将处理的数据不显示在内容层上,也就是说隐藏在行为层了。那么,随便取一个1到25间的整数值,这里我们取的是数值 2。将它显示的元素 id 设为 'free'。它便有了特定的样式。

呵呵。经典的“贪吃蛇”游戏中蛋的随机算法不就是这样的嘛?

posted on 2008-12-14 19:09  豆豆の爸爸  阅读(1269)  评论(0编辑  收藏  举报