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