⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tetris.htm

📁 打开浏览器就可以玩的俄罗斯方块游戏
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      {
        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>
      &nbsp;
    <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 + -