基于Java实现简单贪吃蛇游戏

  

基于Java实现简单贪吃蛇游戏攻略

介绍

贪吃蛇作为一款经典的小游戏,一直受到人们的喜爱,同时也成为了学习编程的入门练手项目。通过这个项目,我们可以了解到Java中关于图形界面、面向对象编程等方面的知识。

实现步骤

  1. 设计UI界面:在Java中,常见的UI界面框架有Swing和JavaFX,本项目采用Swing实现。

  2. 编写贪吃蛇的逻辑:蛇的移动、食物的随机生成、判断蛇是否吃掉食物等。这些逻辑可以封装在一个Snake类里面。

  3. 监听键盘事件:监听键盘的上下左右按键,让蛇能够响应玩家的操作。

  4. 界面重绘:蛇移动、吃到食物、或者撞墙都会触发界面的重绘,让玩家可以看到最新的游戏状态。

  5. 检测游戏结束:当蛇的头部碰到身体或者墙壁时,游戏结束,弹出“游戏结束”的提示框。

  6. 实现分数统计:每吃掉一个食物加一分,可以在UI界面上显示分数。

代码示例

Snake类

public class Snake {
    private ArrayList<Point> body; // 蛇的身体,存储坐标

    public Snake(Point initHead, int initLength) {
        body = new ArrayList<Point>();
        for (int i = 0; i < initLength; i++) {
            body.add(new Point(initHead.x - i, initHead.y));
        }
    }

    public void move(Point head, boolean eatFood) {
        if (eatFood) {
            body.add(0, head);
        } else {
            body.add(0, head);
            body.remove(body.size() - 1);
        }
    }

    public boolean checkCollision(Point head) {
        for (Point bodyPart : body) {
            if (head.equals(bodyPart)) {
                return true;
            }
        }
        return false;
    }

    public ArrayList<Point> getBody() {
        return body;
    }
}

键盘事件监听

frame.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_LEFT:
                direction = Direction.LEFT;
                break;
            case KeyEvent.VK_RIGHT:
                direction = Direction.RIGHT;
                break;
            case KeyEvent.VK_UP:
                direction = Direction.UP;
                break;
            case KeyEvent.VK_DOWN:
                direction = Direction.DOWN;
                break;
            default:
                break;
        }
    }
});

示例说明

示例1:生成随机食物

public Point generateFood() {
    Random random = new Random();
    int x = random.nextInt(GAME_WIDTH);
    int y = random.nextInt(GAME_HEIGHT);
    return new Point(x, y);
}

这段代码中,我们使用Java内置的Random类生成随机数,然后将其封装为一个Point对象返回。这个方法可以用于在游戏开始时生成初始食物,以及在蛇吃到食物之后生成新的食物。

示例2:更新界面

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawSnake(g);
    drawFood(g);
    drawScore(g);

    Toolkit.getDefaultToolkit().sync();
}

private void drawSnake(Graphics g) {
    g.setColor(Color.GREEN);
    for (Point bodyPart : snake.getBody()) {
        g.fillRect(bodyPart.x * CELL_SIZE, bodyPart.y * CELL_SIZE, CELL_SIZE, CELL_SIZE);
    }
}

private void drawFood(Graphics g) {
    g.setColor(Color.RED);
    g.fillOval(food.x * CELL_SIZE, food.y * CELL_SIZE, CELL_SIZE, CELL_SIZE);
}

private void drawScore(Graphics g) {
    g.setColor(Color.BLACK);
    g.drawString("Score: " + score, 10, GAME_HEIGHT * CELL_SIZE + 20);
}

在这段代码中,我们首先调用超类的paintComponent方法清空原有的画面,然后依次绘制蛇、食物以及分数。最后调用Toolkit类的sync方法,防止绘制过程中出现撕裂或闪烁的问题。

相关文章