俄罗斯方块Java版

来源:互联网 发布:个人导航源码 编辑:程序博客网 时间:2024/05/17 03:54

简单版的俄罗斯方块,还可以添加菜单和下一个块提示,等分等等扩展

package myown;import java.awt.Graphics;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JPanel;import javax.swing.Timer;public class Tetris extends JPanel{    /**     *      */    private static final long serialVersionUID = 1L;    private static int TimeDelay = 1000;    private static final int BlockSize = 30;    private static final int BlockWidth = 6;    private static final int BlockHeigth = 10;    private boolean[][] currBlock = Block.Shape[(int)(Math.random()*Block.Shape.length)];    private Point newBlockPosition = new Point(BlockWidth/2, 0);    private boolean[][] fixedBlock = new boolean[BlockHeigth][BlockWidth];    private Timer timer;    public Tetris() {        this.addKeyListener(keyListener);        timer = new Timer(Tetris.TimeDelay, this.TimerListener);        timer.start();    }    public void newBlock() {        currBlock =  Block.Shape[(int)(Math.random()*Block.Shape.length)];        newBlockPosition = new Point(BlockWidth/2, 0);    }    // 是否碰到墙壁    public boolean isTouchWall() {        for(int i=0; i<currBlock.length; i++)             for(int j=0; j<currBlock[0].length; j++) {                if(currBlock[i][j])                    if(j + newBlockPosition.x <= 0 || j + newBlockPosition.x >= (BlockWidth + 1)) {                        System.out.println("碰墙");                        return true;                    }            }        return false;    }    // 是否碰到固定好的,底层的墙看成是固定好的Block    public boolean isTouchFixedBlock() {        for(int i=0; i<currBlock.length; i++)             for(int j=0; j<currBlock[0].length; j++) {                if(currBlock[i][j])                     if(i + newBlockPosition.y >= BlockHeigth || j + newBlockPosition.x >= BlockWidth + 1 ||                             fixedBlock[i + newBlockPosition.y][j + newBlockPosition.x - 1]) {                        System.out.println("要固定了");                        return true;                    }            }        return false;    }    // 固定当前Block并消除得分    public void fixBlock() {        for(int i=0; i<currBlock.length; i++)             for(int j=0; j<currBlock[0].length; j++) {                if(currBlock[i][j])                    fixedBlock[i + newBlockPosition.y][j + newBlockPosition.x-1] = true;            }        System.out.println("fixed");        newBlock();        for(int i=0; i<BlockHeigth; i++) {            boolean isFull = true;            for(int j=0; j<BlockWidth; j++) {                if(!fixedBlock[i][j]) {                    isFull = false;                    break;                }            }            if(isFull) {                for(int p=i; p > 0; p--)                    for(int k=0; k<BlockWidth; k++)                         fixedBlock[p][k] = fixedBlock[p-1][k];                for(int k=0; k<BlockWidth; k++)                     fixedBlock[0][k] = false;            }        }    }    // 旋转实现transfer    public void transfer() {        int row = currBlock.length;        int col = currBlock[0].length;        boolean[][] temp = new boolean[row][col];        for(int i=0; i<row; i++)             for(int j=0; j<col; j++)                temp[j][col - 1 - i] = currBlock[i][j];        currBlock = temp;    }    // test method    public static void main(String[] args) {        new Tetris();    }    // repaint method    @Override    protected void paintComponent(Graphics g) {        // TODO Auto-generated method stub        super.paintComponent(g);        //System.out.println(newBlockPosition.x + "," + newBlockPosition.y);        // 画墙        for(int i=0; i<=BlockHeigth; i++) {            g.drawRect(0 * BlockSize, i * BlockSize, BlockSize, BlockSize);            g.drawRect((BlockWidth + 1) * BlockSize, i * BlockSize, BlockSize, BlockSize);        }        for(int i=1; i<=BlockWidth; i++) {            g.drawRect(i * BlockSize, BlockHeigth * BlockSize, BlockSize, BlockSize);        }        // 画已经固定了的        for(int i=0; i<BlockHeigth; i++)            for(int j=0; j<BlockWidth; j++) {                if(fixedBlock[i][j])                    g.fillRect((1+j) * BlockSize, i * BlockSize, BlockSize, BlockSize);            }        // 画当前在下落的        for(int i=0; i<currBlock.length; i++)             for(int j=0; j<currBlock[0].length; j++) {                if(currBlock[i][j])                    g.fillRect((j + newBlockPosition.x) * BlockSize, (i + newBlockPosition.y) * BlockSize, BlockSize, BlockSize);            }    }    // 定时器监听器    ActionListener TimerListener = new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) {            // TODO Auto-generated method stub            newBlockPosition.y++;            if(isTouchFixedBlock()) {                newBlockPosition.y--;                fixBlock();            }            repaint();        }    };    // 按键监听    KeyListener keyListener = new KeyListener() {        @Override        public void keyPressed(KeyEvent e) {            // TODO Auto-generated method stub            switch (e.getKeyCode()) {            case KeyEvent.VK_DOWN:                newBlockPosition.y++;                if(isTouchFixedBlock())                    newBlockPosition.y--;                break;            case KeyEvent.VK_UP:                transfer();                break;            case KeyEvent.VK_RIGHT:                newBlockPosition.x++;                if(isTouchWall() || isTouchFixedBlock())                    newBlockPosition.x--;                break;            case KeyEvent.VK_LEFT:                newBlockPosition.x--;                if(isTouchWall() || isTouchFixedBlock())                    newBlockPosition.x++;                break;            }            repaint();        }        @Override        public void keyReleased(KeyEvent e) {}        @Override        public void keyTyped(KeyEvent e) {}    };}
package myown;import javax.swing.JFrame;public class TetrisApp extends JFrame{    /**     *      */    private static final long serialVersionUID = 1L;    Tetris tetris = new Tetris();    public TetrisApp() {        this.add(tetris);        this.setLocationRelativeTo(null);        setSize(400, 400);        setDefaultCloseOperation(EXIT_ON_CLOSE);        // 如果没有设置获得焦点,按键是没有用的        tetris.setFocusable(true);    }    public static void main(String[] args) {        new TetrisApp().setVisible(true);    }}

效果图:
这里写图片描述

要点就是:下标的控制,有时候加1,还是减1还是要明白清楚

0 0
原创粉丝点击