俄罗斯方块Java小程序.doc_第1页
俄罗斯方块Java小程序.doc_第2页
俄罗斯方块Java小程序.doc_第3页
俄罗斯方块Java小程序.doc_第4页
俄罗斯方块Java小程序.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3个不同的类SingleTetris.java,SuperBrick.java,Tetris.java。分别对应单一俄罗斯方块游戏类,方块组数据类和俄罗斯方块控制窗口。用Netbeans调试运行即可。以下是源代码:/*程序:SingleTetris.java *说明:单一俄罗斯方块游戏类 */import java.awt.*;import java.awt.event.*;import java.util.*;/单一砖块组游戏类public class SingleTetris implements RunnableGraphics g;/绘图区Component c;Thread DownThread;long GAME_SPEED;/纪录游戏速度long GAME_SCORE;/纪录游戏分数long GAME_LEVEL;/纪录游戏等级long GAME_LINE;/纪录游戏消除行数boolean GAME_RUNNING;/纪录游戏是否进行中Draw d;/画出砖块方式int MAPX;/地图X坐标int MAPY;/地图Y坐标int MAP_ARRAY;/地图数组int MAP_SHOW_ARRAY;/地图显示数组(与移动砖块组结合之数组)Color MAP_COLOR_ARRAY;/地图颜色数组int GRIDX;/x轴格数int GRIDY;/y轴格数int BRICK_WIDTH;/单一砖块_宽int BRICK_SIDE;/单一砖块_边int NEXT_BRICK_NUMBER;/下一个砖块组显示数量boolean IS_SHOW_NEXT;/是否显示下一个砖块组int NOW_BRICK;/现在动作砖块组编号int NOW_BRICK_DIRECT;/现在动作砖块组的方向int NOW_BRICK_X;/现在动作砖块组的x坐标int NOW_BRICK_Y;/现在动作砖块组的y坐标SuperBrick NowBrick;/现在动作的砖块组Color NOW_BRICK_COLOR;/现在动作砖块组的颜色ArrayList BrickArray;/所有砖块组类数组ArrayList NextBrickArray;/下一个砖块组储存数组ArrayList NextBrickColorArray;/下一个砖块组储存数组public SingleTetris(Graphics g,/绘图区 int mapx,int mapy,/地图坐标 int gridx,int gridy,/地图方格数 int brick_width,/砖块组宽 int brick_side,/砖块组边 int next_brick_number,/显示下一个砖块组数量 boolean is_show_next,/是否显示下一个砖块组 Component c)/组件/初始各参数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=new intGRIDXGRIDY;this.MAP_SHOW_ARRAY=new intGRIDXGRIDY;this.MAP_COLOR_ARRAY=new ColorGRIDXGRIDY;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(int i=0;iGRIDX;i+)for(int j=0;jGRIDY;j+)this.MAP_ARRAYij=0;this.MAP_SHOW_ARRAYij=0;/加入所有砖块组类型BrickArray=new ArrayList();/建立储存砖块组型态的数组BrickArray.add(new Brick_BB();BrickArray.add(new Brick_I();BrickArray.add(new Brick_L();BrickArray.add(new Brick_UL();BrickArray.add(new Brick_UT();BrickArray.add(new Brick_UZ();BrickArray.add(new Brick_Z();/产生下一砖块组数据NextBrickArray=new ArrayList();/建立储存预备砖块组编号的数组NextBrickColorArray=new ArrayList();/建立储存预备砖块组编号的数组for(int i=0;i(NEXT_BRICK_NUMBER+1);i+)createNextBrick();/建立绘出砖块组对象d=new Draw(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=new Thread(this);DownThread.start();/重绘窗口public void paint()/画出外框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()方法public void run()tryThread.sleep(GAME_SPEED); keyPress(KeyEvent.VK_DOWN);DownThread=new Thread(this);DownThread.start();catch(Exception e)e.printStackTrace();/更新游戏数据public void updateGame(int line)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,标楷体);/产生下一组砖块public void createNextBrick()/产生预备砖块组编号NextBrickArray.add(new Integer(int)(Math.random()*BrickArray.size();/产生预备砖块组颜色NextBrickColorArray.add(new Color(int)(Math.random()*128+127), (int)(Math.random()*128+127), (int)(Math.random()*128+127);/检查砖块组是否可以放置public boolean isPut(int x,int y,int type,int mode)SuperBrick sb=(SuperBrick)BrickArray.get(type);for(int i=0;i=4;i+)for(int j=0;j=4;j+)if(sb.BRICK_ARRAYmodeij=1)if(i+x)(GRIDX-1) | (j+y)(GRIDY-1) | MAP_ARRAYi+xj+y=1)return false;return true;/砖块组数组写入地图数组public void addBrickToMap()for(int i=0;i=4;i+)for(int j=0;j=0 & (NOW_BRICK_X+i)=0 & (NOW_BRICK_Y+j)GRIDY & NowBrick.BRICK_ARRAYNOW_BRICK_DIRECTij=1)MAP_ARRAYNOW_BRICK_X+iNOW_BRICK_Y+j=1; MAP_COLOR_ARRAYNOW_BRICK_X+iNOW_BRICK_Y+j= NOW_BRICK_COLOR;/产生下一个砖块组public void addNextBrick()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();/显示下一个砖块组public void showNextBrick()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);elseDownThread.stop();/检查满行public void checkFull()boolean blFull=true;/满行旗标int delLine=0;/删除行数计数for(int j=NOW_BRICK_Y;j(NOW_BRICK_Y+5);j+)blFull=true;for(int i=0;i=0 & j0)reLoadMap();updateGame(delLine);/移除满行public void removeFull(int line)for(int j=line;j0;j-)for(int i=0;iGRIDX;i+)MAP_ARRAYij=MAP_ARRAYij-1;MAP_COLOR_ARRAYij=MAP_COLOR_ARRAYij-1;for(int i=0;iGRIDX;i+)MAP_ARRAYi0=0;MAP_COLOR_ARRAYi0=Color.black;/重新加载地图砖块public void reLoadMap()for(int i=0;iGRIDX;i+)for(int j=0;j=4)NOW_BRICK_DIRECT=0;if(isPut(NOW_BRICK_X, NOW_BRICK_Y, NOW_BRICK, NOW_BRICK_DIRECT) d.DrawBrickGroup(x,y,direct);elseNOW_BRICK_DIRECT-;if(NOW_BRICK_DIRECT0)NOW_BRICK_DIRECT=3;break;case KeyEvent.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;case KeyEvent.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;case KeyEvent.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;case KeyEvent.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;case KeyEvent.VK_ESCAPE:/跳离System.exit(0);break;case KeyEvent.VK_PAUSE:/暂停if(DownThread.isAlive()DownThread.stop();elseDownThread=new Thread(this);/产生控制下降的线程DownThread.start();break;/*程序:SingleTetris.java *说明:相关绘图方法。 * 建立时需以SingleTetirs对象为创建子参数, * 负责方块绘制,方块区外框绘制,字型绘制等 */class DrawSingleTetris st;/俄罗斯砖块组单一类/创建子public Draw(SingleTetris st)this.st=st;/指定绘图区 /画出砖块组动作区地图外框public void DrawMapFrame(int x,int y,int wid,int hig,int side)/定义多边形坐标int xx=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;/左int yy=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(int i=0;i=3;i+)/不同边设定不同颜色switch(i)case 0:st.g.setColor(new Color(150,150,150);break;case 1:st.g.setColor(new Color(150,150,150);break;case 2:st.g.setColor(new Color(180,180,180);break;case 3:st.g.setColor(new Color(180,180,180);break;st.g.fillPolygon(xxi,yyi,4);st.g.setColor(Color.black);st.g.fillRect(x+side-1,y+side-1,wid-side*2+2,hig-side*2+2);/画出砖块组public void DrawBrickGroup(int x,int y,int type,int direct,Color c)SuperBrick sb=(SuperBrick)st.BrickArray.get(type);for(int i=0;i5;i+)for(int j=0;j5;j+)if(sb.BRICK_ARRAYdirectij=1)DrawBrick(i+x),(j+y),c);/画出砖块组(清除前一个砖块组)public void DrawBrickGroup(int fx,int fy,int fdirect)/清除前一个砖块组for(int i=0;i5;i+)for(int j=0;j=0 & (i+st.NOW_BRICK_X)=0 & (j+st.NOW_BRICK_Y)st.GRIDY)if(st.NowBrick.BRICK_ARRAYfdirectij=1)DrawBrick(i+fx,j+fy,Color.black);/画出现在砖块组for(int i=0;i5;i+)for(int j=0;j=0 & (i+st.NOW_BRICK_X)=0 & (j+st.NOW_BRICK_Y)st.GRIDY)if(st.NowBrick.BRICK_ARRAYst.NOW_BRICK_DIRECTij=1)DrawBrick(i+st.NOW_BRICK_X, j+st.NOW_BRICK_Y, st.NOW_BRICK_COLOR);/画出单一砖块public void DrawBrick(int x,int y,Color c)st.g.setColor(Color.black);st.g.drawRect(x*st.BRICK_WIDTH+st.MAPX,y*st.BRICK_WIDTH+st.MAPY, st.BRICK_WIDTH-1,st.BRICK_WIDTH-1);st.g.setColor(c);st.g.fill3DRect(x*st.BRICK_WIDTH+st.MAPX+st.BRICK_SIDE,y*st.BRICK_WIDTH+st.MAPY+st.BRICK_SIDE, st.BRICK_WIDTH-st.BRICK_SIDE*2, st.BRICK_WIDTH-st.BRICK_SIDE*2,true); /画出字型public void DrawFont(String str,int x,int y,int size,Color c,String fs)Font f=new Font(fs,Font.BOLD,size);st.g.setColor(c);st.g.setFont(f);st.g.drawString(str,x,y);/=class MoveThread extends ThreadSingleTetris s;Graphics g;Draw d;Component c;Image img;Graphics sg;public MoveThread(SingleTetris s)this.s=s;this.g=s.g;this.d=s.d;this.c=s.c;img=c.createImage(190,340);sg=img.getGraphics();public void run()for(int i=0;i4;i+)trysleep(50);showNextBrickGroup(i);g.drawImage(img,295,5,c);catch(Exception e)e.printStackTrace();/显示下一组砖块public void showNextBrickGroup(int index)sg.setColor(Color.black);sg.fillRect(0,0,190,340);for(int j=0;js.NextBrickArray.size();j+)int m=(Integer)s.NextBrickArray.get(j).intValue();Color c=(Color)s.NextBrickColorArray.get(j);DrawBrickGroup(2),(j)*4)-index,m,0,c);/画出砖块组public void DrawBrickGroup(int x,int y,int type,int direct,Color c)SuperBrick sb=(SuperBrick)s.BrickArray.get(type);for(int i=0;i5;i+)for(int j=0;j5;j+)if(sb.BRICK_ARRAYdirectij=1)DrawBrick(i+x),(j+y),c);/画出单一砖块public void DrawBrick(int x,int y,Color c)sg.setColor(Color.black);sg.drawRect(x*s.BRICK_WIDTH-9,y*s.BRICK_WIDTH, s.BRICK_WIDTH-1,s.BRICK_WIDTH-1);sg.setColor(c);sg.fill3DRect(x*s.BRICK_WIDTH-9,y*s.BRICK_WIDTH, s.BRICK_WIDTH-s.BRICK_SIDE*2, s.BRICK_WIDTH-s.BRICK_SIDE*2,true); /*程序:SuperBrick.java *说明:方块组数据类,包含方块组数组数据、方块组旋转方式 * 所有方块组以SuperBrick为基础类派生各类,其中各方块组 *类型旋转还分二个方向及4个方向。 */ /所有方块组类型的基础类public class SuperBrick/方块组数据public int BRICK_ARRAY;/纪录方块组数据数组public SuperBrick()/建立纪录方块组的数组并将数据清空BRICK_ARRAY=new int455;for(int i=0;i4;i+)for(int j=0;j5;j+)for(int k=0;k5;k+)BRICK_ARRAYijk=0;/旋转方块组(顺时针旋转_只适用4个方向都不同的方块组)pro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论