今天翻看正理代码库时发现了很早以前用JS写过的一个俄罗斯方块,当时刚接触JS没多久,练手的一个小作品。现在看来确实有些幼稚,但是当初完成之后的那种成有感确实让我兴奋了好几天。
    <html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<head>
<title>Tetris</title>
<script>
var HNum = 14;
var VNum = 17;
var TModulesNum = 8;
var TetrisWidth = 30;
var TimeSpace = 1000;
var BColor = "#FFFFFF";
var FColor = "#FF0000";
var GridFColor = "#DDDDDD";
var GridColor = "#DDDDDD";
var TModules = new Array(TModulesNum);
var Target = 0;
var lock = false;
var TimeStop = false;
var Sqare = new Array(VNum);
var TimeSpaceStart = 1000;
var TimeSpaceStop = 300;
var MainTime = null;
var Score = 0;
//键盘监控
function InitKeydown() 
{
    document.onkeydown = showKeyDown
}
function showKeyDown(evt) 
{
    evt = (evt) ? evt : window.event
     
    switch (evt.keyCode)
    {
        case 37:
            MoveLeft();
            break;
        case 39:
            MoveRight();
            break;
        case 38:
            ReMatrix();
            break;
        case 40:
            ModuleQuickDropDown();
            break;
        case 32:
            if(document.getElementById("btnStart").disabled == true)
            {
                GameStop();
            }
            else
            {
                GameStart();
            }
            break;    
            
    }
     
}
//方块模型垂直和水平方向整序(VH = "V":垂直方向 VH = "H":水平方向 flag = 0:上小下大 flag = 1:上大下小)
function OrderByVH(VH,flag)
{
    var temp = "";
    for(var i =0;i< 4;i++)
    {
        for(var j = i + 1;j< 4;j++)
        {
            var vhi = 0;
            var vhj = 0;
            if(VH == "V")
            {
                vhi = Math.round(TModules[Target][i].split("_")[0]);
                vhj = Math.round(TModules[Target][j].split("_")[0]);
            }
            else if(VH == "H")
            {
                vhi = Math.round(TModules[Target][i].split("_")[1]);
                vhj = Math.round(TModules[Target][j].split("_")[1]);                
            }
            if(flag == 0)
            {
                if(vhi > vhj)
                {
                    temp = TModules[Target][i];
                    TModules[Target][i] = TModules[Target][j];
                    TModules[Target][j] = temp; 
                }
            }
            else
            {
                if(vhi < vhj)
                {
                    temp = TModules[Target][i];
                    TModules[Target][i] = TModules[Target][j];
                    TModules[Target][j] = temp; 
                }                
            }
        }
    }
}
//方块左移
function MoveLeft()
{    
    lock = false;
    if(lock == false)
    {
        lock = true;
        
        //检测碰撞
        //----------------------------------------------
        for(var t = 0;t < 4;t++)
        {
            var v = Math.round(TModules[Target][t].split("_")[0]);
            var h = Math.round(TModules[Target][t].split("_")[1]);
            if(h - 1 < 0)
            {
                lock = false;
                return;
            }
            
            var checkneed = true;
            for(var p = 0;p < 4;p++ )
            {
                if(p!=t)
                {
                    var pv = Math.round(TModules[Target][p].split("_")[0]);
                    var ph = Math.round(TModules[Target][p].split("_")[1]);
                    
                    if( v  == pv && ph == h - 1)
                    {
                        checkneed = false;
                    }
                }
            }
            
            if(v < 0 || h - 1 < 0 || checkneed == false)
            {
                continue;
            }
            
            if(Sqare[v][h - 1] == 1)
            {                
                lock = false;                
                return;
            }
        }
        //碰撞检测结束
        //----------------------------------------------------
        
        //方块左移
        //----------------------------------------------------
        OrderByVH("H",0); //左整序
        for(var i = 0;i < 4;i++)
        {
            var v = Math.round(TModules[Target][i].split("_")[0]);
            var h = Math.round(TModules[Target][i].split("_")[1]);
            var len = Math.round(TModules[Target][i].split("_").length);
            if(h - 1 >= 0)
            {                
                if(len == 3)
                {
                    TModules[Target][i] = v.toString() + "_" + (h - 1).toString() + "_D";
                }
                else
                {
                    TModules[Target][i] = v.toString() + "_" + (h - 1).toString();                    
                }
                if( v >= 0)
                {
                    var strT = document.getElementById("T" + v.toString() + "_" + (h - 1).toString());
                    var strF = document.getElementById("T" + v.toString() + "_" + h.toString());
                    if(strT != null)
                    {    
                        if(strF != null)
                        {
                            strF.style.backgroundColor = BColor;
                            Sqare[v][h] = 0;    
                        }                        
                        strT.style.backgroundColor = FColor;
                        Sqare[v][h - 1] = 1;                                    
                    }
                }
            }
        }
        //左移结束
        //--------------------------------------------------
        lock = false;
    }
}
//方块右移
function MoveRight()
{
    lock = false;
    if(lock == false)
    {
        lock = true;
        
        //检测碰撞
        //----------------------------------------------
        for(var t = 0;t < 4;t++)
        {
            var v = Math.round(TModules[Target][t].split("_")[0]);
            var h = Math.round(TModules[Target][t].split("_")[1]);
            if(h + 1>= HNum)
            {
                lock = false;
                return;
            }
            var checkneed = true;
            for(var p = 0;p < 4;p++ )
            {
                if(p!=t)
                {
                    var pv = Math.round(TModules[Target][p].split("_")[0]);
                    var ph = Math.round(TModules[Target][p].split("_")[1]);
                    
                    if( v  == pv && ph == h + 1)
                    {
                        checkneed = false;
                    }
                }
            }
            
            if(v < 0 || h + 1 >= HNum || checkneed == false)
            {
                continue;
            }
            
            if(Sqare[v][h + 1] == 1)
            {                
                lock = false;                
                return;
            }
        }
        //碰撞检测结束
        //----------------------------------------------------
        
        //方块右移
        //----------------------------------------------------
        OrderByVH("H",1); //右整序
        for(var i = 0;i < 4;i++)
        {
            var v = Math.round(TModules[Target][i].split("_")[0]);
            var h = Math.round(TModules[Target][i].split("_")[1]);
            var len = Math.round(TModules[Target][i].split("_").length);
            if(h + 1 < HNum)
            {                
                if(len == 3)
                {
                    TModules[Target][i] = v.toString() + "_" + (h + 1).toString() + "_D";
                }
                else
                {
                    TModules[Target][i] = v.toString() + "_" + (h + 1).toString();
                }
                if( v >= 0)
                {
                    var strT = document.getElementById("T" + v.toString() + "_" + (h + 1).toString());
                    var strF = document.getElementById("T" + v.toString() + "_" + h.toString());
                    if(strT != null)
                    {    
                        if(strF != null)
                        {
                            strF.style.backgroundColor = BColor;
                            Sqare[v][h] = 0;    
                        }                        
                        strT.style.backgroundColor = FColor;
                        Sqare[v][h + 1] = 1;                                    
                    }
                }
            }
        }
        //右移结束
        //--------------------------------------------------
        lock = false;
    }
}
//快速下落函数
function ModuleQuickDropDown()
{
    while(true&&lock!=true)
    {
        lock = true;
        //检测碰撞
        //----------------------------------------------
        for(var t = 0;t < 4;t++)
        {
            var v = Math.round(TModules[Target][t].split("_")[0]);
            var h = Math.round(TModules[Target][t].split("_")[1]);
            var checkneed = true;
            for(var p = 0;p < 4;p++ )
            {
                if(p!=t)
                {
                    var pv = Math.round(TModules[Target][p].split("_")[0]);
                    var ph = Math.round(TModules[Target][p].split("_")[1]);
                    
                    if( v + 1 == pv && ph == h)
                    {
                        checkneed = false;
                    }
                }
            }
                
            if(v + 1 < 0 || checkneed == false)
            {
                continue;
            }
            
            if(v + 1 >= VNum || Sqare[v + 1][h] == 1)
            {
                if(v + 1 == 0)
                {
                    lock = false;
                    GameOver();
                    return;
                }            
                ReLines();            
                GetTModule();
                lock = false;
                return;
            }
        }
        //碰撞检测结束
        //----------------------------------------------------
            
        //方块下落
        //----------------------------------------------------
        OrderByVH("V",1); //下整序
        for(var i = 0;i < 4;i++)
        {
            var v = Math.round(TModules[Target][i].split("_")[0]);
            var h = Math.round(TModules[Target][i].split("_")[1]);
            var len = Math.round(TModules[Target][i].split("_").length);
            if(v + 1 < VNum)
            {                
                if(len == 3)
                {
                    TModules[Target][i] = (v + 1).toString() + "_" + h.toString() + "_D";
                }
                else
                {
                    TModules[Target][i] = (v + 1).toString() + "_" + h.toString();
                }
                if( v + 1 >= 0)
                {
                    var strT = document.getElementById("T" + (v + 1).toString() + "_" + h.toString());
                    var strF = document.getElementById("T" + (v).toString() + "_" + h.toString());                    
                    if(v >=0)
                    {
                        strF.style.backgroundColor = BColor;
                        Sqare[v][h] = 0;                            
                    }    
                    strT.style.backgroundColor = FColor;
                    Sqare[v + 1][h] = 1;    
                }
            }
        }
        //下落结束
        //--------------------------------------------------
        lock = false;
    }
}
//方块下落
function ModuleDropDown()
{
    if(lock == false)
    {
        lock = true;
        
        //检测碰撞
        //----------------------------------------------
        for(var t = 0;t < 4;t++)
        {
            var v = Math.round(TModules[Target][t].split("_")[0]);
            var h = Math.round(TModules[Target][t].split("_")[1]);
            var checkneed = true;
            for(var p = 0;p < 4;p++ )
            {
                if(p!=t)
                {
                    var pv = Math.round(TModules[Target][p].split("_")[0]);
                    var ph = Math.round(TModules[Target][p].split("_")[1]);
                    
                    if( v + 1 == pv && ph == h)
                    {
                        checkneed = false;
                    }
                }
            }
            
            if(v + 1 < 0 || checkneed == false)
            {
                continue;
            }
            
            if(v + 1 >= VNum || Sqare[v + 1][h] == 1)
            {
                if(v + 1 == 0)
                {
                    lock = false;
                    GameOver();
                    if(MainTime != null)
                    {
                        clearTimeout(MainTime);
                    }
                    return;
                }                
                ReLines();                
                GetTModule();
                lock = false;
                if(MainTime != null)
                {
                    clearTimeout(MainTime);
                }
                setTimeout("ModuleDropDown()",TimeSpace);
                return;
            }
        }
        //碰撞检测结束
        //----------------------------------------------------
        
        //方块下落
        //----------------------------------------------------
        OrderByVH("V",1); //下整序
        for(var i = 0;i < 4;i++)
        {
            var v = Math.round(TModules[Target][i].split("_")[0]);
            var h = Math.round(TModules[Target][i].split("_")[1]);
            var len = Math.round(TModules[Target][i].split("_").length);
            if(v + 1 < VNum)
            {                
                if(len == 3)
                {
                    TModules[Target][i] = (v + 1).toString() + "_" + h.toString() + "_D";
                }
                else
                {
                    TModules[Target][i] = (v + 1).toString() + "_" + h.toString();
                }
                if( v + 1 >= 0)
                {
                    var strT = document.getElementById("T" + (v + 1).toString() + "_" + h.toString());
                    var strF = document.getElementById("T" + (v).toString() + "_" + h.toString());
                    if(v >=0)
                    {
                        strF.style.backgroundColor = BColor;
                        Sqare[v][h] = 0;                            
                    }    
                    strT.style.backgroundColor = FColor;
                    Sqare[v + 1][h] = 1;    
                }
            }
        }
        //下落结束
        //--------------------------------------------------
        lock = false;
    }
    MainTime = setTimeout("ModuleDropDown()",TimeSpace);
}
//旋转 待完善……
function ReMatrix()
{
    lock = false;
    if(lock == false)
    {
        lock = true;
    
        //矩阵旋转。
        //x' = y + a - b;
        //y' = -x + a + b;
    
        var v = -1;
        var h = -1;
        for(var t = 0;t< 4;t++)
        {        
            if(TModules[Target][t].split("_").length == 3)
            {
                v = Math.round(TModules[Target][t].split("_")[0]);
                h = Math.round(TModules[Target][t].split("_")[1]);
                break;
            }
        }    
        if(v == -1&&h== -1)
        {
            lock = false;
            return;
        }
        
        var TempModules = new Array(4);
        
        for(var i = 0;i< 4;i++)
        {
            var vn = Math.round(TModules[Target][i].split("_")[0]);
            var hn = Math.round(TModules[Target][i].split("_")[1]);        
            var len = Math.round(TModules[Target][i].split("_").length);        
            if(hn + v - h >= VNum || -vn + v + h < 0|| -vn + v + h >= HNum)
            {
                lock = false;
                return;
            }
            if(len == 3)