import java.awt.*;
import java.awt.event.*;/**
 *
 * @author Administrator
 */
public class NewClass extends java.awt.Frame implements KeyListener,Runnable{
    Model model;
    /**下次出现
     */
    int bp;
    Thread thr = new Thread(this);
    /**是否是暂停游戏
     */
    boolean push_game;
    /**是否已结束游戏
     */
    boolean game_over;
    /**计时
     */
    long sp_time = 0,length_time=0;
    
    /**等级对应的速度,30级
     */
    int leves[]={1200,1080,972,874,786,707,636,572,514,462,415,373,335,301,270,243,218,196,176,158,142,127,114,102,91,81,72,64,57,51,45,40,36,32,28};
    /**游戏等级
     */
    int leve=0;
    /**销除N行对应的分数
     */
    int counts[]={0,1,2,5,8};
    /**销除的总行数
     */
    int count=0;
    /**产生随机数
     */
    java.util.Random sjs=new java.util.Random();
    
    /** Creates a new instance of NewClass */
    public NewClass() {
        setSize(420,480);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        addKeyListener(this);
        start();
    }
    /**开始游戏,数据初始化
     */
    void start(){
        model = new Model();
        if(thr==null||!thr.isAlive()){
            thr=new Thread(this);
            thr.start();
        }
        setTitle("");
        leve=0;
        push_game=false;
        game_over=false;
        sp_time = System.currentTimeMillis();
        length_time=0;
        count=0;
        bp= (int)sjs.nextLong()%19;
        if(bp<0)bp=-bp;
        model.setType((int)sjs.nextLong()%19);
    }
    
  Image offScreenImage=null;    public void update(Graphics g) {              //双缓冲技术
    if(offScreenImage==null){
        offScreenImage=this.createImage(330,400+40+10);
    }
     Graphics goffScreen=offScreenImage.getGraphics();
     Color c=goffScreen.getColor();
     goffScreen.setColor(Color.black);
     goffScreen.fillRect(0, 0, 210+10,440+10);
     goffScreen.setColor(c);
     paint(goffScreen);
     g.drawImage(offScreenImage, 0, 0,null);
 }
    
    public void paint(Graphics g){
        g.setColor(Color.BLUE);
        g.fill3DRect(10 ,40,200-1,400-1,false);
        g.setColor(Color.RED);
        //主界面
        for(int j=0;j<20;j++){
            for(int i=0;i<10;i++){
                if(model.data[j][i])
                    g.fill3DRect(10+20*i,40+20*(19-j),19,19,false);
            }
        }
        
        //当前下落的形状
        for(int i=0;i<4;i++){
            int x=model.bh[model.getType()][i][0]+model.point.x;
            int y=(model.bh[model.getType()][i][1]+model.point.y);
            if(y<0||y>20)
                continue;
            g.fill3DRect(10+20*x,40+20*(19-y),19,19,false);
        }
        
        //小窗口,下次下落的形状
        if(bp>=0){
            g.setColor(Color.WHITE);
            g.fill3DRect(230,40,80,80,false);
            g.setColor(Color.RED);
            for(int []p:model.bh[model.sx[bp][1]]){
                g.fill3DRect(270+20*p[1],60+20*p[0],19,19,false);
            }
        }
        
        //显示分数等
        g.setColor(Color.YELLOW);
        g.fill3DRect(230,180,80,80,true);
        g.setColor(Color.BLACK);
        g.drawString("leve:"+(leve+1),250,200);
        g.drawString("count:"+(count),250,220);
        g.drawString("time:"+(length_time/1000)+"(S)",250,240);
        g.setColor(Color.RED);
        g.drawString("A左,S加速,D右,J顺时间转动",230,300);
        g.drawString("K逆顺时间转动,空格瞬间到底",230,320);
        g.drawString("回车 暂停和开始,H重新开始游戏",230,340);
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewClass().setVisible(true);
            }
        });
    }
    public void keyTyped(KeyEvent e) {
        if(e.getKeyChar()=='h'||e.getKeyChar()=='H'||e.getKeyCode()==e.VK_H){
            start();
        }
        if(game_over)
            return;
        if(e.getKeyChar()=='A'||e.getKeyChar()=='a'||e.getKeyCode()==e.VK_A){
            if(model.canMove(model.LIGHT)){
                this.repaint();
            }
        }else if(e.getKeyChar()=='D'||e.getKeyChar()=='d'||e.getKeyCode()==e.VK_D){
            if(model.canMove(model.RIGHT)){
                this.repaint();
            }
        }else if(e.getKeyChar()==' '){
            while(model.canMove(model.DROP));
            drop();
        }else if(e.getKeyChar()=='j'||e.getKeyChar()=='J'||e.getKeyCode()==e.VK_J){
            if(model.canb(true)){
                this.repaint();
            }
        }else if(e.getKeyChar()=='k'||e.getKeyChar()=='K'||e.getKeyCode()==e.VK_K){
            if(model.canb(false)){
                this.repaint();
            }
        }else if(e.getKeyChar()=='s'||e.getKeyChar()=='S'||e.getKeyCode()==e.VK_S){
            if(model.canMove(model.DROP)){
                this.repaint();
            }
        }else  if(e.getKeyChar()=='\n'){
            if(push_game){
                setTitle("");
            }else{
                setTitle("暂停游戏");
            }
            push_game=!push_game;
        }
    }
    
    public void keyPressed(KeyEvent e) {
    }    public void keyReleased(KeyEvent e) {
    }
    
    /**
     *向下掉落
     **/
    void drop(){
        if(model.canMove(model.DROP)){
        }else if(model.getType()>-1){
            for(int[] d:model.bh[model.getType()]){
                model.data[d[1]+model.point.y][d[0]+model.point.x]=true;
            }            //销除行,检查point.y+1到point.y-2行
            int js=0;
            for(int i=1;i>-3;i--){
                boolean flag=true;
                if(model.point.y+i<20&&model.point.y+i>=0)
                for(boolean b:model.data[model.point.y+i]){
                    if(!b){
                        flag=false;
                        break;
                    }
                }else continue;
                if(flag){//当前行可销除
                    //整体向下移
                    for(int j=model.point.y+i;j<20;j++){
                        model.data[j]=model.data[j+1];
                    }
                    model.data[20]=new boolean[10];
                    js++;
                }
            }
            //游戏结束断定
            if(model.data[19][4]||model.data[19][5]||model.data[19][6]||model.data[19][3]){
                this.setTitle("GAME OVER!");
                game_over=true;
                return;
            }
            //更新数据
            count+=counts[js];
            leve=count/200;
            model.point.x=4;
            model.point.y=22;
            model.setType(bp);
            bp=(int)sjs.nextLong()%19;
            if(bp<0)bp=-bp;
        }
        repaint();
    }
    
    public void run() {
        while(true){
            if(push_game){
                sp_time=System.currentTimeMillis();
            }else if(!game_over){
                length_time += System.currentTimeMillis()-sp_time;
                sp_time=System.currentTimeMillis();
                drop();
            }
            try {
                Thread.sleep(leves[leve]);
            } catch (InterruptedException ex) {
            }
        }
    }
}帖上得了多少分

解决方案 »

  1.   

    class Model{
        final static int LIGHT=0,DROP=1,RIGHT=2;
        /**坐标
         */
        Point point=new Point(4,22);
        /**容器
         */
        boolean data[][]=new boolean[24][10];;
        /**类型
         */
        int type = 0;
        
        /**形状相对point的偏移
         */
        int[][][]bh={
            {{0,0},{1,0},{0,-1},{1,-1}},//0
            {{0,1},{0,0},{0,-1},{0,-2}},
            {{-1,0},{0,0},{1,0},{2,0}},
            {{-1,0},{0,0},{0,-1},{1,-1}},//3
            {{0,1},{0,0},{-1,0},{-1,-1}},
            {{-1,-1},{0,-1},{0,0},{1,0}},
            {{0,1},{0,0},{1,0},{1,-1}},//6
            {{0,1},{-1,0},{0,0},{1,0}},
            {{0,1},{0,0},{0,-1},{1,0}},
            {{-1,0},{0,0},{0,-1},{1,0}},//9
            {{0,-1},{0,0},{0,1},{-1,0}},
            {{-1,0},{0,0},{1,0},{1,-1}},
            {{0,1},{0,0},{0,-1},{-1,-1}},//12
            {{-1,1},{-1,0},{0,0},{1,0}},
            {{0,1},{1,1},{0,0},{0,-1}},
            {{-1,0},{0,0},{1,0},{-1,-1}},//15
            {{-1,1},{0,1},{0,0},{0,-1}},
            {{-1,0},{0,0},{1,0},{1,1}},
            {{0,1},{0,0},{0,-1},{1,-1}}//18
        };
        
        //变换序号
        int sx[][]={
            //顺时针,逆
            {0,0},//0
            {2,2},
            {1,1},
            {4,4},//3
            {3,3},
            {6,6},
            {5,5},//6
            {8,10},
            {9,7},
            {10,8},//9
            {7,9},
            {12,14},
            {13,11},//12
            {14,12},
            {11,13},
            {16,18},//15
            {17,15},
            {18,16},
            {15,17}//18
        };
        
        Model(){
        }
        void setType(int t){
            if(t<0)
                this.type=-type;
            else
                this.type=t;
        }
        int getType(){
            return type;
        }
        /**变化 true 顺时针
         * t 0 - 18
         */
        boolean canb(boolean rl){
            if(type==0)
                return true;
            int sp=0;
            if(!rl)
                sp=1;
            if(!bz(sx[type][sp],point.x,point.y)){
                type=sx[type][sp];
                return true;
            }
            return false;
        }
        /**移动
         */
        boolean canMove(int fx){
            switch(fx){
                case 0:
                    if(bz(type,point.x-1,point.y))
                        return false;
                    point.x=point.x-1;break;
                case 1:
                    if(bz(type,point.x,point.y-1))
                        return false;
                    point.y=point.y-1;break;
                case 2:
                    if(bz(type,point.x+1,point.y))
                        return false;
                    point.x=point.x+1;break;
            }
            return true;
        }
        /**出界或碰撞 返回true
         */
        boolean bz(int t,int x,int y){
            if(t==-1){
                return true;
            }
            int ix,iy;
            for(int i=0;i<4;i++){
                ix=bh[t][i][0]+x;
                iy=bh[t][i][1]+y;
                if(ix<0||ix>9||iy<0||data[iy][ix]){
                    return true;
                }
            }
            return false;
        }
    }
      

  2.   

    那啥,我也分享一下自己的俄罗斯方块
    http://download.csdn.net/source/2086425