javascript俄罗斯方块(JS初学作品)
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 212
今天翻看正理代码库时发现了很早以前用JS写过的一个俄罗斯方块,当时刚接触JS没多久,练手的一个小作品。现在看来确实有些幼稚,但是当初完成之后的那种成有感确实让我兴奋了好几天。<htmlxmlns

今天翻看正理代码库时发现了很早以前用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)
联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2