📄 月光软件站 - 编程文档 - script - javascript 寫遊戲 俄羅斯方塊.htm
字号:
<P>var BlockBW = 2;<BR>var BlockBS = 'inset';<BR>var BlockBC =
'orange';</P>
<P>var GlowColor = '#ffff00';<BR>var GlowStrength = 5;</P>
<P>var oSpeed = 151;</P>
<P> </P>
<P>//方塊數據</P>
<P>Block = [];<BR>Block[0]=[<BR>' ',<BR>'
1',<BR>'111']<BR>Block[0].change = 4;<BR>Block[0].color = 'red';</P>
<P>Block[1]=[<BR>' ',<BR>'1
',<BR>'111']<BR>Block[1].change = 4;<BR>Block[1].color =
'green';</P>
<P>Block[2]=[<BR>' ',<BR>' 1
',<BR>'111']<BR>Block[2].change = 4;<BR>Block[2].color =
'orange';</P>
<P>Block[3]=[<BR>' 11',<BR>'11 ']<BR>Block[3].change =
2;<BR>Block[3].color = 'fuchsia';</P>
<P>Block[4]=[<BR>'11 ',<BR>' 11']<BR>Block[4].change =
2;<BR>Block[4].color = 'yellow';</P>
<P>Block[5]=[<BR>'1111']<BR>Block[5].change = 2;<BR>Block[5].color =
'lime';</P>
<P>Block[6]=[<BR>'11',<BR>'11']<BR>Block[6].change =
1;<BR>Block[6].color = 'blue';</P>
<P><BR>Block[7]=[<BR>'1']<BR>Block[7].change = 1;<BR>Block[7].color
= 'gold';</P>
<P>Block[8]=[<BR>' ',<BR>'1
1',<BR>'111']<BR>Block[8].change = 4;<BR>Block[8].color =
'pink';</P>
<P>Block[9]=[<BR>'111',<BR>' 1 ',<BR>' 1 ']<BR>Block[9].change =
4;<BR>Block[9].color = 'black';</P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P>//方塊准備下落<BR>function ReadyForDown(obj1,obj2){<BR>obj1.k =
parseInt(Math.random()*Block.length);<BR>if(!NewBlock[obj1.k].length){<BR> switch(Block[obj1.k].change){<BR>
case 1:Change0(obj1.k);break;<BR> case
2:Change0(obj1.k);Change1(obj1.k);break;<BR> case
4:Change0(obj1.k);Change1(obj1.k);Change2(obj1.k);break;<BR>
}<BR> }<BR>obj1.Change =
parseInt(Math.random()*Block[obj1.k].change);<BR>obj2.innerHTML =
NewBlock[obj1.k][obj1.Change].iHtml;<BR>obj1.GapX =
parseInt(NewBlock[obj1.k][obj1.Change][0].length/2);<BR>CheckObjGapY(obj1,NewBlock[obj1.k][obj1.Change].length);<BR>obj1.X
= parseInt(Cells/2);<BR>obj1.Y = 0;<BR>}</P>
<P>function
CheckObjGapY(obj,k){<BR>if(!NewBlock[obj.k][obj.Change][k-1].join('').match(/\d+/)){<BR> obj.GapY
= 1-k;<BR> CheckObjGapY(obj,k-1);<BR> }<BR>else obj.GapY =
-k;<BR>}</P>
<P>//改變方塊形狀<BR>function ChangeBlock(){<BR>if(Block[Obj1.k].change
> 1){<BR> Obj1.TestChange = (Obj1.Change+1 >=
Block[Obj1.k].change)?0:Obj1.Change+1;<BR> Obj1.TestGapX =
parseInt(NewBlock[Obj1.k][Obj1.TestChange][0].length/2);<BR> Obj1.TestGapY
= -NewBlock[Obj1.k][Obj1.TestChange].length;<BR> Obj1.TestL =
Obj1.X-Obj1.TestGapX;<BR> Obj1.TestT =
Obj1.Y+Obj1.TestGapY;<BR> var k1 = k2 = Areas;<BR> for(var
i=Obj1.TestL;i>=0 &&
i>Obj1.TestL-NewBlock[Obj1.k][Obj1.TestChange].lg;i--){if((k1=CheckChangeBlock(i))!=Areas)break}<BR> for(var
i=Obj1.TestL+1;i<Cells &&
i<Obj1.TestL+NewBlock[Obj1.k][Obj1.TestChange].lg;i++){if((k2=CheckChangeBlock(i))!=Areas)break}<BR> if(k1
== k2) return;<BR> Obj1.L =
(Math.abs(Obj1.TestL-k1)>Math.abs(Obj1.TestL-k2))?k2:k1;<BR> Obj1.T
= Obj1.TestT;<BR> Obj1.GapX = Obj1.TestGapX;<BR> Obj1.GapY
= Obj1.TestGapY;<BR> Obj1.X = Obj1.L+Obj1.GapX;<BR> Obj1.Y
= Obj1.T-Obj1.GapY;<BR> Obj1.Change =
Obj1.TestChange;<BR> SkinDiv.style.left =
Obj1.L*ObjW;<BR> SkinDiv.style.top =
Obj1.T*ObjH;<BR> SkinDiv.innerHTML =
NewBlock[Obj1.k][Obj1.Change].iHtml;<BR> }<BR>}</P>
<P> </P>
<P>檢測改變後,方塊相對於左邊的值。</P>
<P>function CheckChangeBlock(lefts){<BR>for(var
y=0;y<NewBlock[Obj1.k][Obj1.TestChange].length;y++){<BR> for(var
x=0;x<NewBlock[Obj1.k][Obj1.TestChange][0].length;x++){<BR>
if(NewBlock[Obj1.k][Obj1.TestChange][y][x]==1){<BR>
try{if(Map[Obj1.TestT+y][lefts+x] != ' ') return
Areas}<BR> catch(e){}<BR> }<BR>
}<BR> }<BR>return lefts;<BR>}</P>
<P> </P>
<P> </P>
<P>//方向控制</P>
<P>function Dir(xx,yy){<BR>var special =
false<BR>if(NewBlock[Obj1.k][Obj1.Change].length==1 &&
NewBlock[Obj1.k][Obj1.Change][0]==1)<BR> for(var
y=Obj1.T+1;y<Rows-1;y++)<BR> if(Map[y+yy][Obj1.L]=="
"){<BR> special = true<BR>
break;<BR> }<BR>for(var
y=NewBlock[Obj1.k][Obj1.Change].length-1;y>=0;y--){<BR> for(var
x=NewBlock[Obj1.k][Obj1.Change][0].length-1;x>=0;x--){<BR>
if(NewBlock[Obj1.k][Obj1.Change][y][x]==1){<BR>
try{<BR> if(yy==0 && (Obj1.L+x+xx<0 ||
Obj1.L+x+xx>=Cells || Map[Obj1.T+y][Obj1.L+x+xx]==1))
return;//橫<BR> if(Obj1.T+y+yy>=Rows || (!special
&& Map[Obj1.T+y+yy][Obj1.L+x+xx]==1)) return
CreateBlockInMap();//豎<BR> }<BR>
catch(e){}<BR> }<BR>
}<BR> }<BR>SkinDiv.style.left =
(Obj1.L=(Obj1.X+=xx)-Obj1.GapX)*ObjW;<BR>SkinDiv.style.top =
(Obj1.T=(Obj1.Y+=yy)+Obj1.GapY)*ObjH;<BR>}</P>
<P> </P>
<P>//開始創造地圖啦。<BR>function CreateBlockInMap(){<BR>for(var
y=0;y<NewBlock[Obj1.k][Obj1.Change].length;y++){<BR> for(var
x=0;x<NewBlock[Obj1.k][Obj1.Change][0].length;x++){<BR>
try{<BR>
if(NewBlock[Obj1.k][Obj1.Change][y][x]==1){<BR>
Map[Obj1.T+y][Obj1.L+x] =
NewBlock[Obj1.k][Obj1.Change][y][x];<BR>
BaseDiv.childNodes[Areas-(Obj1.T+y)*Cells+Obj1.L+x].style.background
= Block[Obj1.k].color;<BR>
BaseDiv.childNodes[Areas-(Obj1.T+y)*Cells+Obj1.L+x].style.visibility
= 'visible';<BR> }<BR> }<BR> catch(e){return
GameOver()}<BR>
}<BR> }<BR>CheckBlockAppear();<BR>ReadyForDown(Obj2,ReadyBlockDiv);<BR>}</P>
<P><BR>function
CheckBlockAppear(){<BR>clearInterval(GoTime2);<BR>GoTime2=0<BR>var
NewMap = [];<BR>var iHtml = '';<BR>var k = Rows-1;<BR>var kk =
-1;<BR>for(var y=Rows-1;y>=0;y--){<BR> if(Map[y].join('') !=
FullString){NewMap[k--] = Map[y]}<BR> else{<BR>
kk++;<BR> for(var x=0;x<Cells;x++){<BR>
BaseDiv.childNodes[Areas-(y+kk)*Cells].removeNode(true);<BR>
iHtml += "<span
style='width:"+ObjW+";height:"+ObjH+";border:"+BlockBW+" "+BlockBS+"
"+BlockBC+";overflow:hidden;visibility:hidden;'></span>";<BR>
}<BR> }<BR> }<BR>for(;k>=0;k--){<BR> NewMap[k] =
[];<BR> for(var x=0;x<Cells;x++){<BR> NewMap[k][x] = '
';<BR> }<BR> }<BR>if(kk!=-1) ScoreDiv.innerHTML =
(Scores+=Marks[kk]);//Cal the Scores<BR>for(var
i=0;i<Rows;i++){Map[i]=NewMap[i]}<BR>BaseDiv.innerHTML +=
iHtml;<BR>for(i in Obj2){Obj1[i] = Obj2[i]}//Obj2 =>
Obj1<BR>SkinDiv.innerHTML =
NewBlock[Obj1.k][Obj1.Change].iHtml;<BR>SkinDiv.style.left = (Obj1.L
= Obj1.X-Obj1.GapX)*ObjW;<BR>SkinDiv.style.top = (Obj1.T =
Obj1.GapY)*ObjH;<BR>}</P>
<P><BR>function GameOver(){<BR>if(confirm('Game Over , ReStart ?'))
window.location.reload();<BR>else window.close();<BR>}</P>
<P> </P>
<P>//初始化方塊的變形數組</P>
<P>function Change0(k){<BR>NewBlock[k] = [];<BR>NewBlock[k][0] =
[];<BR>NewBlock[k][0].iHtml = '';<BR>for(var
y=0;y<Block[k].length;y++){<BR> NewBlock[k][0][y] =
[];<BR> for(var x=0;x<Block[k][0].length;x++){<BR>
NewBlock[k][0].iHtml +=
((NewBlock[k][0][y][x]=Block[k][y].charAt(x)) ==
1)?BlockHtml(x,y,k):"";<BR>
}<BR> }<BR>CheckBlockLong(k,0);<BR>}</P>
<P>function Change1(k){<BR>NewBlock[k][1] =
[];<BR>NewBlock[k][1].iHtml = '';<BR>for(var
y=0;y<Block[k][0].length;y++){<BR> NewBlock[k][1][y] =
[];<BR> for(var x=0;x<Block[k].length;x++){<BR>
NewBlock[k][1].iHtml +=
((NewBlock[k][1][y][x]=Block[k][Block[k].length-x-1].charAt(y)) ==
1)?BlockHtml(x,y,k):"";<BR>
}<BR> }<BR>CheckBlockLong(k,1);<BR>}</P>
<P>function Change2(k){<BR>NewBlock[k][2] = [];<BR>NewBlock[k][3] =
[];<BR>NewBlock[k][2].iHtml = '';<BR>NewBlock[k][3].iHtml =
'';<BR>for(var
y=0;y<Block[k].length;y++){<BR> NewBlock[k][2][y] =
[];<BR> for(var x=0;x<Block[k][0].length;x++){<BR>
NewBlock[k][2].iHtml +=
((NewBlock[k][2][y][x]=Block[k][Block[k].length-y-1].charAt(Block[k][0].length-x-1))
== 1)?BlockHtml(x,y,k):"";<BR> }<BR> }<BR>for(var
y=0;y<Block[k][0].length;y++){<BR> NewBlock[k][3][y] =
[];<BR> for(var x=0;x<Block[k].length;x++){<BR>
NewBlock[k][3].iHtml +=
((NewBlock[k][3][y][x]=Block[k][x].charAt(Block[k][0].length-y-1))
== 1)?BlockHtml(x,y,k):"";<BR>
}<BR> }<BR>CheckBlockLong(k,2);<BR>CheckBlockLong(k,3);<BR>}</P>
<P>function BlockHtml(x,y,k){<BR>return "<span
style='position:absolute;left:"+x*ObjW+";top:"+y*ObjH+";width:"+ObjW+";height:"+ObjH+";background:"+Block[k].color+";border:"+BlockBW+"
"+BlockBS+" "+BlockBC+";overflow:hidden;'></span>"<BR>}</P>
<P>function CheckBlockLong(k,i){<BR>for(var
y=0;y<NewBlock[k][i].length;y++){<BR> NewBlock[k][i][y].lg =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -