《JavaScript 基础教程(第6版)》第三章中的Bingo卡片程序实例
在《JavaScript 基础教程(第6版)》第三章中有一个Bingo卡片的示例程序。
规则:在 5*5 的矩形格子中,每格都存有一个随机整数,第1列数值取1-15,第2列数值取16-30,其后的列依此类推,要求所取的随机数值是没有重复所取过的。而在矩形格子中有一个空的格子,不存数值。
HTML代码如下:
![](/Images/OutliningIndicators/ContractedBlock.gif)
CSS代码如下:
![](/Images/OutliningIndicators/ContractedBlock.gif)
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 = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4];
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;
}
//定义存放随机整数的容器
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 = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4];
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代码修改如下:
![](/Images/OutliningIndicators/ContractedBlock.gif)
JavaScript代码如下:
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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'。它便有了特定的样式。
呵呵。经典的“贪吃蛇”游戏中蛋的随机算法不就是这样的嘛?