日期:2014-05-16  浏览次数:20359 次

分享自己写的Javascript的俄罗斯方块+送分(二)
今天加入方块预告和计分功能,再来分享一下~ 效果图如下:(貌似界面不太美观,下次优化啦~)

HTML code

<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
  .c{margin:1px; width:19px; height:19px; background:red; position:absolute;}
  .d{margin:1px; width:19px; height:19px; background:gray; position:absolute;}
  .f{top:0px; left:0px; background:black; position:absolute;}
  .e{top:0px; background:#151515; position:absolute;}
  .g{width:100px; height:20px; color:white; position:absolute;}
</style>
<script type="text/javascript">

var row = 18;
var col = 10;
var announcement = 6;
var size = 20;
var isOver = false;
var shapes = ("0,1,1,1,2,1,3,1;1,0,1,1,1,2,2,2;2,0,2,1,2,2,1,2;0,1,1,1,1,2,2,2;1,2,2,2,2,1,3,1;1,1,2,1,1,2,2,2;0,2,1,2,1,1,2,2").split(";");
var tetris;
var container;

function createElm(tag,css)
{
  var elm = document.createElement(tag);
  elm.className = css;
  document.body.appendChild(elm);
  return elm;
}

function Tetris(css,x,y,shape)
{

  // 创建4个div用来组合出各种方块
  var myCss = css?css:"c";
  this.divs = [createElm("div",myCss),createElm("div",myCss),createElm("div",myCss),createElm("div",myCss)];
  
  if(!shape)
  {
    this.divs2 = [createElm("div",myCss),createElm("div",myCss),createElm("div",myCss),createElm("div",myCss)];    
    this.score = createElm("div","g");
    this.score.style.top = 10*size+"px";
    this.score.style.left = (col- -1)*size+"px";
    this.score.innerHTML = "score:0";
  }
  
  this.container = null;
  
  this.refresh = function()
  {
    this.x = (typeof(x)!='undefined')?x:3;
    this.y = (typeof(y)!='undefined')?y:0;
    
    // 如果有传参,优先使用参数的,如果有预告,优先使用预告,都没有就自己生成
    if(shape)
      this.shape = shape;
    else if(this.shape2)
      this.shape = this.shape2;
    else
      this.shape = shape?shape:shapes[Math.floor((Math.random()*shapes.length-0.000000001))].split(",");
    
    this.shape2 = shapes[Math.floor((Math.random()*shapes.length-0.000000001))].split(",");
    
    if(this.container && !this.container.check(this.x,this.y,this.shape))
    {
      isOver = true;
      alert("游戏结束");
    }
    else
    {
     this.show();
     this.showScore();
     this.showAnnouncement();
    }
  }
  
  // 显示方块
  this.show = function()
  {
    for(var i in this.divs)
    {
      this.divs[i].style.top = (this.shape[i*2+1]- -this.y)*size+"px";
      this.divs[i].style.left = (this.shape[i*2]- -this.x)*size+"px";
    }
  }
  
  // 显示预告
  this.showAnnouncement = function()
  {
    for(var i in this.divs2)
    {
      this.divs2[i].style.top = (this.shape2[i*2+1]- -1)*size+"px";
      this.divs2[i].style.left = (this.shape2[i*2]- -1- -col)*size+"px";
    }
  }
  
  // 显示分数
  this.showScore = function()
  {
    if(this.container && this.score)
    {
      this.score.innerHTML = "score:" + this.container.score;
    }
  }
  
  // 水平移动方块的位置
  this.hMove = function(step)
  {
    if(this.container.check(this.x- -step,this.y,this.shape))
    {
      this.x += step;
      this.show();
    }
  }
  
  // 垂直移动方块位置
  this.vMove = function(step)
  {
    if(this.container.check(this.x,this.y- -step,this.shape))
    {
      this.y += step;
      this.show();
    }
    else
    {
      this.container.fixShape(this.x,this.y,this.shape);
      this.container.findFull();
      this.refresh();
    }
  }
  
  // 旋转方块
  this.rotate = function()
  {
    var newShape = [this.shape[1],3-this.shape[0],this.shape[3],3-this.shape[2],this.shape[5],3-this.shape[4],this.shape[7],3-this.shape[6]];
    if(this.container.check(this.x,this.y,newShape))
    {
      this.shape