在《JavaScript 基础教程(第6版)》第三章中有一个Bingo卡片的示例程序。
规则:在 5*5 的矩形格子中,每格都存有一个随机整数,第1列数值取1-15,第2列数值取16-30,其后的列依此类推,要求所取的随机数值是没有重复所取过的。而在矩形格子中有一个空的格子,不存数值。
HTML代码如下:
HTML Code
<table>
<tr>
<th width="20%">B</th>
<th width="20%">I</th>
<th width="20%">N</th>
<th width="20%">G</th>
<th width="20%">O</th>
</tr>
<tr>
<td id="square0"> </td>
<td id="square1"> </td>
<td id="square2"> </td>
<td id="square3"> </td>
<td id="square4"> </td>
</tr>
<tr>
<td id="square5"> </td>
<td id="square6"> </td>
<td id="square7"> </td>
<td id="square8"> </td>
<td id="square9"> </td>
</tr>
<tr>
<td id="square10"> </td>
<td id="square11"> </td>
<td id="free">Free</td>
<td id="square12"> </td>
<td id="square13"> </td>
</tr>
<tr>
<td id="square14"> </td>
<td id="square15"> </td>
<td id="square16"> </td>
<td id="square17"> </td>
<td id="square18"> </td>
</tr>
<tr>
<td id="square19"> </td>
<td id="square20"> </td>
<td id="square21"> </td>
<td id="square22"> </td>
<td id="square23"> </td>
</tr>
</table>
<p><a href="11.html" id="reload">点击这</a>新建一卡片</p>
CSS代码如下:
CSS Code
body {
background-color: #FFF;
color: #000;
font-size: 20px;
font-family: "宋体", Verdana, Arial, Helvetica, sans-serif;
}
h1, th {
font-family: Georgia, "Times New Roman", Times, serif;
}
h1 {
font-size: 28px;
}
table {
border-collapse: collapse;
}
th, td {
padding: 10px;
border: 2px #666 solid;
text-align: center;
font-size: 24px;
}
#free {
background-color: #F66;
}
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
;
}
上面的程序随机算法思路:
每列的随机整数是每次取一个值,将该值放在容器里,前提是在容器中没有同样的值。这样,取的随机值既不会重复,又保证了足够的随机。是个非常巧妙的算法。
那么,我们想要红色的方格在5*5的矩形方格中随机的显示出来,将HTML代码修改如下:
Code
<table>
<tr>
<th width="20%">B</th>
<th width="20%">I</th>
<th width="20%">N</th>
<th width="20%">G</th>
<th width="20%">O</th>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
<p><a href="11.html" id="reload">点击这</a>新建一卡片</p>
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'。它便有了特定的样式。
呵呵。经典的“贪吃蛇”游戏中蛋的随机算法不就是这样的嘛?