<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>俄罗斯扇块</title>
</head>
<body style="margin:0px;padding:0px;">
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0" />
<canvas id="c"></canvas>
<script>
var c=document.getElementById("c");
var ctx=c.getContext("2d");
var screenwidth=document.width,screenheight=document.height;
c.width=document.width;
c.height=document.height;
var r=~~(Math.min(screenwidth,screenheight)/2);
var rot=0.0,app=0,approaching=false;
var grid=false,inverse=true,shadow=true;
var lp=0;
var keys=[];
var frame=0,mode=0,str="";
var HOME=0,GAME=1,CONTROLS=2,SETTINGS=3,GAMEOVER=4;
var squares=[];
var score=0,times=0;
var int=40;
var touchxsec=6,touchysec=8;
var jcur=0,typecur=0,poscur=0,typenext=0,posnext=0;
var button=[];
var shapes=
[
[ [-1,0],[0,0],[1,0],[2,0] ],
[ [0,2],[0,1],[0,0],[0,-1] ],
[ [-1,0],[0,0],[1,0],[2,0] ],
[ [0,2],[0,1],[0,0],[0,-1] ],
[ [0,0],[0,-1],[-1,0],[-1,-1] ],
[ [0,0],[0,-1],[-1,0],[-1,-1] ],
[ [0,0],[0,-1],[-1,0],[-1,-1] ],
[ [0,0],[0,-1],[-1,0],[-1,-1] ],
[ [-1,0],[0,0],[0,1],[1,0] ],
[ [0,1],[0,0],[0,-1],[1,0] ],
[ [-1,0],[0,0],[0,-1],[1,0] ],
[ [0,1],[0,0],[0,-1],[-1,0] ],
[ [-1,1],[-1,0],[0,0],[1,0] ],
[ [0,1],[0,0],[0,-1],[1,1] ],
[ [-1,0],[0,0],[1,0],[1,-1] ],
[ [0,1],[0,0],[0,-1],[-1,-1] ],
[ [1,1],[1,0],[0,0],[-1,0] ],
[ [0,1],[0,0],[0,-1],[1,-1] ],
[ [1,0],[0,0],[-1,0],[-1,-1] ],
[ [0,1],[0,0],[0,-1],[-1,1] ],
[ [0,-1],[0,0],[1,0],[1,1] ],
[ [-1,0],[0,0],[0,-1],[1,-1] ],
[ [0,-1],[0,0],[1,0],[1,1] ],
[ [-1,0],[0,0],[0,-1],[1,-1] ],
[ [0,-1],[0,0],[-1,0],[-1,1] ],
[ [1,0],[0,0],[0,-1],[-1,-1] ],
[ [0,-1],[0,0],[-1,0],[-1,1] ],
[ [1,0],[0,0],[0,-1],[-1,-1] ]
];
var color=["#000","#FF0000","#00FF00","#0000FF","#FFFF00","FF00FF","#00FFFF"];
var imgbg=new Image();
imgbg.src="background.jpg";
//buttons
var buttons=function()
{
var xp=0.0,yp=0.0,wp=0.0,hp=0.0;
var border=true,bordercolor="#FFFFFF";
var text="",txp=0.0,typ=0.0,fzp=0.0,fc="#FFFFFF";
this.setpos=function(sxp,syp,swp,shp,sborder,sbordercolor)
{
xp=sxp;
yp=syp;
wp=swp;
hp=shp;
if(sborder!==undefined){border=sborder;}
if(sbordercolor!==undefined){bordercolor=sbordercolor;}
}
this.settext=function(stext,stxp,styp,sfzp,sfc)
{
text=stext;
if(stxp!==undefined){txp=stxp;}
if(styp!==undefined){typ=styp;}
if(sfzp!==undefined){fzp=sfzp;}
if(sfc!==undefined){fc=sfc;}
}
this.clickevent=function(){}
this.onclick=function(x,y)
{
if(x>r*xp&&x<r*(xp+wp)&&y>r*yp&&y<r*(yp+hp))
{
this.clickevent();
return true;
}
return false;
}
this.draw=function()
{
ctx.fillStyle=fc;
ctx.strokeStyle=bordercolor;
if(border){ctx.strokeRect(r*xp,r*yp,r*wp,r*hp);}
ctx.font=~~(fzp*r)+"px Comic Sans MS";
ctx.fillText(text,r*(txp+xp),r*(typ+yp));
}
}
//loadhomepagebuttons
function loadhomepagebuttons()
{
button=[];
button[0]=new buttons();
with(button[0])
{
setpos(0.7,0.6,0.6,0.2,false);
settext("START",0.04,0.15,0.15);
clickevent=function(){newgame();}
}
button[1]=new buttons();
with(button[1])
{
setpos(0.7,0.85,0.6,0.2,false);
settext("Controls",0.0,0.15,0.15);
clickevent=function(){loadcontrolsbuttons();mode=CONTROLS;}
}
button[2]=new buttons();
with(button[2])
{
setpos(0.7,1.1,0.6,0.2,false);
settext("Settings",0.0,0.15,0.15);
clickevent=function(){loadsettingsbuttons();mode=SETTINGS;}
}
}
//loadcontrolsbuttons
function loadcontrolsbuttons()
{
button=[];
button[0]=new buttons();
with(button[0])
{
setpos(0.8,1.45,0.4,0.1);
settext("BACK",0.1,0.08,0.08);
clickevent=function(){loadhomepagebuttons();mode=HOME;}
}
}
//loadgameoverbuttons
function loadgameoverbuttons()
{
button=[];
button[0]=new buttons();
with(button[0])
{
setpos(0.4,1.4,0.4,0.1,true,"#000");
settext("MENU",0.08,0.08,0.08,"#000");
clickevent=function(){loadhomepagebuttons();mode=HOME;}
}
button[1]=new buttons();
with(button[1])
{
setpos(1.0,1.4,0.4,0.1,true,"#000");
settext("RESTART",0.02,0.08,0.08,"#000");
clickevent=function(){newgame();}
}
}
//loadsettingsbuttons
function loadsettingsbuttons()
{
button=[];
button[0]=new buttons();
with(button[0])
{
setpos(1.3,0.7,0.3,0.1);
if(grid){settext("ON",0.08,0.08,0.08);}else{settext("OFF",0.08,0.08,0.08);}
clickevent=function(){
grid=!grid;
if(grid){settext("ON");}else{settext("OFF");}
}
}
button[1]=new buttons();
with(button[1])
{
setpos(1.3,0.9,0.3,0.1);
if(shadow){settext("ON",0.08,0.08,0.08);}else{settext("OFF",0.08,0.08,0.08);}
clickevent=function(){
shadow=!shadow;
if(shadow){settext("ON");}else{settext("OFF");}
}
}
button[2]=new buttons();
with(button[2])
{
setpos(1.3,1.1,0.3,0.1);
if(inverse){settext("ON",0.08,0.08,0.08);}else{settext("OFF",0.08,0.08,0.08);}
clickevent=function(){
inverse=!inverse;
if(inverse){settext("ON");}else{settext("OFF");}
}
}
button[3]=new buttons();
with(button[3])
{
setpos(0.8,1.5,0.4,0.1);
settext("BACK",0.1,0.08,0.08);
clickevent=function(){loadhomepagebuttons();mode=HOME;}
}
}
var clickx=0,clicky=0,clickevent=false;
//mouse
function mousedown(e)
{
}
function mouseup(e)
{
clickevent=true;
clickx=e.pageX;
clicky=e.pageY;
}
//touch
var touchstartx=0,touchstarty=0,touch=false,multitouch=false;
function touchmove(e)
{
var x=e.targetTouches[0].pageX,y=e.targetTouches[0].pageY;
e.preventDefault();
clickx=e.targetTouches[0].pageX;
clicky=e.targetTouches[0].pageY;
if(multitouch)
{
}else
{
if(x-touchstartx>c.width/touchxsec)
{
keys[39]=true;
touchstartx=x;
touchstarty=y;
}else if(touchstartx-x>c.width/touchxsec)
{
keys[37]=true;
touchstartx=x;
touchstarty=y;
}
if((y-touchstarty>c.height/touchysec)&&touch)
{
keys[40]=true;
touch=false
touchstartx=x;
touchstarty=y;
}else if(touchstarty-y>c.height/touchysec)
{
keys[38]=true;
touchstartx=x;
touchstarty=y;
}
}
}
function touchend(e)
{
touch=false;
multitouch=false;
clickevent=true;
}
function touchstart(e)
{
e.preventDefault();
touchstartx=e.targetTouches[0].pageX;
touchstarty=e.targetTouches[0].pageY;
clickx=e.targetTouches[0].pageX;
clicky=e.targetTouches[0].pageY;
touch=true;
if(e.targetTouches.length>1){multitouch=true;}else{multitouch=false;}
}
//clearevents
function clearevents()
{
clickx=0;
clicky=0;
clickevent=false;
touchstartx=0;
touchstarty=0;
touch=false;
multitouch=false;
keys=[];
}
//drawfalling
function drawfalling(j,type,pos,c)
{
drawsquare(12+shapes[4*type+pos%4][0][0],j+shapes[4*type+pos%4][0][1],c,0);
drawsquare(12+shapes[4*type+pos%4][1][0],j+shapes[4*type+pos%4][1][1],c,0);
drawsquare(12+shapes[4*type+pos%4][2][0],j+shapes[4*type+pos%4][2][1],c,0);
drawsquare(12+shapes[4*type+pos%4][3][0],j+shapes[4*type+pos%4][3][1],c,0);
}
//clear
function clear()
{
var i=0,j=0,ul=0;
var blankline=true;
for(j=1;j<16;j++)
{
for(i=0;i<16;i++)
{
if(squares[i][j]==""){break;}
}
if(i==16)
{
for(;j<16;j++)
{
for(i=0;i<16;i++)
{
if(squares[i][j+1]!="")
{
blankline=false;
}
squares[i][j]=squares[i][j+1];
}
if(blankline){break;}
blankline=true;
}
for(i=0;i<16;i++){squares[i][j]="";}
return clear()+1;
}
}
return 0;
}
//fastsettle
function fastsettle(type,pos)
{
var i=-1,j=-1,sj=-1,si=-1;
for(var s=0;s<4;s++)
{
i=(28+shapes[4*type+pos%4][s][0]-app%16)%16;
for(j=15;j>0;j--)
{
if(squares[i][j]!=""){break;}
}
if(j-shapes[4*type+pos%4][