一個javascript指令碼寫的俄羅斯方塊 (轉)

worldblog發表於2007-12-10
一個javascript指令碼寫的俄羅斯方塊 (轉)[@more@]

Russia.htm




俄羅斯方塊








 
 
 


 得分:     


 級別:     


 行數:     


 

<!-- 遊戲主區域 --&gt
 <!-- 遊戲預報區域 --&gt


 


 


 


 
 




Russia.js

var Cols = 10, Rows = 20, en = 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 p= 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 = "

";
 for(var i=0; i s = s + "";
 for(var j=0; j var id = name + i + "#" + j;
 s = s + ""
 }
 s = s + "";
 }
 s = s + "
 
";
 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 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 obj = document.all(name + sq[i].rows + "#" + sq[i].cols);
 obj.style.background = Color[0];
 }
}

function isBounds(sq){
 for(var i=0; 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 if(sq[i].rows>Max) Max = sq[i].rows;
 }
 }
 else{
 for(var i=0; i if(sq[i].cols>Max) Max = sq[i].cols;
 } 
 }
 return Max;
 }
 else{
 var Min = 20;
 if(name=="Rows"){
 for(var i=0; i if(sq[i].rows }
 }
 else{
 for(var i=0; i if(sq[i].cols } 
 }
 return Min;
 }
}

function StartGame(){
 start.disabled = true;
 pause.focus();
 type = parseInt(Math.ran()*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 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;
 l:
 for(var i=0; i obj = document.all("Main" + to[i].rows + "#" + to[i].cols);
 if(obj.style.background != Color[0]){
 for(var j=0; 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 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 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 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();
 }
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990966/,如需轉載,請註明出處,否則將追究法律責任。

相關文章