Java实现俄罗斯方块小游戏。(附完整源代码)

    }



    public void setRow0(int row0) {

        this.row0 = row0;

    }



    public int getCol0() {

        return col0;

    }



    public void setCol0(int col0) {

        this.col0 = col0;

    }



    public int getRow1() {

        return row1;

    }



    public void setRow1(int row1) {

        this.row1 = row1;

    }



    public int getCol1() {

        return col1;

    }



    public void setCol1(int col1) {

        this.col1 = col1;

    }



    public int getRow2() {

        return row2;

    }



    public void setRow2(int row2) {

        this.row2 = row2;

    }



    public int getCol2() {

        return col2;

    }



    public void setCol2(int col2) {

        this.col2 = col2;

    }



    public int getRow3() {

        return row3;

    }



    public void setRow3(int row3) {

        this.row3 = row3;

    }



    public int getCol3() {

        return col3;

    }



    public void setCol3(int col3) {

        this.col3 = col3;

    }



    @Override

    public String toString() {

        return "State{" +

                "row0=" + row0 +

                ", col0=" + col0 +

                ", row1=" + row1 +

                ", col1=" + col1 +

                ", row2=" + row2 +

                ", col2=" + col2 +

                ", row3=" + row3 +

                ", col3=" + col3 +

                '}';

    }

}

}




七种图形类:I、J、L、O、S、T、Z



public class I extends Tetromino {

public I() {

    cells[0] = new Cell(0,4, Tetris.I);

    cells[1] = new Cell(0,3, Tetris.I);

    cells[2] = new Cell(0,5, Tetris.I);

    cells[3] = new Cell(0,6, Tetris.I);



    //共有两种旋转状态

    states =new State[2];

    //初始化两种状态的相对坐标

    states[0]=new State(0,0,0,-1,0,1,0,2);

    states[1]=new State(0,0,-1,0,1,0,2,0);

}

}


public class J extends Tetromino {

public J() {

    cells[0] = new Cell(0,4, Tetris.J);

    cells[1] = new Cell(0,3, Tetris.J);

    cells[2] = new Cell(0,5, Tetris.J);

    cells[3] = new Cell(1,5, Tetris.J);



    states=new State[4];

    states[0]=new State(0,0,0,-1,0,1,1,1);

    states[1]=new State(0,0,-1,0,1,0,1,-1);

    states[2]=new State(0,0,0,1,0,-1,-1,-1);

    states[3]=new State(0,0,1,0,-1,0,-1,1);

}

}


public class L extends Tetromino {

public L() {

    cells[0] = new Cell(0,4, Tetris.L);

    cells[1] = new Cell(0,3, Tetris.L);

    cells[2] = new Cell(0,5, Tetris.L);

    cells[3] = new Cell(1,3, Tetris.L);



    states=new State[4];

    states[0]=new State(0,0,0,-1,0,1,1,-1);

    states[1]=new State(0,0,-1,0,1,0,-1,-1);

    states[2]=new State(0,0,0,1,0,-1,-1,1);

    states[3]=new State(0,0,1,0,-1,0,1,1);

}

}


public class O extends Tetromino {

public O() {

    cells[0] = new Cell(0, 4, Tetris.O);

    cells[1] = new Cell(0, 5, Tetris.O);

    cells[2] = new Cell(1, 4, Tetris.O);

    cells[3] = new Cell(1, 5, Tetris.O);



    //无旋转状态

    states = new State[0];

}

}


public class S extends Tetromino {

public S() {

    cells[0] = new Cell(0,4, Tetris.S);

    cells[1] = new Cell(0,5, Tetris.S);

    cells[2] = new Cell(1,3, Tetris.S);

    cells[3] = new Cell(1,4, Tetris.S);



    //共有两种旋转状态

    states =new State[2];

    //初始化两种状态的相对坐标

    states[0]=new State(0,0,0,1,1,-1,1,0);

    states[1]=new State(0,0,1,0,-1,-1,0,-1);

}

}


public class T extends Tetromino {

public T() {

    cells[0] = new Cell(0,4, Tetris.T);

    cells[1] = new Cell(0,3, Tetris.T);

    cells[2] = new Cell(0,5, Tetris.T);

    cells[3] = new Cell(1,4, Tetris.T);



    states=new State[4];

    states[0]=new State(0,0,0,-1,0,1,1,0);

    states[1]=new State(0,0,-1,0,1,0,0,-1);

    states[2]=new State(0,0,0,1,0,-1,-1,0);

    states[3]=new State(0,0,1,0,-1,0,0,1);

}

}


public class Z extends Tetromino {

public Z() {

    cells[0] = new Cell(1,4, Tetris.Z);

    cells[1] = new Cell(0,3, Tetris.Z);

    cells[2] = new Cell(0,4, Tetris.Z);

    cells[3] = new Cell(1,5, Tetris.Z);



    //共有两种旋转状态

    states =new State[2];

    //初始化两种状态的相对坐标

    states[0]=new State(0,0,-1,-1,-1,0,0,1);

    states[1]=new State(0,0,-1,1,0,1,1,0);

}

}




俄罗斯方块游戏主类:Tetris



public class Tetris extends JPanel {

//正在下落的方块

private Tetromino currentOne = Tetromino.randomOne();

//将要下落的方块

private Tetromino nextOne = Tetromino.randomOne();

//游戏主区域

private Cell[][] wall = new Cell[18][9];

//声明单元格的值

private static final int CELL_SIZE = 48;



//游戏分数池

int[] scores_pool = {0, 1, 2, 5, 10};

//当前游戏的分数

private int totalScore = 0;

//当前消除的行数

private int totalLine = 0;



//游戏三种状态 游戏中、暂停、结束

public static final int PLING = 0;

public static final int STOP = 1;

public static final int OVER = 2;

//当前游戏状态值

private int game_state;

//显示游戏状态

String[] show_state = {"P[pause]", "C[continue]", "S[replay]"};





//载入方块图片

public static BufferedImage I;

public static BufferedImage J;

public static BufferedImage L;

public static BufferedImage O;

public static BufferedImage S;

public static BufferedImage T;

public static BufferedImage Z;

public static BufferedImage background;



static {

    try {

        I = ImageIO.read(new File("images/I.png"));

        J = ImageIO.read(new File("images/J.png"));

        L = ImageIO.read(new File("images/L.png"));

        O = ImageIO.read(new File("images/O.png"));

        S = ImageIO.read(new File("images/S.png"));

        T = ImageIO.read(new File("images/T.png"));

        Z = ImageIO.read(new File("images/Z.png"));

        background = ImageIO.read(new File("images/background.png"));

    } catch (IOException e) {

        e.printStackTrace();

    }

}



@Override

public void paint(Graphics g) {

    g.drawImage(background, 0, 0, null);

    //平移坐标轴

    g.translate(22, 15);

    //绘制游戏主区域

    paintWall(g);

    //绘制正在下落的四方格

    paintCurrentOne(g);

    //绘制下一个将要下落的四方格

    paintNextOne(g);

    //绘制游戏得分

    paintSource(g);

    //绘制当前游戏状态

    paintState(g);

}



public void start() {

    game_state = PLING;

    KeyListener l = new KeyAdapter() {

        @Override

        public void keyPressed(KeyEvent e) {

            int code = e.getKeyCode();

            switch (code) {

                case KeyEvent.VK_DOWN:

                    sortDropActive();

                    break;

                case KeyEvent.VK_LEFT:

                    moveleftActive();

                    break;

                case KeyEvent.VK_RIGHT:

                    moveRightActive();

                    break;

                case KeyEvent.VK_UP:

                    rotateRightActive();

                    break;

                case KeyEvent.VK_SPACE:

                        hadnDropActive();

                    break;

                case KeyEvent.VK_P:

                    //判断当前游戏状态

                    if (game_state == PLING) {

                        game_state = STOP;

                    }

                    break;

                case KeyEvent.VK_C:

                    if (game_state == STOP) {

                        game_state = PLING;

                    }

                    break;

                case KeyEvent.VK_S:

                    //重新开始

                    game_state = PLING;

                    wall = new Cell[18][9];

                    currentOne = Tetromino.randomOne();

                    nextOne = Tetromino.randomOne();

                    totalScore = 0;

                    totalLine = 0;

                    break;

            }

        }

    };

    //将窗口设置为焦点

    this.addKeyListener(l);

    this.requestFocus();



    while (true) {

        if (game_state == PLING) {

            try {

                Thread.sleep(500);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            if (camDrop()) {

                currentOne.moveDrop();

            } else {

                landToWall();

                destroyLine();

                if (isGameOver()) {

                    game_state = OVER;

                } else {

                    //游戏没有结束

                    currentOne = nextOne;

                    nextOne = Tetromino.randomOne();

                }

            }

        }

        repaint();

    }

}



//创建顺时针旋转

public void rotateRightActive() {

    currentOne.rotateRight();

    if (outOFBounds() || coincide()) {

        currentOne.rotateLeft();

    }

}



//瞬间下落

public void hadnDropActive() {

    while (true) {

        //判断能否下落

        if (camDrop()) {

            currentOne.moveDrop();

        } else {

            break;

        }

    }

    //嵌入到墙中

    landToWall();

    destroyLine();

    if (isGameOver()) {

        game_state = OVER;

    } else {

        //游戏没有结束

        currentOne = nextOne;

        nextOne = Tetromino.randomOne();

    }

}



//按键一次,下落一格

public void sortDropActive() {

    if (camDrop()) {

        //当前四方格下落一格

        currentOne.moveDrop();

    } else {

        landToWall();

        destroyLine();

        if (isGameOver()) {

            game_state = OVER;

        } else {

            //游戏没有结束

            currentOne = nextOne;

            nextOne = Tetromino.randomOne();

        }

    }

}



//单元格嵌入墙中

private void landToWall() {

    Cell[] cells = currentOne.cells;

    for (Cell cell : cells) {

        int row = cell.getRow();

        int col = cell.getCol();

        wall[row][col] = cell;

    }

}



//判断四方格能否下落

public boolean camDrop() {

    Cell[] cells = currentOne.cells;

    for (Cell cell : cells) {

        int row = cell.getRow();

        int col = cell.getCol();

        //判断是否到达底部

        if (row == wall.length - 1) {

            return false;

        } else if (wall[row + 1][col] != null) {

            return false;

        }

    }

    return true;

}



//消除行

public void destroyLine() {

    int line = 0;

    Cell[] cells = currentOne.cells;

    for (Cell cell : cells) {

        int row = cell.getRow();

        if (isFullLine(row)) {

            line++;

            for (int i = row; i > 0; i--) {

                System.arraycopy(wall[i - 1], 0, wall[i], 0, wall[0].length);

            }

            wall[0] = new Cell[9];

        }

    }

    //分数池获取分数,累加到总分

    totalScore += scores_pool[line];

    //总行数

    totalLine += line;

}



//判断当前行是否已经满了

public boolean isFullLine(int row) {

    Cell[] cells = wall[row];

    for (Cell cell : cells) {

        if (cell == null) {

            return false;

        }

    }

    return true;

}



//判断游戏是否结束

public boolean isGameOver() {

    Cell[] cells = nextOne.cells;

    for (Cell cell : cells) {

        int row = cell.getRow();

        int col = cell.getCol();

        if (wall[row][col] != null) {

            return true;

        }

    }

    return false;

}



private void paintState(Graphics g) {

    if (game_state == PLING) {

        g.drawString(show_state[PLING], 500, 660);

    } else if (game_state == STOP) {

        g.drawString(show_state[STOP], 500, 660);

    } else {

        g.drawString(show_state[OVER], 500, 660);

        g.setColor(Color.RED);

        g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 60));

        g.drawString("GAME OVER!", 30, 400);

    }

}



private void paintSource(Graphics g) {

    g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 30));

    g.drawString("分数: " + totalScore, 500, 250);

    g.drawString("行数: " + totalLine, 500, 430);

}



private void paintNextOne(Graphics g) {

    Cell[] cells = nextOne.cells;

    for (Cell cell : cells) {

        int x = cell.getCol() * CELL_SIZE + 370;

        int y = cell.getRow() * CELL_SIZE + 25;

        g.drawImage(cell.getImage(), x, y, null);

    }

}



private void paintCurrentOne(Graphics g) {

    Cell[] cells = currentOne.cells;

    for (Cell cell : cells) {

        int x = cell.getCol() * CELL_SIZE;

        int y = cell.getRow() * CELL_SIZE;

        g.drawImage(cell.getImage(), x, y, null);

    }

}



private void paintWall(Graphics g) {

    for (int i = 0; i < wall.length; i++) {

        for (int j = 0; j < wall[i].length; j++) {

            int x = j * CELL_SIZE;

            int y = i * CELL_SIZE;

            Cell cell = wall[i][j];

            //判断是否有小方块

            if (cell == null) {

                g.drawRect(x, y, CELL_SIZE, CELL_SIZE);

            } else {

                g.drawImage(cell.getImage(), x, y, null);

            }

        }

    }

}



//判断是否出界

public boolean outOFBounds() {

    Cell[] cells = currentOne.cells;

    for (Cell cell : cells) {

        int col = cell.getCol();

        int row = cell.getRow();

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

更多JVM面试整理:

    }

}



private void paintWall(Graphics g) {

    for (int i = 0; i < wall.length; i++) {

        for (int j = 0; j < wall[i].length; j++) {

            int x = j * CELL_SIZE;

            int y = i * CELL_SIZE;

            Cell cell = wall[i][j];

            //判断是否有小方块

            if (cell == null) {

                g.drawRect(x, y, CELL_SIZE, CELL_SIZE);

            } else {

                g.drawImage(cell.getImage(), x, y, null);

            }

        }

    }

}



//判断是否出界

public boolean outOFBounds() {

    Cell[] cells = currentOne.cells;

    for (Cell cell : cells) {

        int col = cell.getCol();

        int row = cell.getRow();

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

[外链图片转存中…(img-5SDxT0sx-1714359147926)]

更多JVM面试整理:

[外链图片转存中…(img-0vevX5cV-1714359147927)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值