}
return0;for(j=0;j<10;j++){
if(bg[i][j]==1){
}}for(k=0;k<4;k++){
if(x+ret[k][0]==j&&y+ret[k][1]+1==i){
}}return1;
ret.push(newArray
(2));
nextret.push(newArray
(2));
}
functionlrnotout(lorr:
Number,a:
Object){
//lorr==-1代表a往左边一格可行性的判断,lorr==1代表右边一格可行性的判断,iorr==0代表a的位置合理性的判断,出现不合理则返回0
}vari:
Number;
if(iorr==-1){
for(i=0;i<4;i++){
if(x+a[i][0]-1<0||reach(x-1,y-1,a)){
}
}}}return0;
if(lorr==1){
for(i=0;i<4;i++){
if(x+a[i][0]+1>9||reach(x-1,y+1,a)){
}}return0;
if(lorr==0){
for(i=0;i<4;i++){
if(x+a[i][0]<0||x+a[i][0]>9){
}return0;
}
}
return1;
functionrv(a:
Object,ret:
Object){
//方块赋值,将a方块赋值到ret方块}vari:
Number;
for(i=0;i<5;i++){
ret[i][0]=a[i][0],ret[i][1]=a[i][1];
}
functionrotate(ret:
Object){
ret的
//根据方块ret最后一行(分别是形状指示变量和旋转方向变量)为前四行赋以具体形状值
switch(ret[4][0]){
case0:
//方形
a=[[1,0],[2,0],[1,1],[2,1],[0,0]];
rv(a,ret);
return;
case1:
//长形
switch(ret[4][1]){
case1:
a=[[0,0],[1,0],[2,0],[3,0],[1,0]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){
rv(a,ret);
}
return;
a=[[1,0],[1,1],[1,2],[1,3],[1,1]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){
rv(a,ret);
}
return;
case0:
}
case2:
//Z形
switch(ret[4][1]){
case1:
a=[[0,1],[1,1],[1,2],[2,2],[2,0]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
case0:
a=[[2,0],[1,1],[2,1],[1,2],[2,1]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
}
case3:
//反Z形
switch(ret[4][1]){
case1:
a=[[1,1],[2,1],[0,2],[1,2],[3,0]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
case0:
a=[[1,0],[1,1],[2,1],[2,2],[3,1]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
}
case4:
//T形
switch(ret[4][1]){
case3:
a=[[1,0],[0,1],[1,1],[2,1],[4,0]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
case0:
a=[[1,0],[0,1],[1,1],[1,2],[4,1]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
case1:
a=[[0,1],[1,1],[2,1],[1,2],[4,2]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
case2:
a=[[1,0],[1,1],[2,1],[1,2],[4,3]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
}
case5:
//倒L形
switch(ret[4][1]){
case3:
a=[[1,0],[2,0],[1,1],[1,2],[5,0]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){
rv(a,ret);
}
return;
case0:
a=[[0,1],[0,2],[1,2],[2,2],[5,1]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
case1:
a=[[2,0],[2,1],[1,2],[2,2],[5,2]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
a=[[0,1],[1,1],[2,1],[2,2],[5,3]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
case2:
case6:
//L形
switch(ret[4][1]){
case3:
a=[[1,0],[2,0],[2,1],[2,2],[6,0]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
case0:
a=[[0,1],[1,1],[2,1],[0,2],[6,1]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){}rv(a,ret);
return;
case1:
a=[[1,0],[1,1],[1,2],[2,2],[6,2]];
if(lrnotout(0,a)&&!
reach(x,y-1,a)){rv(a,ret);
}
return;
case2:
a=[[2,1],[0,2],[1,2],[2,2],[6,3]];
}if(lrnotout(0,a)&&!
reach(x,y-1,a)){
}rv(a,ret);
return;
}
}
functiongenerate(ret:
Object){
}//随机产生方块函数(可进一步修正)ret[4][0]=Math.floor(Math.random()*7);ret[4][1]=Math.floor(Math.random()*4);rotate(ret);
//完成方块ret的具体形状的赋值functioninit(){
//初始化背景、方块、运动函数
vari:
Number,j:
Number;
for(i=0;i//初始化背景,边界为1,其余为''
}for(j=0;j<10;j++){
}if(i==N-1){
bg[i][j]=1;
}else{
bg[i][j]='';
}
for(i=0;i<5;i++){
//为当前方块赋初值0ret[i][0]=ret[i][1]=0;
}
generate(ret);
//产生当前方块
generate(nextret);
//产生下一个方块
y=0,x=3,score=lines=0,level=0;
//当前位置坐标和计分系统初始化_tetris.removeTextField();
//如果从结束过的游戏恢复,删除结束标志display();
//显示画面
frameflag=0;
//标示下落时间间隔
onEnterFrame=function(){frameflag++;
if(10-frameflag//根据等级level确定下落时间间隔
frameflag=0;
go();
//下落及判断
}
};
}
functiondrawblock(a,b,c,d){
//绘制方块的小块
}with(panel){beginFill(0x000FFF,100);
}lineStyle(1,0xFF00FF);moveTo(panel._x+a,panel._y+b);
lineTo(panel._x+c,panel._y+b);
lineTo(panel._x+c,panel._y+d);
lineTo(panel._x+a,panel._y+d);
lineTo(panel._x+a,panel._y+b);
endFill();
functionerase(){
//删除一行方块
varn:
Number=0,i:
Number,j:
Number,k:
Number,l:
Number;
for(i=0;ifor(j=0;j<10;j++){
if(bg[i][j]==''){
//如果该行有空,则开始判断下一行
i++,j=-1;
if(i==N-1){
//行N-1为底线,不判断
break;
}
}elseif(j==9){
//判断到该行最后一列都没有空
for(k=i;k>=1;k--){
//上方方块下落
}for(l=0;l<10;l++){
bg[k][l]=bg[k-1][l];
}
for(l=0;l<10;l++){
//删除该行
bg[0][l]='';
}
n++;
//此次删除行数变量增一
if((lines+n)%30==0){
//删除行数总数到30的倍数则等级上升
}level=(level+1)%10;
}}
}
}
lines+=n,score+=(n*n+n)*50;
//总行数增n,计算得分
functiondisplay(){
Turbo
//显示函数,采用全部清除再重绘制的方法(因为这个程序本来是在C2.0的文本环境下完成的)
vari:
Number,j:
Number;
panel.clear();
with(panel){
//画边界
lineStyle(1,0x0000FF);
}
for(i=0;i<4;i++){
//当前方块占据的地方赋值为边界类型1
bg[y+ret[i][1]][x+ret[i][0]]=1;
for(i=0;i//绘制背景方块
for(j=0;j<10;j++){i*WIDTH+Y,j*WIDTH+WIDTH+X,moveTo(panel._x,panel._y);lineTo(panel._x+WIDTH*10,panel._y);
lineTo(panel._x+WIDTH*10,panel._y+WIDTH*(N-1));lineTo(panel._x,panel._y+WIDTH*(N-1));
lineTo(panel._x,panel._y);
if(bg[i][j]==1){drawblock(j*WIDTH+X,i*WIDTH+WIDTH+Y);
}}
}
for(i=0;i<4;i++){
//绘制当前方块
drawblock(nextret[i][0]*WIDTH+14*WIDTH+X,nextret[i][0]*WIDTH+WIDTH+14*WIDTH+X,nextret[i][1]*WIDTH+12*WIDTH+Y,nextret[i][1]*WIDTH+WIDTH+12*WIDTH+Y);
}
for(i=0;i<4;i++){
//当前方块绘制完毕,重新将当前位置改为''
bg[y+ret[i][1]][x+ret[i][0]]='';
}
createTextField("_lvltxt",1,270,100,100,20);}//绘制计分系统
createTextField("_scrtxt",2,270,130,100,20);createTextField("_lnstxt",3,270,160,100,20);_lvltxt.text="Level:
"+level;
_scrtxt.text="Score:
"+score;
_lnstxt.text="Lines:
"+lines;functiongo(){//下落函数if(!
(reach(x,y,ret))){
//当前方块下落一格是否碰到边界或方块
}else{
//碰到边界或方块score+=10;
//得10分display();
//重新绘制
for(varii=0;ii<4;ii++){
//修改背景数组,将当前方块的位置改为边界类型
bg[y+ret[ii][1]][x+ret[ii][0]]=1;
}
erase();
//删除行判断及执行
rv(nextret,ret);
//将下一个方块赋值为当前方块
y=0,x=3;
//重置方块位置
generate(nextret);
//生成下一个方块
display();
//重新绘制
if(reach(x,y,ret)){
//如果下一格碰到方块则游戏结束
createTextField("_tetris",100000,WIDTH*3.3,WIDTH*N/3,70,20);_tetris._x+=200;
_tetris._y+=50;
_tetris._xscale=300;
_tetris._yscale=300;
_tetris.background=true;
y++;
//如果当前方块下落一格没有碰到边界或方块则下落一格
display();
//重新绘制
}}}_tetris.text="GameOver!
";onEnterFrame=function(){//停止下落
};
functionkey(){
if(Key.isDown(Key.UP)){
}rotate(ret);
display();
if(Key.isDown(Key.LEFT)){
if(lrnotout(-1,ret)){
//左移可行性判断
}}x--;
display();
if(Key.isDown(Key.RIGHT)){if(lrnotout(1,ret)){
//右移可行性判断
}x++;
display();
if(Key.isDown(Key.DOWN)){
//键盘控制下落
}go();
if(Key.isDown(Key.SPACE)){
//一键下落到底
}
if(Key.isDown(82)){
//重新开始游戏}init();
while(!
reach(x,y,ret)){y++;
}
go();
}
init();
//初始化
setInterval(key,80);
//每个80毫秒执行一次键盘事件函数createTextField("hinttxt",33324,200,20,300,50);
hinttxt.text="键盘键:
上,下,左,右,R(reset),空格";