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

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

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

HTML代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 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">&nbsp;</td>
        
<td id="square1">&nbsp;</td>
        
<td id="square2">&nbsp;</td>
        
<td id="square3">&nbsp;</td>
        
<td id="square4">&nbsp;</td>
    
</tr>
    
<tr>
        
<td id="square5">&nbsp;</td>
        
<td id="square6">&nbsp;</td>
        
<td id="square7">&nbsp;</td>
        
<td id="square8">&nbsp;</td>
        
<td id="square9">&nbsp;</td>
    
</tr>
    
<tr>
        
<td id="square10">&nbsp;</td>
        
<td id="square11">&nbsp;</td>
        
<td id="free">Free</td>
        
<td id="square12">&nbsp;</td>
        
<td id="square13">&nbsp;</td>
    
</tr>
    
<tr>
        
<td id="square14">&nbsp;</td>
        
<td id="square15">&nbsp;</td>
        
<td id="square16">&nbsp;</td>
        
<td id="square17">&nbsp;</td>
        
<td id="square18">&nbsp;</td>
    
</tr>
    
<tr>
        
<td id="square19">&nbsp;</td>
        
<td id="square20">&nbsp;</td>
        
<td id="square21">&nbsp;</td>
        
<td id="square22">&nbsp;</td>
        
<td id="square23">&nbsp;</td>
    
</tr>
</table>
<p><href="11.html" id="reload">点击这</a>新建一卡片</p>

CSS代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 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代码修改如下:

ContractedBlock.gif ExpandedBlockStart.gif 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>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
    
</tr>
    
<tr>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
    
</tr>
    
<tr>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
    
</tr>
    
<tr>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
    
</tr>
    
<tr>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
        
<td>&nbsp;</td>
    
</tr>
</table>
<p><href="11.html" id="reload">点击这</a>新建一卡片</p>

JavaScript代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 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'。它便有了特定的样式。

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

转载于:https://www.cnblogs.com/georgewing/archive/2008/12/14/937148.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值