📄 tetris.htm
字号:
{
c=0;
//计算该行的每格值的总和
for(j=2;j<14;j++)
{
if(isNaN(table[i*16+j])||i==21)
break;
c+=table[i*16+j];
}
//如果c==12,则表示该行每格都是某个积木格,则可删除
if(c==12)
{
DelLine(i);//删除该行
i++;//由于该行已被删除,再次从下一行开始判断
d++;//删除行数加1
}
}
if(d>0)
sco.innerText=parseInt(sco.innerText)+d*d*36;//加分,一次消去的行越多,分数越多
}
//判断是否满足game over条件的的函数
function Lucifer()
{
for(var i=2;i<14;i++)
{
if(table[16+i]==1) //若第一行有积木块,则game over
return true;
}
return false;
}
//游戏结束处理函数
function GameOver()
{
gameover=1;//设置游戏结束标志位
clearInterval(gameInterval);//结束游戏
block_div.innerHTML="";//先清空
for(i=0;i<21;i++)
{
for(j=2;j<14;j++)
{
setTimeout("table_tbl.rows(" + i + ").cells(" + j + ").style.background = colors[Math.round(Math.random()*7)];",16*i*j);//用随机颜色填满游戏区,这是俄罗斯方块的标准方式
}
}
nblock_div.innerHTML = "Game Over";//设置右边显示区出现"Game Over"字样。
}
//检测用户按键,这里主要是检测光标键和a,s,d,w和A,S,D,W键
function document_onkeydown()
{
if(gameover==1) //若游戏结束,则返回不响应
return;
with(block_div.style)
{
curX = pixelLeft;//获得游戏区的左边沿
curY = pixelTop;//获得游戏区的上边沿
switch(event.keyCode)//获得用户的按键
{
case 65://如果是A,则积木向左移动一步
case 97://如果是a,则与A同功能
case 37://如果是光标左键,则与A同功能
if(CanMove(curX-n_IncStep,curY,arr_curBlock))
pixelLeft-=n_IncStep;
break;
case 38://如果是光标上键,则积木变成下一形状
Change(1);
break;
case 87://如果是W,则积木变成上一形状
case 119://如果是w,则与W同功能
Change(-1);
break;
case 100://如果是d,则积木向右移动一步
case 68://如果是D,则与d同功能
case 39://如果是光标右键,则与d同功能
if(CanMove(curX+n_IncStep,curY,arr_curBlock))
pixelLeft+=n_IncStep;
break;
case 83://如果是S,则积木向下移动一步
case 115://如果是s,则与S同功能
case 40://如果是光标下键,则与S同功能
if(CanMove(curX,curY+n_IncStep,arr_curBlock))
{
pixelTop+=n_IncStep;
}
else//不能移动
{
SaveBlock();//则放置积木
DelLines();//删除可删的行
if(Lucifer())//判断是否达到游戏结束条件
{
GameOver();//如果达到则游戏结束
return;
}
sco.innerText=parseInt(sco.innerText)+2;//游戏未结束则总分加2
NewBlock();//开始进行下一步添加积木
}
break;
case 32://如果是空格符,则设定暂停,再次按下空格符则运行
if(pause==0)
{
clearInterval(gameInterval);//停止循环定时器
pause=1;
}
else
{
gameInterval=window.setInterval("Handle_Interval()",(maxspeed-speed+1)*60);//开始循环定时器
pause=0;
}
break;
default:
}
}
}
//在循环定时器中被调用的函数
//用来处理各种情况
function Handle_Interval()
{
curX = block_div.style.pixelLeft;//获得游戏区的当前左边沿,以像素为单位
curY = block_div.style.pixelTop;//获得游戏区的当前上边沿,以像素为单位
if(CanMove(curX,curY+n_IncStep,arr_curBlock))//用来判断是否可以下落
{
block_div.style.pixelTop+=n_IncStep;//如果可以则下落一个积木格的像素值,或者说是一行
}
else//如果无法下落
{
SaveBlock();//放置积木
DelLines();//删除所有可以删除的行
if(Lucifer())//如果达到游戏的结束条件
{
GameOver();//则游戏结束
return;
}
sco.innerText=parseInt(sco.innerText)+2//若游戏未结束则总分加2
NewBlock();//添加新的积木块
}
//若删除的行数大于某一标准
//则认为游戏者的水平可以达到下一标准,从而增加积木块的下落速度
if(killedlines>=clr_per_line)
{
killedlines-=clr_per_line;//减少删除行数纪录,以用来测试下一个标准
//增大游戏速度
if(speed<maxspeed)
speed++;
else
speed=maxspeed;
spd.innerText=speed;//在速度显示处显示速度
clearInterval(gameInterval);//由于速度变化造成循环定时器的时间间隔的变化,因此消除以前的定时器效果
gameInterval=window.setInterval("Handle_Interval()",(maxspeed-speed+1)*60);//开始新的循环定时器函数
}
}
//-->
</script>
<script event=onkeydown for=document language=javascript>
<!--
if(document.all)
document_onkeydown()//设置document.onkeydown事件的处理函数为document_onkeydown函数
//-->
</script>
<DIV id=block_div style="LEFT: 60px; TOP: 0px">
<TABLE border=0 cellPadding=0 cellSpacing=0 id=block_tbl>
<script>
//描述左边游戏区的积木块的属性
if(document.all)
{
for(var i=0;i<4;i++)
{
document.write("<tr>");
for(var j=0;j<4;j++)
{
document.write("<td style=\"border:1 solid black;\"></td>");
}
document.write("</tr>");
}
}
</script>
<TBODY>
</TBODY>
</TABLE>
</DIV>
<DIV id=nblock_div>
<TABLE border=0 cellPadding=0 cellSpacing=0 id=nblock_tbl>
<script>
//描述右边显示区的积木块的属性
if(document.all)
{
for(var i=0;i<4;i++)
{
document.write("<tr>");
for(var j=0;j<4;j++)
{
document.write("<td style=\"height:40;width:40;border:1 outset black;\"></td>");
}
document.write("</tr>");
}
}
</script>
<TBODY>
</TBODY>
</TABLE>
</DIV>
<DIV id=table_div>
<TABLE border=0 cellPadding=0 cellSpacing=0 id=table_tbl>
<script>
//描述游戏区
if(document.all)
{
for(var i=0;i<22;i++)
{
document.write("<tr>");
for(var j=0;j<16;j++)
{
var d2 = i * 16 + j;
if(table[d2]==1)
document.write("<td bgcolor=navy></td>");
else
document.write("<td style=\"background:black;\"></td>");
}
document.write("</tr>");
}
}
</script>
<TBODY>
</TBODY>
</TABLE>
</DIV>
<DIV id=title_div noWrap>
请输入数字(1-9)来调整速度:
<INPUT id=speedin size=8>
<BUTTON id=but onclick=begintet()>
开始
</BUTTON>
</DIV>
<DIV id=infobar_div>
<TABLE border=1 borderColor=navy cellPadding=0 cellSpacing=0>
<TBODY>
<TR align=middle>
<TD style="COLOR: #99ccff; FONT: 12px system; WIDTH: 56px">
<font size="2">
速度
</font>
:
</TD>
<TD id=spd style="COLOR: red; FONT: 12px system">
1
</TD>
<TD style="COLOR: #99ccff; FONT: 12px system; WIDTH: 86px">
总分:
</TD>
<TD id=sco style="COLOR: red; FONT: 12px system">
0
</TD>
<TD style="COLOR: #99ccff; FONT: 12px system; WIDTH: 96px">
成绩:
</TD>
<TD id=cll style="COLOR: red; FONT: 12px system">
0
</TD>
</TR>
</TBODY>
</TABLE>
</DIV>
<DIV id=infobar2_div>
</DIV>
<script id=MainSection language=javascript>
<!--
//初始化,在游戏区和显示区各显示一个积木块
//首先给出一块积木块,然后调用NewBlock()函数,这个函数使这里的积木块在游戏区显示
//然后NewBlock()函数会自动创建下一块积木并显示在右边的显示区
if(document.all)//IE浏览器
{
//利用随机发生器产生随机的颜色和积木
ncid = Math.round(Math.random()*(colors.length-1));//下一个积木块的颜色
bid = Math.round(Math.random()*(blocks.length-1));//下一块积木块编号
nextBlock = blocks[bid];//获得下一块积木
NewBlock();//调用下一块积木,在显示区显示
}
//开始游戏的函数
function begintet()
{
document.all.speedin.disabled=true//一旦开始游戏,则设定不能改变速度
document.all.but.disabled=true//设置不能按开始按钮
speed=parseInt(document.all.speedin.value);//获得用户输入的速度
if(isNaN(speed)||speed==null||speed>maxspeed||speed<1) //处理各种非法情况
speed=1;
spd.innerText=speed;//显示用户输入的速度
gameInterval=window.setInterval("Handle_Interval()",(maxspeed-speed+1)*60);//根据用户输入的速度值来设置游戏的速度,speed越大,则setInterval的时间参数越小,则游戏速度越快
}
//-->
</script>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -