一个俄罗斯方块程序(非案例版)
我们学面向对象的时候曾经做过俄罗斯方块这个案例,当时没有做完,我也不知道有《JAVA经典项目集锦》这个教材(做飞机大战的时候老师才告诉我们有这个书)。我当时想把它完成,可是自己又水平不够,不会JFrame,不会操纵图片,不会定时器,不会监听键盘,感觉难以下手。所以我在网上找了一个别人做的俄罗斯方块程序,把它小幅修改了一下,分享给大家。
即使你对我们已经做过的俄罗斯方块项目已经非常熟了,也可以看看这个程序。这个程序比起来《JAVA经典项目集锦》上面完整版的俄罗斯方块项目的优点在于精简,它就是为了实现俄罗斯方块运行时的效果而写的程序,能少写则少写,最终不到300行完成这个程序。而我们的项目为了教学,刻意使用了很多的类,使得最终程序很长(我没有敲一遍,估计不算注释要有600行)。这个程序节省篇幅的地方主要就在于它只用了一个三维数组,36行代码就把7种形状,4种旋转状态全部包括进去了,而我们的案例中采用了1个类(包括8个内部类),总共200行代码才做到同样的效果,而且,对这些类的操作也比对一个数组操作要更加麻烦,又在操作这些形状上拉开200行代码的差距。因此,虽然面向对象有很多好处,但是滥用面向对象也会招致很多不必要的麻烦,比如编写代码篇幅剧增,使得编程花费时间增加。
此程序除了没有用图片,直接用黑块代替cell的图片,实际游戏效果几乎和案例的一样,它也实现了计分和让速度等级随着游戏的进行递增。大家可以阅读一下,和我们做的案例对比一下,反思如果你自己编写一个程序,如何能尽量缩短程序的篇幅,兼顾写代码的效率和代码性能。
package Tetris; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; import javax.swing.Timer; public class Tetris extends JFrame{ public Tetris(){ Tetrisblok a=new Tetrisblok(); addKeyListener(a); add(a); } public static void main(String[] args){ Tetris frame=new Tetris(); JMenuBar menu=new JMenuBar(); frame.setJMenuBar(menu); JMenu game=new JMenu("游戏"); JMenuItem newgame=game.add("新游戏"); JMenuItem pause=game.add("暂停"); JMenuItem goon=game.add("继续"); JMenuItem exit=game.add("退出"); JMenu help=new JMenu("帮助"); JMenuItem about=game.add("关于"); menu.add(game); menu.add(help); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220,275); frame.setTitle("Tetris内测版"); frame.setVisible(true); frame.setResizable(false); } } class Tetrisblok extends JPanel implements KeyListener{ private int level=1; private int sum=0; private int blockType; private int score=0; private int turnState; private int x; private int y; private int i=0; int j=0; int flag=0; int[][]map=new int[13][23]; 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 newblock(){ sum++; if(sum%20==0){ level++; } blockType=(int)(Math.random()*1000)%7; turnState=(int)(Math.random()*1000)%4; x=4; y=0; if(gameover(x,y)==1){ newmap(); drawwall(); score=0; level=1; JOptionPane.showMessageDialog(null, "GAME OVER"); } } public void drawwall(){ for(i=0;i<12;i++){ map[i][21]=2; } for(j=0;j<22;j++){ map[11][j]=2; map[0][j]=2; } } public void newmap(){ for(i=0;i<12;i++){ for(j=0;j<22;j++){ map[i][j]=0; } } } Tetrisblok(){ newblock(); newmap(); drawwall(); Timer timer=new Timer(700/level,new TimerListener()); timer.start(); } public void turn(){ int tempturnState=turnState; turnState=(turnState+1)%4; if(blow(x,y,blockType,turnState)==1){ } if(blow(x,y,blockType,turnState)==0){ turnState=tempturnState; } repaint(); } public void left(){ if(blow(x-1,y,blockType,turnState)==1){ x=x-1; } ; repaint(); } public void right(){ if(blow(x+1,y,blockType,turnState)==1){ x=x+1; } ; repaint(); } public void down(){ if(blow(x,y+1,blockType,turnState)==1){ y=y+1; delline(); } if(blow(x,y+1,blockType,turnState)==0){ add(x,y,blockType,turnState); newblock(); delline(); } ; repaint(); } public int blow(int x, int y, int blocktype,int turnState){ for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ if(((shapes[blockType][turnState][a*4+b]==1)&&(map[x+b+1][y+a]==1))|| ((shapes[blockType][turnState][a*4+b]==1)&&(map[x+b+1][y+a]==2))){ return 0; } } } return 1; } public void delline(){ int c=0; int d1=0; for(int b=0;b<22;b++){ for(int a=0;a<12;a++){ if(map[a][b]==1){ c=c+1; if(c==10){ d1+=10; score+=d1; for(int d=b;d>0;d--){ for(int e=0;e<11;e++){ map[e][d]=map[e][d-1]; } } } } } c=0; } } public int gameover(int x,int y){ if(blow(x,y,blockType,turnState)==0){ return 1; } return 0; } public void add(int x,int y,int blockType,int turnState){ int j=0; for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ if(map[x+b+1][y+a]==0){ map[x+b+1][y+a]=shapes[blockType][turnState][j]; } ; j++; } } } public void paintComponent(Graphics g){ super.paintComponent(g); for(j=0;j<16;j++){ if(shapes[blockType][turnState][j]==1){ g.fillRect((j%4+x+1)*10,(j/4+y)*10,10,10); } } for(j=0;j<22;j++){ for(i=0;i<12;i++){ if(map[i][j]==1){ g.fillRect(i*10, j*10, 10, 10); } if(map[i][j]==2){ g.drawRect(i*10, j*10, 10, 10); } } } g.drawString("score=" +score,125,10); g.drawString("level=" +level,125,30); g.drawString("抵制不良游戏,",125,50); g.drawString("拒绝盗版游戏。",125,70); g.drawString("注意自我保护,",125,90); g.drawString("谨防受骗上当。",125,110); g.drawString("适度游戏益脑,",125,130); g.drawString("沉迷游戏伤身。",125,150); g.drawString("合理安排时间,",125,170); g.drawString("享受健康生活。",125,190); } public void keyPressed(KeyEvent e){ switch(e.getKeyCode()){ case KeyEvent.VK_DOWN: down(); break; case KeyEvent.VK_UP: turn(); break; case KeyEvent.VK_RIGHT: right(); break; case KeyEvent.VK_LEFT: left(); break; } } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ } class TimerListener implements ActionListener{ public void actionPerformed(ActionEvent e){ repaint(); if(blow(x,y+1,blockType,turnState)==1){ y=y+1; delline(); } ; if(blow(x,y+1,blockType,turnState)==0){ if(flag==1){ add(x,y,blockType,turnState); delline(); newblock(); flag=0; } flag=1; } ; } } }
【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!
Java开发高端课程免费试学
大咖讲师+项目实战全面提升你的职场竞争力
- 海量实战教程
- 1V1答疑解惑
- 行业动态分析
- 大神学习路径图
相关推荐
更多2015-10-13
达内就业喜报
更多>Java开班时间
-
北京 丨 11月27日
火速抢座 -
上海 丨 11月27日
火速抢座 -
广州 丨 11月27日
火速抢座 -
兰州 丨 11月27日
火速抢座 -
杭州 丨 11月27日
火速抢座 -
南京 丨 11月27日
火速抢座 -
沈阳 丨 11月27日
火速抢座 -
大连 丨 11月27日
火速抢座 -
长春 丨 11月27日
火速抢座 -
哈尔滨 丨 11月27日
火速抢座 -
济南 丨 11月27日
火速抢座 -
青岛 丨 11月27日
火速抢座 -
烟台 丨 11月27日
火速抢座 -
西安 丨 11月27日
火速抢座 -
天津 丨 11月27日
火速抢座 -
石家庄 丨 11月27日
火速抢座 -
保定 丨 11月27日
火速抢座 -
郑州 丨 11月27日
火速抢座 -
合肥 丨 11月27日
火速抢座 -
太原 丨 11月27日
火速抢座 -
苏州 丨 11月27日
火速抢座 -
武汉 丨 11月27日
火速抢座 -
成都 丨 11月27日
火速抢座 -
重庆 丨 11月27日
火速抢座 -
厦门 丨 11月27日
火速抢座 -
福州 丨 11月27日
火速抢座 -
珠海 丨 11月27日
火速抢座 -
南宁 丨 11月27日
火速抢座 -
东莞 丨 11月27日
火速抢座 -
贵阳 丨 11月27日
火速抢座 -
昆明 丨 11月27日
火速抢座 -
洛阳 丨 11月27日
火速抢座 -
临沂 丨 11月27日
火速抢座 -
潍坊 丨 11月27日
火速抢座 -
运城 丨 11月27日
火速抢座 -
呼和浩特丨11月27日
火速抢座 -
长沙 丨 11月27日
火速抢座 -
南昌 丨 11月27日
火速抢座 -
宁波 丨 11月27日
火速抢座 -
深圳 丨 11月27日
火速抢座 -
大庆 丨 11月27日
火速抢座