俄罗斯方块java程序设计步骤,基于java的俄罗斯方块程序设计与毕业论文
俄罗斯方块小游戏
简单的实现俄罗斯方块,只有一个主代码,很好理解的,有暂停/继续、重新开始、结束游戏的简单功能。这里就不多说实现的原理了,可以在网上进行相关的查询。这里就直接给出了源代码,这个也是我参考网上的,自己进行了相关的更改,增加了一些功能。
导入Java。awt。*;导入Java。awt。事件。*;导入Java。io。*;导入Java。util。*;导入javax。imageio。*;导入javax。挥棒。*;导入javax。挥棒。计时器;公共类我的游戏扩展了JFrame { public my game(){ game body game body=新游戏body();gamebody.setBounds(5,10,500,600);//游戏体。seto paque(假);游戏体。设置布局(空);addkey监听器(游戏体);添加(游戏体);int w=Toolkit.getDefaultToolkit().getScreenSize().宽度;int h=Toolkit.getDefaultToolkit().getScreenSize().身高;JLabel image=new JLabel(新图像图标( 13。jpg’));image.setBounds(0,0,500,600);getLayeredPane().设置布局(空);getLayeredPane().添加(图像,新的整数(整数MIN _ VALUE));((JPanel)getContentPane()).西托帕克(假);最终JButton log in=new JButton(新图像图标( log in 4 .PNG’));登录。setcontentareaffilled(false);login.setMargin(new Insets(0,0,0,0));登录。setborderpainted(false);login.setBounds(340,320,120,26);gamebody.add(登录);登录。addactionlistener(new action listener(){ public void action performed(action event e){//登录的按钮if(e . getsource()==log in){请求焦点(true);//获得焦点,不用失去焦点游戏体。重置map();//重置地图游戏体。画墙();//冲重新绘制边界墙体游戏体。创建形状();//重新产生新的地图游戏体。setstart(false);//唤醒定时下落的线程游戏体。得分=0;//将分数置为零repaint();} }});最终JButton暂停登录=新JButton(新图像图标(登录6 .PNG’));波塞罗金。setcontentareaffilled(false);暂停登录。设置边距(new Insets(0,0,0,0));波塞罗金。设置边框绘制(false);pauselogin.setBounds(340,370,120,26);游戏体。添加(pauselogin);暂停登录。addmouse侦听器(新的鼠标侦听器(){//暂停的按钮/*已执行公共无效操作(ActionEvent e){//用事件监听,没用实现再次按暂停键后继续游戏//while(true){ if(e . getsource()==pauselogin){ game body。setstart(真);请求焦点(真);} if(e . getsource()==登录){新游戏体。setstart(false);请求焦点(真);}//} }*///鼠标点击事件,可以分别判断不同的事件,做出不同的反应public void鼠标被单击(鼠标事件e){ if(e . get button()==e . button 1){//单击左键暂停游戏体。设置开始(真);//将自动下落线程关闭//请求焦点(true);//同时整个窗口失去焦点,无法操作,但可以点击按钮} else if(e.getButton()==e.BUTT
ON3 ){ //右击暂停,继续游戏 gamebody.setStart(false); //唤醒自动下落线程requestFocus(true);} if(e.getClickCount()==2){ //左键双击,也可以继续游戏 gamebody.setStart(false); requestFocus(true);}}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mousePressed(MouseEvent e){}public void mouseReleased(MouseEvent e){} });final JButton overlogin=new JButton(new ImageIcon("login5.PNG")); //退出的按钮overlogin.setMargin(new Insets(0,0,0,0));overlogin.setContentAreaFilled(false);overlogin.setBounds(340,420,120,26);overlogin.setBorderPainted(false);add(overlogin);overlogin.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.exit(1); }}); setTitle("俄罗斯方块 V.1.0");setResizable(false);setFocusable(true);setBounds((w-500)/2,(h-600)/2,500,600);setLayout(null);setVisible(true);setDefaultCloseOperation(3);}public static void main(String[] args) {new MyGame();}//创建需要定义的局部变量和游戏类 class GameBody extends JPanel implements KeyListener{private int shapeType=-1; //定义方块的类型 定义的为7中private int shapeState=-1; //定义方块为何种状态,每种都有四种状态private int nextshapeType=-1; //定义下一块产生的类型private int nextshapeState=-1; //定义下一块的方块的状态private final int CELL=25; //定义方格的大小private int score=0; //定义显示的成绩private int left; //定义初始图形与两边的墙的距离private int top; //定义初始图形与上下墙的距离private int i=0; //表示列private int j=0; //表示行public int flag=0;public volatile boolean start=false; //暂停的判断条件,为轻量锁,保持同步的//public boolean start=false;//Timer t;Random randomcolor=new Random();Random random=new Random();//定义地图的大小,创建二位的数组int[][] map=new int[13][23];//初始化地图public void resetMap(){ for(i=0;i<12;i++){ for(j=0;j<22;j++){ //遍历的范围不能小 map[i][j]=0;} }}//画围墙的方法public void drawWall(){ for(j=0;j<22;j++) //0到21行 {map[0][j]=2;map[11][j]=2; //第0行和第11行为墙 } for(i=0;i<12;i++){ //0到11列 map[i][21]=2; //第21行划墙 }}//定义随机的图形种类private final int[][][] shapes=new int[][][]{// i { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } }, // s {{ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, // z {{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, // j {{ 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // o {{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // l {{ 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // t {{ 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }};//产生新图形的方法public void createshape(){if(shapeType==-1&&shapeState==-1){ shapeType = random.nextInt(shapes.length); shapeState = random.nextInt(shapes[0].length);}else{ shapeType=nextshapeType; shapeState=nextshapeState;} nextshapeType = random.nextInt(shapes.length); nextshapeState = random.nextInt(shapes[0].length);//shapeType=(int)(Math.random()*1000)%7; //在7中类型中随机选取//shapeState=(int)(Math.random()*1000)%4; //在四种状态中随机选取 left=4; top=0; //图形产生的初始位置为(4,0)if(gameOver(left,top)==1){ //判断游戏 resetMap(); drawWall(); score=0; JOptionPane.showMessageDialog(null, "GAME OVER");}}//遍历[4][4]数组产生的方块并判断状态public int judgeState(int left,int top,int shapeType,int shapeState){for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ if(((shapes[shapeType][shapeState][a*4+b]==1 && //遍历数组中为1的个数,即判断是否有图形map[left+b+1][top+a]==1)) //判断地图中是否还有障碍物((shapes[shapeType][shapeState][a*4+b]==1 && //遍历数组中为1的个数,即判断是否有图形map[left+b+1][top+a]==2))){ //判断是否撞墙 return 0; //表明无法不能正常运行} }} return 1;}//创建键盘事件监听public void keyPressed(KeyEvent e){//if (start){ switch(e.getKeyCode()){case KeyEvent.VK_LEFT:leftMove();//调用左移的方法repaint();break;case KeyEvent.VK_RIGHT:rightMove();//调用右移的方法repaint();break;case KeyEvent.VK_DOWN:downMove();//调用左移的方法repaint();break;case KeyEvent.VK_UP:turnShape();//调用变形的方法repaint();break; }// }} public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } //创建左移的方法public void leftMove(){if(judgeState(left-1,top,shapeType,shapeState)==1){left-=1;}}//创建右移的方法 public void rightMove(){ if(judgeState(left+1,top,shapeType,shapeState)==1){left+=1;};}//创建下移的方法public void downMove(){ if(judgeState(left,top+1,shapeType,shapeState)==1){ //判断有图形top+=1;deleteLine(); //判断下移后是否有满行}if(judgeState(left,top+1,shapeType,shapeState)==0){ //判断没有图形 addshape(left,top,shapeType,shapeState);createshape();deleteLine();}}//创建旋转变形的方法public void turnShape(){ int tempshape=shapeState; shapeState=(shapeState+1)%4; //在四中的状态中选取 if(judgeState(left,top,shapeType,shapeState)==1){ } if(judgeState(left,top,shapeType,shapeState)==0){ shapeState=tempshape; //没有图形,不能进行旋转,还原原来状态 }repaint();}//绘图方法public void paintComponent(Graphics g){ super.paintComponent(g); int t=randomcolor.nextInt(5); int count=randomcolor.nextInt(5); Color[] color=new Color[]{Color.pink,Color.green,Color.red,Color.yellow,Color.blue}; /* Image image = null;try {image = ImageIO.read(new File("1.jpg"));} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();g.drawImage(image, 0, 0,this);}*/ //绘制围墙 for(j=0;j<22;j++){ for(i=0;i<12;i++){ if(map[i][j]==2){//判断是否为墙并绘制 g.setColor(Color.blue); g.fill3DRect(i*CELL,j*CELL,CELL,CELL,true); } if(map[i][j]==0){//判断是否为墙并绘制 g.setColor(Color.red); g.drawRoundRect(i*CELL,j*CELL,CELL,CELL,6,6);} } } //绘制正在下落的图形 for(int k=0;k<16;k++){ if(shapes[shapeType][shapeState][k]==1){ g.setColor(Color.red); g.fill3DRect((left+k%4+1)*CELL,(top+k/4)*CELL,CELL,CELL,true); //lefttop为左上角的坐标 } } //绘制落下的图形 for(j=0;j<22;j++){ for(i=0;i<12;i++){ if(map[i][j]==1){ g.setColor(Color.green); g.fill3DRect(i*CELL,j*CELL,CELL,CELL,true); } } } //显示右边预览图形 for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++){if(shapes[nextshapeType][nextshapeState][i*4+j] == 1) {g.setColor(Color.red);g.fill3DRect(375+(j*(CELL-10)),190+(i*(CELL-10)), CELL-10, CELL-10,true);} }}//添加右边预览图形方格for(int i = 0; i < 5; i++) { for(int j = 0; j < 5; j++){g.setColor(Color.blue);g.drawRoundRect(360+(j*(CELL-10)),175+(i*(CELL-10)),CELL-10, CELL-10,3,3); }} g.setFont(new Font("楷书",Font.BOLD,20)); g.setColor(Color.BLUE); g.drawString("游戏分数:", 310, 70); g.setColor(Color.RED); g.drawString(score+" ", 420, 70); g.setColor(Color.BLUE); g.drawString(" 分", 450, 70);}//创建添加新图形到地图的方法、public void addshape(int left,int top,int shapeType,int shapeState){ int temp=0; for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ //对存储方块队的[4][4]数组遍历if(map[left+b+1][top+a]==0){ //表明[4][4]数组没有方块 map[left+b+1][top+a]=shapes[shapeType][shapeState][temp];}temp++; } }} //创建消行的方法,即将满行以上的部分整体下移 public void deleteLine(){ int tempscore=0; //定义满行的列个数满足1 for(int a=0;a<22;a++){ //对地图进行遍历 for(int b=0;b<12;b++){ if(map[b][a]==1){ //表示找到满行 tempscore++; // 记录一行有多少个1 if(tempscore==10){ score+=10; for(int k=a;k>0;k--){ //从满行开始回历 for(int c=1;c<12;c++){ map[c][k]=map[c][k-1]; //将图形整体下移一行 } } }} }tempscore=0; }} //判断游戏结束,1、判断新块的状态是否不存在,即judgeState()==0//2、判断初始产生的位置是否一直为1;public int gameOver(int left,int top){ if(judgeState(left,top,shapeType,shapeState)==0){ return 1; } return 0;}//创建构造方法public GameBody(){resetMap();drawWall();createshape();//Timer timer=new Timer(1000,new TimeListener());Thread timer=new Thread(newTimeListener());timer.start();}public void setStart(boolean start){ //改变start值的方法this.start=start;}//创建定时下落的监听器class TimeListener implements Runnable{ public void run(){ while(true){if(!start){ try{repaint();if(judgeState(left,top+1,shapeType,shapeState)==1){ top+=1; deleteLine();}if(judgeState(left,top+1,shapeType,shapeState)==0){if(flag==1){ addshape(left,top,shapeType,shapeState); deleteLine(); createshape(); flag=0;}flag=1;}Thread.sleep(800); }catch(Exception e){e.getMessage(); } } } } } } } //外层下面是游戏演示的一些界面效果图:
这里说一下,我是把图片和源代码直接放在了一个文件夹下,对于初学者很好理解,这也是很好的练手项目。图片什么的大家可以在网上直接找一个,然后重命名一下就可了。
以上就是Java游戏开发之俄罗斯方块的实现的详细内容,更多关于Java俄罗斯方块的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。