this.MAP_ARRAY[i][j]=0;
this.MAP_SHOW_ARRAY[i][j]=0;
}
}
//加入所有砖块组类型
BrickArray=newArrayList();//建立储存砖块组型态的数组
BrickArray.add(newBrick_BB());
BrickArray.add(newBrick_I());
BrickArray.add(newBrick_L());
BrickArray.add(newBrick_UL());
BrickArray.add(newBrick_UT());
BrickArray.add(newBrick_UZ());
BrickArray.add(newBrick_Z());
//产生下一砖块组数据
NextBrickArray=newArrayList();//建立储存预备砖块组编号的数组
NextBrickColorArray=newArrayList();//建立储存预备砖块组编号的数组
for(inti=0;i<(NEXT_BRICK_NUMBER+1);i++){
createNextBrick();
}
//建立绘出砖块组对象
d=newDraw(this);
//画出外框
d.DrawMapFrame(0,0,GRIDX*BRICK_WIDTH+2*5,GRIDY*BRICK_WIDTH+2*5,5);
d.DrawMapFrame(290,0,200,350,5);//预备方块外框
d.DrawMapFrame(290,350,200,140,5);//游戏数据外框
showNextBrickGroup();//显示提示方块组
addNextBrick();//新增一个提示方块
showNextBrick();//显示现在动作方块
updateGame(0);//更新游戏数据
//产生控制下降的线程
DownThread=newThread(this);
DownThread.start();
}
//重绘窗口
publicvoidpaint(){
//画出外框
d.DrawMapFrame(0,0,GRIDX*BRICK_WIDTH+2*5,GRIDY*BRICK_WIDTH+2*5,5);
d.DrawMapFrame(290,0,200,350,5);//预备方块
d.DrawMapFrame(290,350,200,140,5);//游戏数据
showNextBrickGroup();
updateGame(0);
reLoadMap();
showNextBrick();
}
//覆盖run()方法
publicvoidrun(){
try{
Thread.sleep(GAME_SPEED);
keyPress(KeyEvent.VK_DOWN);
DownThread=newThread(this);
DownThread.start();
}catch(Exceptione){
e.printStackTrace();
}
}
//更新游戏数据
publicvoidupdateGame(intline){
d.DrawMapFrame(290,350,200,140,5);
GAME_SCORE+=50*line*line*line*(0.5)*GAME_LEVEL;
GAME_LEVEL=GAME_SCORE/5000+1;
GAME_SPEED=800/GAME_LEVEL+200;
GAME_LINE+=line;
d.DrawFont("级数:
"+GAME_LEVEL,300,400,16,Color.cyan,"标楷体");
d.DrawFont("分数:
"+GAME_SCORE,300,430,16,Color.red,"标楷体");
d.DrawFont("行数:
"+GAME_LINE,300,460,16,Color.green,"标楷体");
}
//产生下一组砖块
publicvoidcreateNextBrick(){
//产生预备砖块组编号
NextBrickArray.add(newInteger((int)(Math.random()*BrickArray.size())));
//产生预备砖块组颜色
NextBrickColorArray.add(newColor((int)(Math.random()*128+127),
(int)(Math.random()*128+127),
(int)(Math.random()*128+127)));
}
//检查砖块组是否可以放置
publicbooleanisPut(intx,inty,inttype,intmode){
SuperBricksb=(SuperBrick)BrickArray.get(type);
for(inti=0;i<=4;i++){
for(intj=0;j<=4;j++){
if(sb.BRICK_ARRAY[mode][i][j]==1){
if((i+x)<0||(i+x)>(GRIDX-1)||
(j+y)<0||(j+y)>(GRIDY-1)||
MAP_ARRAY[i+x][j+y]==1){
returnfalse;
}
}
}
}
returntrue;
}
//砖块组数组写入地图数组
publicvoidaddBrickToMap(){
for(inti=0;i<=4;i++){
for(intj=0;j<=4;j++){
if((NOW_BRICK_X+i)>=0&&(NOW_BRICK_X+i)(NOW_BRICK_Y+j)>=0&&(NOW_BRICK_Y+j)NowBrick.BRICK_ARRAY[NOW_BRICK_DIRECT][i][j]==1){
MAP_ARRAY[NOW_BRICK_X+i][NOW_BRICK_Y+j]=1;
MAP_COLOR_ARRAY[NOW_BRICK_X+i][NOW_BRICK_Y+j]=
NOW_BRICK_COLOR;
}
}
}
}
//产生下一个砖块组
publicvoidaddNextBrick(){
NextBrickArray.remove(0);
NextBrickColorArray.remove(0);
NOW_BRICK=((Integer)NextBrickArray.get(0)).intValue();
NOW_BRICK_COLOR=(Color)NextBrickColorArray.get(0);
NOW_BRICK_DIRECT=0;
NOW_BRICK_X=(GRIDX-5)/2;
NOW_BRICK_Y=0;
NowBrick=(SuperBrick)BrickArray.get(NOW_BRICK);
createNextBrick();
}
//显示下一个砖块组
publicvoidshowNextBrick(){
if(this.isPut(NOW_BRICK_X,
NOW_BRICK_Y,
NOW_BRICK,
NOW_BRICK_DIRECT)){
d.DrawBrickGroup(NOW_BRICK_X,
NOW_BRICK_Y,
NOW_BRICK,
NOW_BRICK_DIRECT,
NOW_BRICK_COLOR);
}else{
DownThread.stop();
}
}
//检查满行
publicvoidcheckFull(){
booleanblFull=true;//满行旗标
intdelLine=0;//删除行数计数
for(intj=NOW_BRICK_Y;j<(NOW_BRICK_Y+5);j++){
blFull=true;
for(inti=0;iif(j>=0&&jif(MAP_ARRAY[i][j]!
=1)
blFull=false;
}else{
blFull=false;
}
}
if(blFull){
removeFull(j);//移除满行
delLine++;
}
}
if(delLine>0)
reLoadMap();
updateGame(delLine);
}
//移除满行
publicvoidremoveFull(intline){
for(intj=line;j>0;j--){
for(inti=0;iMAP_ARRAY[i][j]=MAP_ARRAY[i][j-1];
MAP_COLOR_ARRAY[i][j]=MAP_COLOR_ARRAY[i][j-1];
}
}
for(inti=0;iMAP_ARRAY[i][0]=0;
MAP_COLOR_ARRAY[i][0]=Color.black;
}
}
//重新加载地图砖块
publicvoidreLoadMap(){
for(inti=0;ifor(intj=0;jif(MAP_ARRAY[i][j]==1)
d.DrawBrick(i,j,MAP_COLOR_ARRAY[i][j]);
else
d.DrawBrick(i,j,Color.black);
}
}
}
//显示下一组砖块
publicvoidshowNextBrickGroup(){
newMoveThread(this).start();
}
//按键事件
publicsynchronizedvoidkeyPress(intKEYCODE){
intx=NOW_BRICK_X;
inty=NOW_BRICK_Y;
intdirect=NOW_BRICK_DIRECT;
switch(KEYCODE){
caseKeyEvent.VK_UP:
//上
NOW_BRICK_DIRECT++;
if(NOW_BRICK_DIRECT>=4)
NOW_BRICK_DIRECT=0;
if(isPut(NOW_BRICK_X,
NOW_BRICK_Y,
NOW_BRICK,
NOW_BRICK_DIRECT)){
d.DrawBrickGroup(x,y,direct);
}else{
NOW_BRICK_DIRECT--;
if(NOW_BRICK_DIRECT<0)
NOW_BRICK_DIRECT=3;
}
break;
caseKeyEvent.VK_DOWN:
//下
if(isPut(NOW_BRICK_X,
NOW_BRICK_Y+1,
NOW_BRICK,
NOW_BRICK_DIRECT)){
NOW_BRICK_Y++;
d.DrawBrickGroup(x,y,direct);
}else{//到底
showNextBrickGroup();
addBrickToMap();
checkFull();
addNextBrick();
showNextBrick();
}
break;
caseKeyEvent.VK_LEFT:
//左
if(isPut(NOW_BRICK_X-1,
NOW_BRICK_Y,
NOW_BRICK,
NOW_BRICK_DIRECT)){
NOW_BRICK_X--;
d.DrawBrickGroup(x,y,direct);
}
break;
caseKeyEvent.VK_RIGHT:
//右
if(isPut(NOW_BRICK_X+1,
NOW_BRICK_Y,
NOW_BRICK,
NOW_BRICK_DIRECT)){
NOW_BRICK_X++;
d.DrawBrickGroup(x,y,direct);
}
break;
caseKeyEvent.VK_SPACE:
//直落
while(isPut(NOW_BRICK_X,
NOW_BRICK_Y+1,
NOW_BRICK,
NOW_BRICK_DIRECT)){
NOW_BRICK_Y++;
d.DrawBrickGroup(x,y,direct);
x=NOW_BRICK_X;
y=NOW_BRICK_Y;
}
addBrickToMap();
checkFull();
addNextBrick();
showNextBrickGroup();
showNextBrick();
break;
caseKeyEvent.VK_ESCAPE:
//跳离
System.exit(0);
break;
caseKeyEvent.VK_PAUSE:
//暂停
if(DownThread.isAlive())
DownThread.stop();
else{
DownThread=newThread(this);//产生控制下降的线程
DownThread.start();
}
break;
}
}
}
/*程序:
SingleTetris.java
*说明:
相关绘图方法。
*建立时需以SingleTetirs对象为创建子参数,
*负责方块绘制,方块区外框绘制,字型绘制等
*/
classDraw{
SingleTetrisst;//俄罗斯砖块组单一类
//创建子
publicDraw(SingleTetrisst){
this.st=st;//指定绘图区
}
//画出砖块组动作区地图外框
publicvoidDrawMapFrame(intx,inty,intwid,inthig,intside){
//定义多边形坐标
intxx[][]={{x,x+wid,x+wid-side,x+side},//上
{x+wid-side,x+wid,x+wid,x+wid-side},//右
{x+side,x+wid-side,x+wid,x},//下
{x,x+side,x+side,x}};//左
intyy[][]={{y,y,y+side,y+side},//上
{y+side,y,y+hig,y+hig-side},//右
{y+hig-side,y+hig-side,y+hig,y+hig},//下
{y,y+side,y+hig-side,y+hig}};//左
//画出多边形
for(inti=0;i<=3;i++){
//不同边设定不同颜色
switch(i){
case0:
st.g.setColor(newColor(150,150,150));
break;
case1:
st.g.setColor(newColor(150,150,150));
break;
case2:
st.g.setColor(newColor(180,180,180));
break;
case3:
st.g.setColor(newColor(180,180,180));
break;
}
st.g.fillPolygon(xx[i],yy[i],4);
st.g.setColor(Color.black);
st.g.fillRect(x+side-1,y+side-1,wid-side*2+2,hig-side*2+2);
}
}
//画出砖块组
publicvoidDrawBrickGroup(intx,inty,inttype,intdirect,Colorc){
SuperBricksb=(SuperBrick)st.BrickArray.get(type);
for(inti=0;i<5;i++){
for(intj=0;j<5;j++){
if(sb.BRICK_ARRAY[direct][i][j]==1){
DrawBrick((i+x),(j+y),c);
}
}
}
}
//画出砖块组(清除前一个砖块组)
publicvoidDrawBrickGroup(intfx,intfy,intfdirect){
//清除前一个砖块组
for(inti=0;i<5;i++){
for(intj=0;j<5;j++){
if((i+st.NOW_BRICK_X)>=0&&(i+st.NOW_BRICK_X)(j+st.NOW_BRICK_Y)>=0&&(j+st.