俄罗斯方块专题(3)
/Constructor
    final int X0 = 10, Y0 = 15;
    final int CELLSIZE = 12;
    public java.awt.Dimension getPreferredSize()
    {
        return new java.awt.Dimension(2*X0+CELLSIZE*BDWIDTH,2*Y0+CELLSIZE*BDHEIGHT);
    }
    public GameCanvas()
    {
        setBackground(java.awt.Color.black);
        addKeyListener(new java.awt.event.KeyAdapter(){
            public void keyPressed(java.awt.event.KeyEvent e)
            {
                switch(e.getKeyCode()){
                    case java.awt.event.KeyEvent.VK_LEFT:
                        postMessage(new Message(Message.MOVE_LEFT));
                        break;
                    case java.awt.event.KeyEvent.VK_RIGHT:
                        postMessage(new Message(Message.MOVE_RIGHT));
                        break;
                    case java.awt.event.KeyEvent.VK_DOWN:
                        postMessage(new Message(Message.MOVE_DOWN));
                        break;
                    case java.awt.event.KeyEvent.VK_UP:
                        postMessage(new Message(Message.ROTATE_CLOCK));
                        break;
                    case java.awt.event.KeyEvent.VK_ENTER:
                        postMessage(new Message(Message.ROTATE_ANTICLOCK));
                        break;
                    case java.awt.event.KeyEvent.VK_PAGE_UP:
                        postMessage(new Message(Message.MOVE_UP));
                        break;
                    case java.awt.event.KeyEvent.VK_SPACE:
                        if(m_S==0)
                            m_S = 1;
                        break;
                    case java.awt.event.KeyEvent.VK_F1:
                        if(m_S==3){
                            m_board.clear();
                            m_S = 0;
                            repaintRequest();
                        }
                }
            }
        });
        new Thread(){
            public void run()
            {
                while(true){
                    try{
                        sleep(500);
                    }catch(InterruptedException e){
                    }
                    postMessage(new Message(Message.MOVE_DOWN));
                }
            }
            }.start();
        new Thread(this).start(); //消息处理线程
    }
    public void postMessage(Message msg)
    {
        if(m_S==1 || m_S==2){
            synchronized(m_msgQueue){
                m_msgQueue.en(msg);
                m_msgQueue.notify();
            }
        }
    }
    public void repaintRequest()
    {
        repaint();
    }
    public void paint(java.awt.Graphics g)
    {
        //draw m_board
        g.setColor(java.awt.Color.blue);
        g.drawRect(X0,Y0,CELLSIZE*BDWIDTH-1,CELLSIZE*BDHEIGHT-1);
        switch(m_S){
            case 1:
            case 2:
                g.setColor(java.awt.Color.yellow);
                break;
            case 3:
                g.setColor(java.awt.Color.lightGray);
                break;
        }
        for(int i=0,y=Y0; i<BDHEIGHT; i++,y+=CELLSIZE){
            for(int j=0,x=X0; j<BDWIDTH; j++,x+=CELLSIZE){
                if(m_board.bddata[i][j])
                    g.fillRect(x,y,CELLSIZE-1,CELLSIZE-1);
            }
        }
        //draw next block show
        g.setColor(java.awt.Color.lightGray);
        boolean nextBlockData[][] = m_blockDataPoolQueue.peekNextBlockData();
        for(int i=0,y=Y0; i<BKSIZE; i++,y+=CELLSIZE){
            for(int j=0,x=X0+(BDWIDTH-BKSIZE)*CELLSIZE; j<BKSIZE; j++,x+=CELLSIZE){
                if(nextBlockData[i][j])
                    g.drawRect(x+1,y+1,CELLSIZE-1,CELLSIZE-1);
            }
        }
        //draw m_block
        if(m_S==2){
            g.setColor(java.awt.Color.red);
            for(int i=0,y=Y0+m_block.rpos*CELLSIZE; i<BKSIZE; i++,y+=CELLSIZE){
                for(int j=0,x=X0+m_block.cpos*CELLSIZE; j<BKSIZE; j++,x+=CELLSIZE){
                    if(m_block.bkdata[i][j])
                        g.fillRect(x,y,CELLSIZE-1,CELLSIZE-1);
                }
            }
        }
        g.setColor(java.awt.Color.red);
        g.setFont(new java.awt.Font(g.getFont().getFontName(),g.getFont().getStyle(),16));
        switch(m_S){
            case 0:
                g.drawString("按空格键开始游戏!",50,100);
                break;
            case 3:
                g.drawString("游戏结束,按F1键重新开始!",20,100);
                break;
        }
    }

解决方案 »

  1.   

    俄罗斯方块专题(3)
    /Constructor
        final int X0 = 10, Y0 = 15;
        final int CELLSIZE = 12;
        public java.awt.Dimension getPreferredSize()
        {
            return new java.awt.Dimension(2*X0+CELLSIZE*BDWIDTH,2*Y0+CELLSIZE*BDHEIGHT);
        }
        public GameCanvas()
        {
            setBackground(java.awt.Color.black);
            addKeyListener(new java.awt.event.KeyAdapter(){
                public void keyPressed(java.awt.event.KeyEvent e)
                {
                    switch(e.getKeyCode()){
                        case java.awt.event.KeyEvent.VK_LEFT:
                            postMessage(new Message(Message.MOVE_LEFT));
                            break;
                        case java.awt.event.KeyEvent.VK_RIGHT:
                            postMessage(new Message(Message.MOVE_RIGHT));
                            break;
                        case java.awt.event.KeyEvent.VK_DOWN:
                            postMessage(new Message(Message.MOVE_DOWN));
                            break;
                        case java.awt.event.KeyEvent.VK_UP:
                            postMessage(new Message(Message.ROTATE_CLOCK));
                            break;
                        case java.awt.event.KeyEvent.VK_ENTER:
                            postMessage(new Message(Message.ROTATE_ANTICLOCK));
                            break;
                        case java.awt.event.KeyEvent.VK_PAGE_UP:
                            postMessage(new Message(Message.MOVE_UP));
                            break;
                        case java.awt.event.KeyEvent.VK_SPACE:
                            if(m_S==0)
                                m_S = 1;
                            break;
                        case java.awt.event.KeyEvent.VK_F1:
                            if(m_S==3){
                                m_board.clear();
                                m_S = 0;
                                repaintRequest();
                            }
                    }
                }
            });
            new Thread(){
                public void run()
                {
                    while(true){
                        try{
                            sleep(500);
                        }catch(InterruptedException e){
                        }
                        postMessage(new Message(Message.MOVE_DOWN));
                    }
                }
                }.start();
            new Thread(this).start(); //消息处理线程
        }
        public void postMessage(Message msg)
        {
            if(m_S==1 || m_S==2){
                synchronized(m_msgQueue){
                    m_msgQueue.en(msg);
                    m_msgQueue.notify();
                }
            }
        }
        public void repaintRequest()
        {
            repaint();
        }
        public void paint(java.awt.Graphics g)
        {
            //draw m_board
            g.setColor(java.awt.Color.blue);
            g.drawRect(X0,Y0,CELLSIZE*BDWIDTH-1,CELLSIZE*BDHEIGHT-1);
            switch(m_S){
                case 1:
                case 2:
                    g.setColor(java.awt.Color.yellow);
                    break;
                case 3:
                    g.setColor(java.awt.Color.lightGray);
                    break;
            }
            for(int i=0,y=Y0; i<BDHEIGHT; i++,y+=CELLSIZE){
                for(int j=0,x=X0; j<BDWIDTH; j++,x+=CELLSIZE){
                    if(m_board.bddata[i][j])
                        g.fillRect(x,y,CELLSIZE-1,CELLSIZE-1);
                }
            }
            //draw next block show
            g.setColor(java.awt.Color.lightGray);
            boolean nextBlockData[][] = m_blockDataPoolQueue.peekNextBlockData();
            for(int i=0,y=Y0; i<BKSIZE; i++,y+=CELLSIZE){
                for(int j=0,x=X0+(BDWIDTH-BKSIZE)*CELLSIZE; j<BKSIZE; j++,x+=CELLSIZE){
                    if(nextBlockData[i][j])
                        g.drawRect(x+1,y+1,CELLSIZE-1,CELLSIZE-1);
                }
            }
            //draw m_block
            if(m_S==2){
                g.setColor(java.awt.Color.red);
                for(int i=0,y=Y0+m_block.rpos*CELLSIZE; i<BKSIZE; i++,y+=CELLSIZE){
                    for(int j=0,x=X0+m_block.cpos*CELLSIZE; j<BKSIZE; j++,x+=CELLSIZE){
                        if(m_block.bkdata[i][j])
                            g.fillRect(x,y,CELLSIZE-1,CELLSIZE-1);
                    }
                }
            }
            g.setColor(java.awt.Color.red);
            g.setFont(new java.awt.Font(g.getFont().getFontName(),g.getFont().getStyle(),16));
            switch(m_S){
                case 0:
                    g.drawString("按空格键开始游戏!",50,100);
                    break;
                case 3:
                    g.drawString("游戏结束,按F1键重新开始!",20,100);
                    break;
            }
        }
      

  2.   

    俄罗斯方块专题(4)
    private class BlockDataPoolQueue extends Queue
        {
            public BlockDataPoolQueue(){ this.currentBlockData = bkdataPool[ran.nextInt(bkdataPool.length)]; }
            public boolean[][] peekNextBlockData()
            {
                return this.currentBlockData;
            }
            public boolean[][] getNextBlockData()
            {
                boolean[][] bkd = this.currentBlockData;
                this.currentBlockData = bkdataPool[ran.nextInt(bkdataPool.length)];
                return bkd;
            }
            private boolean[][] currentBlockData = null;
            private java.util.Random ran = new java.util.Random();
            private boolean bkdataPool[][][] ={
                {{false,false,true,true,false},
                {false,false,true,false,false},
                {false,false,true,false,false},
                {false,true,true,false,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,true,true,false,false},
                {false,false,true,false,false},
                {false,false,true,true,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,false,true,false,false},
                {false,true,true,true,false},
                {false,false,true,false,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,false,false,false,false},
                {false,true,true,true,false},
                {false,false,false,true,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,true,false,false,false},
                {false,false,true,false,false},
                {false,false,false,false,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,false,false,false,false},
                {false,false,true,false,false},
                {false,false,false,false,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,true,true,false,false},
                {false,true,true,false,false},
                {false,false,false,false,false},
                {false,false,false,false,false}},
                {{false,false,false,false,false},
                {false,false,false,false,false},
                {false,true,true,true,false},
                {false,false,true,false,false},
                {false,false,false,false,false}}};
        }
        private class Queue
        {
            private Node head;
            private Node tail;
            public Queue()
            {
                head = new Node();
                tail = new Node();
                head.prev = tail.next = null;
                head.next = tail;
                tail.prev = head;
            }
            public void en(Object item)
            {
                Node q = new Node();
                q.data = item;
                q.next = tail;
                q.prev = tail.prev;
                tail.prev.next = q;
                tail.prev = q;
            }
            public Object dl()
            {
                if(! empty()){
                    Node p = head.next;
                    head.next.next.prev = head;
                    head.next = head.next.next;
                    return p.data;
                }else
                    return null;
            }
            public Object peek()
            {
                if(! empty())
                    return head.next.data;
                else
                    return null;
            }
            public boolean empty()
            {
                return (head.next==tail) || (tail.prev==head);
            }
            public void clear()
            {
                head.next = tail;
                tail.prev = head;
            }
            public int elemNum()
            {
                int num = 0;
                for(Node q=head.next; q!=tail; q=q.next)
                    num++;
                return num;
            }
            private class Node
            {
                Object data;
                Node prev;
                Node next;
            }
        }