javascript版的俄罗斯方块

程序范例:http://myinfo95.class.netbig.com/box.htm
本程序是我在2000年5月时写的。看到这里有别人写的俄罗斯方块,也贴上拉凑俦热闹。
<html>
<head>
<title>俄罗斯方块(lint)</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
td { font-family: "宋体"; font-size: 11pt}
body { font-family: "宋体"; font-size: 11pt}
select { font-family: "宋体"; font-size:11pt}
A {text-decoration: none; color: #ffffff; font-family: "宋体"; font-size: 11pt}
A:hover {text-decoration: underline; color: #FF0000; font-family: "宋体"; font-size: 11pt}
-->
</style>

<Script language="javascript">
var M=20,N=15,S=7;
var box1,box2,box0,new_box1,new_box2;
var arraybox,assorted_box;
var i,j,m,n;
var box_x=0,box_y=5,box,new_box;
var current_type=0,current_order=0,new_current_type=0,new_current_order=0;
//var down=0,left=0,right=0,bottom=0,change=0;
var go=0,change=0,bottom=0;
var high_score=0,score=0;
var box_num;
var speed=0,arrayspeed;
var game_class=0,begin=0,stop=0;
var line=0,begin=0;
var progress=0,progress_str="";
//存贮每一个变形BOX的可变形数目
box_num=new Array(4,4,2,2,4,2,2);
arrayspeed=new Array(500,450,400,350,300,200,150,100,50);
//存贮当前的BOX[x/y][位置]
box=new Array(2);
for(i=0;i<2;i++)
box[i]=new Array(0,0,0,0);

//存贮下一个BOX
new_box=new Array(2);
for(i=0;i<2;i++)
new_box[i]=new Array(0,0,0,0);

box1=new Image();
box2=new Image();
box0=new Image();
new_box1=new Image();
new_box2=new Image();
box0.src="images/box0.gif";
box1.src="images/box1.jpg";
box2.src="images/box2.jpg";
new_box1.src="images/box1.jpg";
new_box2.src="images/box3.jpg";
//存贮目前的BOX显示状态
arraybox=new Array(M);
for(i=0;i<M;i++)
 {arraybox[i]=new Array(N);
   for(j=0;j<N;j++)
   arraybox[i][j]=0;
 }
//assorted_box [类别][x/y][次序][位置]
assorted_box=new Array(S);
assorted_box[0]=new Array(2);
assorted_box[0][0]=new Array(4);
assorted_box[0][1]=new Array(4);
assorted_box[0][0][0]=new Array(0,0,0,1);
assorted_box[0][1][0]=new Array(0,1,2,0);
assorted_box[0][0][1]=new Array(0,0,1,2);
assorted_box[0][1][1]=new Array(0,1,1,1);
assorted_box[0][0][2]=new Array(0,1,1,1);
assorted_box[0][1][2]=new Array(2,0,1,2);
assorted_box[0][0][3]=new Array(0,1,2,2);
assorted_box[0][1][3]=new Array(0,0,0,1);

assorted_box[1]=new Array(2);
assorted_box[1][0]=new Array(4);
assorted_box[1][1]=new Array(4);
assorted_box[1][0][0]=new Array(0,1,1,1);
assorted_box[1][1][0]=new Array(1,0,1,2);
assorted_box[1][0][1]=new Array(0,1,1,2);
assorted_box[1][1][1]=new Array(0,0,1,0);
assorted_box[1][0][2]=new Array(0,0,0,1);
assorted_box[1][1][2]=new Array(0,1,2,1);
assorted_box[1][0][3]=new Array(0,1,1,2);
assorted_box[1][1][3]=new Array(1,0,1,1);

assorted_box[2]=new Array(2);
assorted_box[2][0]=new Array(2);
assorted_box[2][1]=new Array(2);
assorted_box[2][0][0]=new Array(0,0,0,0);
assorted_box[2][0][1]=new Array(0,1,2,3);
assorted_box[2][1][0]=new Array(0,1,2,3);
assorted_box[2][1][1]=new Array(0,0,0,0);

assorted_box[3]=new Array(2);
assorted_box[3][0]=new Array(2);
assorted_box[3][1]=new Array(2);
assorted_box[3][0][0]=new Array(0,0,1,1);
assorted_box[3][1][0]=new Array(0,1,0,1);
assorted_box[3][0][1]=new Array(0,0,1,1);
assorted_box[3][1][1]=new Array(0,1,0,1);

assorted_box[4]=new Array(4);
assorted_box[4][0]=new Array(4);
assorted_box[4][1]=new Array(4);
assorted_box[4][0][0]=new Array(0,0,0,1);
assorted_box[4][1][0]=new Array(0,1,2,2);
assorted_box[4][0][1]=new Array(0,1,2,2);
assorted_box[4][1][1]=new Array(1,1,0,1);
assorted_box[4][0][2]=new Array(0,1,1,1);
assorted_box[4][1][2]=new Array(0,0,1,2);
assorted_box[4][0][3]=new Array(0,0,1,2);
assorted_box[4][1][3]=new Array(0,1,0,0);

assorted_box[5]=new Array(2);
assorted_box[5][0]=new Array(2);
assorted_box[5][1]=new Array(2);
assorted_box[5][0][0]=new Array(0,1,1,2);
assorted_box[5][0][1]=new Array(0,0,1,1);
assorted_box[5][1][0]=new Array(0,0,1,1);
assorted_box[5][1][1]=new Array(1,2,0,1);

assorted_box[6]=new Array(2);
assorted_box[6][0]=new Array(2);
assorted_box[6][1]=new Array(2);
assorted_box[6][0][0]=new Array(0,1,1,2);
assorted_box[6][0][1]=new Array(1,0,1,0);
assorted_box[6][1][0]=new Array(0,0,1,1);
assorted_box[6][1][1]=new Array(0,1,1,2);

function clear_line(fill)
{
 var i;
 if(fill==1)
  {
   if(line<=M-1)
    {
     for(i=0;i<N;i++)
      {
      eval("document.box.img"+line+"_"+i+".src=box1.src");
      }
      
      line++; 
     window.setTimeout("clear_line(1)",10);
    }
    else
     {
      line=M-1;
      window.setTimeout("clear_line(0)",10);
     }
  }
 else
  {
    if(line>=0)
    {
     for(i=0;i<N;i++)
     eval("document.box.img"+line+"_"+i+".src=box2.src");
     line--; 
     window.setTimeout("clear_line(0)",10);
    }
    else
    {
     speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
     game_class=document.game_set.game_class.options[document.game_set.game_class.selectedIndex].value;
     set_game_class();
     score=0;
  document.game_set.start_button.disabled=true;
 document.game_set.pause_button.disabled=false;
 document.game_set.restart_button.disabled=true;
 document.game_set.pause_button.value="暂停";
  document.game_set.restart_button.blur();
  document.game_set.restart_button.blur();
  stop=0;
  ready_go(1);
  begin_go();
     //return;
    }
   
  }
}

function start_game()
{
 stop=0;
 speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
 game_class=document.game_set.game_class.options[document.game_set.game_class.selectedIndex].value;
 set_game_class();
 ready_go(1);
 document.game_set.start_button.disabled=true;
 document.game_set.pause_button.disabled=false;
 document.game_set.restart_button.disabled=true;
 document.game_set.pause_button.value="暂停";
}
function pause_game()
{
 
 speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
 //document.game_set.start_button.disabled=false;
 if(stop==0)
 {document.game_set.pause_button.value="继续";
  document.game_set.pause_button.disabled=false;
  document.game_set.restart_button.disabled=false;
  document.game_set.pause_button.blur();
  stop=1;
 }
 else
  {document.game_set.pause_button.value="暂停";
  document.game_set.pause_button.disabled=false;
  document.game_set.restart_button.disabled=true;
  document.game_set.pause_button.blur();
  stop=0;
  set_down();
 }
}

function show_score()
{
 my_score.innerHTML="分数:"+score; 
}
function documentkeydown()
{
 go=bottom=change=0;
 if(event.keyCode==37&&valid_move('left'))
  left_box();
 else if(event.keyCode==39&&valid_move('right')&&(stop==0))
   right_box();
 else if(event.keyCode==40&&valid_move('down')&&(stop==0))
   down_box();
 else if(event.keyCode==13||event.keyCode==32&&(stop==0))
   change_box();    
 else if((event.keyCode==80)&&(document.game_set.pause_button.disabled==false))
   pause_game();
 else if(event.keyCode==81)
   parent.window.close();
 else if((event.keyCode==83)&&(document.game_set.start_button.disabled==false))
  start_game();
 else if((event.keyCode==82)&&(document.game_set.restart_button.disabled==false))
  end(); 
}
function update()
{
 var i,j;
 for(i=0;i<M;i++)
 for(j=0;j<N;j++)
 {
  if(arraybox[i][j]==0)
   eval("document.box.img"+i+"_"+j+".src=box2.src");
  else
   eval("document.box.img"+i+"_"+j+".src=box1.src");
 } 
}
function list_box(string)
{
var str,i,j;
str=string;
for(i=0;i<2;i++)
for(j=0;j<4;j++)
str+=box[i][j]+" ";
}
function show_box(both)
{
 var i,j;
 //list_box('showbox');
 if(both==1)
  for(i=0;i<4;i++)
   for(j=0;j<4;j++)
   eval("document.new_box.new_img"+i+"_"+j+".src=new_box2.src");
 for(i=0;i<4;i++)
 {
eval("document.box.img"+(box[0][i]+box_x)+"_"+(box[1][i]+box_y)+".src=box1.src");
if(both==1)
  eval("document.new_box.new_img"+new_box[0][i]+"_"+new_box[1][i]+".src=new_box1.src");
 }
}
function valid_move(direction)
{
 var i,j;
 if(direction=='down')
 {
  for(i=0;i<4;i++)
  //判断是否到底
  {if((box_x+box[0][i]+1)==M)
   {for (j=0;j<4;j++)
     arraybox[box_x+box[0][j]][box_y+box[1][j]]=1;
   return false;
   }
   if(arraybox[box_x+box[0][i]+1][box_y+box[1][i]]==1)
   {for (j=0;j<4;j++)
     arraybox[box_x+box[0][j]][box_y+box[1][j]]=1;
   return false;
   }
  }
  return true;
 }
 else if(direction=='left')
 {
   for(i=0;i<4;i++)
   {if((box_y+box[1][i]-1)<0)
     return false;
   if(arraybox[box_x+box[0][i]][box_y+box[1][i]-1]==1)
    return false;
   }
   return true;
  
 }
 else if(direction=='right')
 {
  for(i=0;i<4;i++)
   {if((box_y+box[1][i]+1)==N)
    return false;
   if(arraybox[box_x+box[0][i]][box_y+box[1][i]+1]==1)
    return false;
   } 
  return true;
 }
 
}

function begin_go()
{
  var i,j,k,m;
  box_x=0;box_y=5;
 new_current_type=Math.floor(Math.random()*7);
 new_current_order=Math.floor(Math.random()*box_num[new_current_type]);
 for(k=0;k<2;k++)
 for(m=0;m<4;m++)
 {
  new_box[k][m]=assorted_box[new_current_type][k][new_current_order][m];
 }
}

function end()
{ var i,j;
 stop=1;
 if(high_score<score)
 high_score=score;
 my_high_score.innerHTML="最高分:"+high_score;
 document.game_set.start_button.disabled=false;
 document.game_set.pause_button.disabled=true;
 document.game_set.pause_button.value="暂停";
 alert(" GAME OVER!GAME SCORE:"+score);
 line=0;
 clear_line(1);
  for(i=0;i<M;i++)
  for(j=0;j<N;j++)
   arraybox[i][j]=0;
  speed=arrayspeed[document.game_set.game_speed.options[document.game_set.game_speed.selectedIndex].value];
  game_class=document.game_set.game_class.options[document.game_set.game_class.selectedIndex].value;
  set_game_class();
   stop=0;
  score=0;
 begin_go();
}
function ready_go(need_update)
{
 box_x=0;box_y=5;
 for(k=0;k<2;k++)
   for(m=0;m<4;m++)
 box[k][m]=new_box[k][m];
  for(m=0;m<4;m++)
  {if(arraybox[box[0][m]+box_x][box[1][m]+box_y]==1)
   {end();return;}
  }
 current_type=new_current_type;
 current_order=new_current_order;
 new_current_type=Math.floor(Math.random()*7);
 new_current_order=Math.floor(Math.random()*box_num[new_current_type]);
 for(k=0;k<2;k++)
 for(m=0;m<4;m++)
 new_box[k][m]=assorted_box[new_current_type][k][new_current_order][m];
 show_box(1);
 if(need_update) update();
 set_down();
}

function clear_box()
{
 var i,j;
 for(j=0;j<4;j++)
 {
  eval("document.box.img"+(box[0][j]+box_x)+"_"+(box[1][j]+box_y)+".src=box2.src");
 }
}
function change_box()
{
 var i,j,x,y;
 for(i=0;i<4;i++)
  {x=assorted_box[current_type][0][(current_order+1)%box_num[current_type]][i];
  y=assorted_box[current_type][1][(current_order+1)%box_num[current_type]][i];
  if((x+box_x)<0||(x+box_x)>=M||(y+box_y)<0||(y+box_y)>=N)
   return false;
  if(arraybox[box_x+x][box_y+y]==1)
   return false;
  } 
 
 clear_box();
 current_order++;
 for(i=0;i<2;i++)
 for(j=0;j<4;j++)
 {
  box[i][j]=assorted_box[current_type][i][(current_order)%box_num[current_type]][j];
 }
 show_box(0);
}

function left_box()
{
 
 var i;
 clear_box();
 box_y-=1;
 show_box(0);
}

function right_box()
{
var i;
 clear_box();
 box_y+=1;
 show_box(0);
}
function down_box()
{
var i;
 clear_box();
 box_x+=1;
 show_box(0);
}
function set_down()
{
 if (stop) return;
 score+=1;
 show_score();
 if(valid_move('down'))
 {
 down_box();
 window.setTimeout("set_down()",speed);
 }
 else
  {bomb();
  ready_go(0);} 
}
function bomb()
{
 var i,j,k,all,if_update=0;
 var m,n=0;
 m=new Array(0,0,0,0); 
 for(i=0;i<M;i++)
 {all=1;
  for(j=0;j<N;j++)
  all*=arraybox[i][j];
   if (all==1)
   {
    for(j=0;j<N;j++)
    {
    eval("document.box.img"+i+"_"+j+".src=box0.src");
    }
   for(k=i;k>0;k--)
   for(j=0;j<N;j++)
    {
    arraybox[k][j]=arraybox[k-1][j];      
    }
   m[n++]=i;
   if_update=1;        
   }
 } 
 if((m[3]-m[0])==3)
  score+=1500;
 else
 {if(((m[3]-m[1])==2)||((m[2]-m[0])==2))
  score+=700;
  else
  if(((m[3]-m[2])==1)||((m[2]-m[1])==1)||((m[1]-m[0])==1))
  {score+=300;
  if((m[3]*m[2]*m[0]!=0)||(m[3]*m[1]*m[0]!=0))
  score+=100;
  }
  else
  if((m[3]+m[2]+m[1]+m[0])!=0)
   score+=100;
 }    
 if(if_update)
  {
   update();
  }
}
function documentmousedown()
{
 if(event.button==2)
  alert("本系统只支持鼠标左键");
}
function documentload()
{
 if(document.readyState=='complete')
  {
  pro.style.visibility="hidden";
  state.innerHTML="小猪,我把格子放大了。你玩吧";
  help.innerHTML="帮助:等文件下载完后,按开始,然后用左右和向下键就可以操纵了,空格或回车是变形。快捷键:s:开始;p:暂停(继续); r:重新开始;q:关闭窗口"+"<br>"+"Copyright by lint.EMAIL:[email protected]. 2000.5 ";
  document.game_set.start_button.disabled=false;
  }
  
}
function load()
{
 if(progress<130&&document.readyState!='complete')
  {progress++;
  pro.style.width=(progress*4)+"px";
  window.setTimeout("load()",15);
  }  
 
}
function set_game_class()
{
 var i;
 for(i=0;i<M;i++)
  for(j=0;j<N;j++)
   arraybox[i][j]=0;
 for(i=M-1;i>M-1-game_class;i--)
  {for(j=0;j<N-3;j++)
  arraybox[i][Math.floor(Math.random()*N)]=1;
  }
}
document.onreadystatechange=documentload;
document.onkeydown=documentkeydown;
document.onmousedown=documentmousedown;
</Script>
</head>

<body bgcolor="#FFFFFF">

<div id="Layer1" style="position:absolute; left:171px; top:55px; width:229px; height:297px; z-index:1; background-color: #FFFFFF; layer-background-color: #FFFFFF; border: 1px none #000000">
 <form name="box">
<Script language="javascript">
var i,j;
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
document.write("<img name='img"+i+"_"+j+"' src='images/box2.jpg' width=15 height=15>");
document.writeln("<br>");
}
</Script>
</form>
</div>
<div id="Layer2" style="position:absolute; left:19px; top:65px; width:121px; height:94px; z-index:2; background-color: #ffffff; layer-background-color: #00000; border: 1px none #000000">
 <p>下一个:</p>
 <form name="new_box">
<Script language="javascript">
var i,j;
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
document.write("<img name='new_img"+i+"_"+j+"' src='images/box3.jpg' width=15 height=15>");
document.writeln("<br>");
}
</Script>
</form>
</div>
<div id="my_score" style="position:absolute; left:409px; top:84px; width:121px; height:24px; z-index:3; background-color: #F4FFFB; layer-background-color: #F4FFFB; border: 1px none #000000">
 分数:0 </div>
<div id="my_high_score" style="position:absolute; left:407px; top:55px; width:122px; height:25px; z-index:4; background-color: #E6FEFF; layer-background-color: #E6FEFF; border: 1px none #000000">最高分:0</div>
<div id="Layer4" style="position:absolute; left:408px; top:112px; width:123px; height:237px; z-index:5; background-color: #FFFBEC; layer-background-color: #FFFBEC; border: 1px none #000000">
 <form name="game_set" >
  <table width="75%" border="0" bordercolorlight="#CCCCFF" bordercolordark="#6666FF" bordercolor="#CCFFFF">
   <tr>
    <td>级别</td>
    <td>
     <select name="game_class">
      <option value="0">0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
      <option value="6">6</option>
      <option value="7">7</option>
      <option value="8">8</option>
      <option value="9">9</option>
     </select>
    </td>
   </tr>
   <tr>
    <td>速度</td>
    <td>
     <select name="game_speed">
      <option value="0" selected>0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
      <option value="6">6</option>
      <option value="7">7</option>
      <option value="8">8</option>
      <option value="9">9</option>
     </select>
    </td>
   </tr>
   <tr>
    <td>
     <input type="button" onClick="start_game()" name="start_button" value="开始">
    </td>
    <td>
     <input type="button" onclick="pause_game()" name="pause_button" value="暂停">
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" onclick="end()" name="restart_button" value="重新开始">
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" onClick="javascript:history.go(0)" name="Submit3" value="重置">
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" onClick="javascript:parent.window.close()" name="Button" value="退出游戏">
    </td>
   </tr>
  </table>
 </form>
</div>
<div id="Layer3" style="position:absolute; left:3px; top:7px; width:152px; height:42px; z-index:6"></div>
<div id="Layer5" style="position:absolute; left:183px; top:10px; width:216px; height:34px; z-index:7">
 <div align="center"><img src="images/els.jpg" width="150" height="26"></div>
</div>
<div id="state" style="position:absolute; left:16px; top:169px; width:135px; height:179px; z-index:8; background-color: #FEF4D8; layer-background-color: #FEF4D8; border: 1px none #000000">
 <p>载入中,请稍侯!</p>
 <p>&nbsp;</p>
</div>
<div id="help" style="position:absolute; left:16px; top:360px; width:537px; height:65px; z-index:9; background-color: #FFFFFF; layer-background-color: #FFFFFF; border: 1px none #000000">
</div>
<div id="pro" style="position:absolute; left:34px; top:394px; width:0px; height:25px; z-index:10; background-color: #003333; layer-background-color: #003333; border: 1px none #000000;visibility: visible"></div>
<Script language="javascript">
document.game_set.start_button.disabled=true;
document.game_set.pause_button.disabled=true;
document.game_set.restart_button.disabled=true;
load();
begin_go();
</Script>
</body>
</html>