俄罗斯方块Java小程序.docx
- 文档编号:6389541
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:27
- 大小:21.43KB
俄罗斯方块Java小程序.docx
《俄罗斯方块Java小程序.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块Java小程序.docx(27页珍藏版)》请在冰豆网上搜索。
俄罗斯方块Java小程序
3个不同的类SingleTetris.java,SuperBrick.java,Tetris.java。
分别对应单一俄罗斯方块游戏类,方块组数据类和俄罗斯方块控制窗口。
用Netbeans调试运行即可。
以下是源代码:
/*程序:
SingleTetris.java
*说明:
单一俄罗斯方块游戏类
*/
importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
//单一砖块组游戏类
publicclassSingleTetrisimplementsRunnable{
Graphicsg;//绘图区
Componentc;
ThreadDownThread;
longGAME_SPEED;//纪录游戏速度
longGAME_SCORE;//纪录游戏分数
longGAME_LEVEL;//纪录游戏等级
longGAME_LINE;//纪录游戏消除行数
booleanGAME_RUNNING;//纪录游戏是否进行中
Drawd;//画出砖块方式
intMAPX;//地图X坐标
intMAPY;//地图Y坐标
intMAP_ARRAY[][];//地图数组
intMAP_SHOW_ARRAY[][];//地图显示数组(与移动砖块组结合之数组)
ColorMAP_COLOR_ARRAY[][];//地图颜色数组
intGRIDX;//x轴格数
intGRIDY;//y轴格数
intBRICK_WIDTH;//单一砖块_宽
intBRICK_SIDE;//单一砖块_边
intNEXT_BRICK_NUMBER;//下一个砖块组显示数量
booleanIS_SHOW_NEXT;//是否显示下一个砖块组
intNOW_BRICK;//现在动作砖块组编号
intNOW_BRICK_DIRECT;//现在动作砖块组的方向
intNOW_BRICK_X;//现在动作砖块组的x坐标
intNOW_BRICK_Y;//现在动作砖块组的y坐标
SuperBrickNowBrick;//现在动作的砖块组
ColorNOW_BRICK_COLOR;//现在动作砖块组的颜色
ArrayListBrickArray;//所有砖块组类数组
ArrayListNextBrickArray;//下一个砖块组储存数组
ArrayListNextBrickColorArray;//下一个砖块组储存数组
publicSingleTetris(Graphicsg,//绘图区
intmapx,intmapy,//地图坐标
intgridx,intgridy,//地图方格数
intbrick_width,//砖块组宽
intbrick_side,//砖块组边
intnext_brick_number,//显示下一个砖块组数量
booleanis_show_next,//是否显示下一个砖块组
Componentc){//组件
//初始各参数
this.c=c;
this.g=g;
this.MAPX=mapx;
this.MAPY=mapy;
this.GRIDX=gridx;
this.GRIDY=gridy;
this.BRICK_WIDTH=brick_width;
this.BRICK_SIDE=brick_side;
this.NEXT_BRICK_NUMBER=next_brick_number;
this.IS_SHOW_NEXT=is_show_next;
this.MAP_ARRAY=newint[GRIDX][GRIDY];
this.MAP_SHOW_ARRAY=newint[GRIDX][GRIDY];
this.MAP_COLOR_ARRAY=newColor[GRIDX][GRIDY];
this.NOW_BRICK_X=0;
this.NOW_BRICK_Y=0;
this.GAME_SPEED=1000;
this.GAME_SCORE=0;
this.GAME_LEVEL=1;
this.GAME_LINE=0;
//将地图数组归零
for(inti=0;i for(intj=0;j 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;i if(j>=0&&j if(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;i MAP_ARRAY[i][j]=MAP_ARRAY[i][j-1]; MAP_COLOR_ARRAY[i][j]=MAP_COLOR_ARRAY[i][j-1]; } } for(inti=0;i MAP_ARRAY[i][0]=0; MAP_COLOR_ARRAY[i][0]=Color.black; } } //重新加载地图砖块 publicvoidreLoadMap(){ for(inti=0;i for(intj=0;j if(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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 Java 程序
