var cols = 10, rows = 20, sqlen = 16;
var color = new array(8);
var delline = new array();
var cloc = new array();
var rloc = new array();
var cursq,nextsq;
var type=-1,oldtype;
var delay = new array(600,500,400,300,200,100,90,80,70);
var timerid;
var pos = 0,end,level=0,score=0,lines=0;
var isover=false,ispause=false;
color[0] = "#d0d0d0";
color[1] = "red";
color[2] = "green"
color[3] = "cyan";
color[4] = "yellow";
color[5] = "orange";
color[6] = "pink";
color[7] = "blue";
function gamearea(row,col,name){
var s = "<table border=1 cellspacing=0 cellpadding=1 bgcolor=" + color[0] + ">";
for(var i=0; i<row; i++){
s = s + "<tr height=" + sqlen + ">";
for(var j=0; j<col; j++){
var id = name + i + "#" + j;
s = s + "<td width=" + sqlen + " class=btnup id=" + id;
s = s + " style=\"background:" + color[0] + "\"> </td>"
}
s = s + "</tr>";
}
s = s + "</table>";
return s;
}
function init(){
gamebody.innerhtml = gamearea(rows,cols,main);
gameforecast.innerhtml = gamearea(4,4,forecast);
}
function square(cols,rows,color){
this.rows = rows;
this.cols = cols;
this.color = color;
}
function choosesquare(type,x,y){
var sq = new array(4);
switch(type){
case 0:
sq[0] = new square(x-1,y,1);
sq[1] = new square(x,y,1);
sq[2] = new square(x+1,y,1);
sq[3] = new square(x+2,y,1);
break;
case 1:
sq[0] = new square(x,y,5);
sq[1] = new square(x,y+1,5);
sq[2] = new square(x+1,y+1,5);
sq[3] = new square(x,y+2,5);
break;
case 2:
sq[0] = new square(x,y,2);
sq[1] = new square(x,y+1,2);
sq[2] = new square(x+1,y+1,2);
sq[3] = new square(x+1,y+2,2);
break;
case 3:
sq[0] = new square(x+1,y,7);
sq[1] = new square(x+1,y+1,7);
sq[2] = new square(x,y+1,7);
sq[3] = new square(x,y+2,7);
break;
case 4:
sq[0] = new square(x,y,3);
sq[1] = new square(x+1,y,3);
sq[2] = new square(x,y+1,3);
sq[3] = new square(x+1,y+1,3);
break;
case 5:
sq[0] = new square(x,y,6);
sq[1] = new square(x+1,y,6);
sq[2] = new square(x+1,y+1,6);
sq[3] = new square(x+1,y+2,6);
break;
case 6:
sq[0] = new square(x+1,y,4);
sq[1] = new square(x,y,4);
sq[2] = new square(x,y+1,4);
sq[3] = new square(x,y+2,4);
break;
}
return sq;
}
function redraw(name,sq){
var obj;
for(var i=0; i<sq.length; i++){
obj = document.all(name + sq[i].rows + "#" + sq[i].cols);
obj.style.background = color[sq[i].color];
}
}
function cleardraw(name,sq){
var obj;
for(var i=0; i<sq.length; i++){
obj = document.all(name + sq[i].rows + "#" + sq[i].cols);
obj.style.background = color[0];
}
}
function isbounds(sq){
for(var i=0; i<sq.length; i++){
if(sq[i].cols<0 || sq[i].cols>9 || sq[i].rows<0 || sq[i].rows>19)
return false;
}
return true;
}
function sortsquare(sq,name,ismax){
if(ismax){
var max = 0;
if(name=="rows"){
for(var i=0; i<sq.length; i++){
if(sq[i].rows>max) max = sq[i].rows;
}
}
else{
for(var i=0; i<sq.length; i++){
if(sq[i].cols>max) max = sq[i].cols;
}
}
return max;
}
else{
var min = 20;
if(name=="rows"){
for(var i=0; i<sq.length; i++){
if(sq[i].rows<min) min = sq[i].rows;
}
}
else{
for(var i=0; i<sq.length; i++){
if(sq[i].cols<min) min = sq[i].cols;
}
}
return min;
}
}
function startgame(){
start.disabled = true;
pause.focus();
type = parseint(math.random()*7);
oldtype = type;
type = parseint(math.random()*7);
var m = 4/2 -1;
newsq = choosesquare(type,m,0);
redraw(forecast,newsq);
start();
}
function start(){
if(isover){
var s = "本次游戏结束! ";
overgame(s);
}
gscore.innertext = score;
gline.innertext = lines;
glevel.innertext = level;
oldtype = type;
cleardraw(forecast,newsq);
type = parseint(math.random()*7);
var m = 4/2 -1;
newsq = choosesquare(type,m,0);
redraw(forecast,newsq);
var mm = cols/2 -1;
cursq = choosesquare(oldtype,mm,0);
redraw(main,cursq);
window.clearinterval(timerid);
timerid = window.setinterval("run()",delay[level]);
}
function run(){
if(ispause) return;
if(movecursq(0,1,false) == false){
window.clearinterval(timerid);
if(removelines()==true) {
dellines();
lines = lines + delline.length;
switch(delline.length){
case 1:
score = score + 100;
break;
case 2:
score = score + 300;
break;
case 3:
score = score + 700;
break;
case 4:
score = score + 1000;
break;
}
level = parseint(score/10000);
}
start();
}
}
function removelines(){
var obj,m=0;
var isremove = true;
var searchpos = true;
var del = new array();
for(var i=19; i>=0; i–){
for(var j=0; j<10; j++){
obj = document.all("main" + i + "#" + j);
if(obj.style.background == color[0]){
isremove = false;
}
else{
searchpos = false;
}
}
if(searchpos) {
end = i;
if(del.length>0){delline=del;return true;}
else{return false;}
}
if(isremove) {del[m] = i; m++;}
searchpos = true;
isremove = true;
}
}
function dellines(){
var deleted = 0;
var obj;
for(var i=0; i<delline.length; i++){
for(var j=0; j<10; j++){
obj = document.all("main" + delline[i] + "#" + j);
obj.style.background = color[0];
}
deleted = deleted + 1;
if(delline.length>deleted)
{
if(delline[i]-delline[i+1]>1) redrawline(delline[i+1],delline[i],deleted);
}
}
redrawline(end,delline[delline.length – 1],deleted);
}
function redrawline(endline,startline,moveline){
var obj;
for(var i= startline – 1; i>endline; i–){
for(var j=0; j<10; j++){
obj = document.all("main" + i + "#" + j);
var oldcolor = obj.style.background;
obj.style.background = color[0];
var rowid = i + moveline;
obj = document.all("main" + rowid + "#" + j);
obj.style.background = oldcolor;
}
}
}
function movesquare(from,to){
if(isbounds(to) == false) return false;
var obj;
loop:
for(var i=0; i<to.length; i++){
obj = document.all("main" + to[i].rows + "#" + to[i].cols);
if(obj.style.background != color[0]){
for(var j=0; j<from.length; j++)
if(to[i].cols==from[j].cols&&to[i].rows==from[j].rows&&to[i].color==from[j].color)
continue loop;
return false
}
}
return true;
}
function movecursq(x,y,isrotate){
nextsq = new array(cursq.length);
for(var i=0; i<cursq.length; i++){
if(isrotate){
var dx = cursq[i].cols – cursq[0].cols;
var dy = cursq[i].rows – cursq[0].rows;
nextsq[i] = new square(cursq[0].cols-dy,cursq[0].rows+dx,cursq[i].color);
}
else
nextsq[i] = new square(cursq[i].cols+x,cursq[i].rows+y,cursq[i].color);
}
if(isrotate) renextsq();
if(movesquare(cursq,nextsq) == false){
for(var i=0; i<cursq.length; i++){
if((cursq[i].rows==0&&cursq[i].cols==cols/2)||(cursq[i].rows==0&&cursq[i].cols==cols/2-1))
isover = true;
}
return false;
}
cleardraw(main,cursq);
cursq = nextsq;
redraw(main,cursq);
return true;
}
function renextsq(){
var mincols = sortsquare(nextsq,cols,false);
var minrows = sortsquare(nextsq,rows,false);
var maxcols = sortsquare(nextsq,cols,true);
var maxrows = sortsquare(nextsq,rows,true);
if(mincols<0) changenextsq(cols,-mincols);
if(minrows<0) changenextsq(rows,-minrows);
if(maxcols>9) changenextsq(cols,9-maxcols);
if(maxrows>19) changenextsq(rows,19-maxrows);
}
function changenextsq(name,pos){
for(var i=0; i<nextsq.length; i++){
if(name="rows")
nextsq[i].rows = nextsq[i].rows + pos;
else
nextsq[i].cols = nextsq[i].cols + pos;
}
}
function keydown(){
switch(event.keycode){
case 40:
movecursq(0,1,false);
break;
case 37:
movecursq(-1,0,false);
break;
case 38:
movecursq(0,0,true);
break;
case 39:
movecursq(1,0,false);
break;
}
}
function pausegame(){
if(pause.innertext == "暂停游戏"){
ispause = true;
pause.innertext = "继续游戏";
pause.focus();
}
else{
ispause = false;
pause.innertext = "暂停游戏";
pause.focus();
run();
}
}
function overgame(str){
if(typeof(str)=="undefined") str = "你的得分:" + score +"。是否重玩游戏? ";
else str = str + "你的得分:" + score +"。是否重玩游戏? ";
var isok = window.confirm(str);
if(!isok) {
document.location.reload();
window.close();
}
else{
document.location.reload();
}
}
