返回

用java做一个简单的游戏:用Java做一个简单的贪吃蛇游戏

来源:网络   作者:   日期:2025-11-11 14:59:00  

项目准备

在开始编写代码之前,我们需要确保开发环境已经配置好,Java开发工具包(JDK)和一个集成开发环境(IDE),如Eclipse或IntelliJ IDEA,都是必需的,我们还需要了解一些基本的Java语法和Swing库的基本用法。

用java做一个简单的游戏:用Java做一个简单的贪吃蛇游戏


游戏设计思路

贪吃蛇游戏是一个经典的小游戏,玩家通过键盘控制蛇的移动方向,吃掉食物后蛇会变长,如果蛇撞到墙壁或自己的身体,游戏结束,我们将通过以下步骤实现这个游戏:

用java做一个简单的游戏:用Java做一个简单的贪吃蛇游戏

  1. 创建游戏窗口:使用Swing库创建一个窗口,作为游戏的主界面。
  2. 绘制游戏元素:包括蛇的身体、食物和游戏边界。
  3. 控制蛇的移动:通过键盘事件控制蛇的移动方向。
  4. 碰撞检测:检测蛇是否吃到食物,或者是否撞到边界或自身。
  5. 游戏循环:使用定时器实现游戏的持续运行。

代码实现

下面是一个简单的贪吃蛇游戏的Java代码实现,代码分为几个部分:主类、蛇类、食物类和游戏逻辑。

主类(SnakeGame.java)

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class SnakeGame extends JPanel implements ActionListener {
    private final int B_WIDTH = 600;
    private final int B_HEIGHT = 400;
    private final int DOT_SIZE = 20;
    private final int GAME_SPEED = 150;
    private Image food;
    private Timer timer;
    private Snake snake;
    private FoodClass foodObj;
    private boolean direction;
    private boolean running;
    public SnakeGame() {
        init();
    }
    private void init() {
        setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
        setBackground(Color.BLACK);
        food = createFoodImage();
        snake = new Snake();
        foodObj = new FoodClass();
        direction = true;
        running = true;
        timer = new Timer(GAME_SPEED, this);
        timer.start();
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_UP:
                        if (direction) snake.setDirection(Snake.UP);
                        break;
                    case KeyEvent.VK_DOWN:
                        if (direction) snake.setDirection(Snake.DOWN);
                        break;
                    case KeyEvent.VK_LEFT:
                        if (direction) snake.setDirection(Snake.LEFT);
                        break;
                    case KeyEvent.VK_RIGHT:
                        if (direction) snake.setDirection(Snake.RIGHT);
                        break;
                }
            }
        });
    }
    private Image createFoodImage() {
        // 创建食物图像,这里简化为一个红色方块
        Image foodImage = new ImageIcon("food.png").getImage();
        return foodImage;
    }
    public void actionPerformed(ActionEvent e) {
        if (running) {
            snake.move();
            if (snake.checkCollision()) {
                running = false;
                timer.stop();
                JOptionPane.showMessageDialog(SnakeGame.this, "Game Over!");
            } else {
                if (snake.checkEat(foodObj)) {
                    snake.grow();
                    foodObj.randomizeLocation(snake.getPoints());
                }
                repaint();
            }
        }
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 绘制蛇
        for (int i = 0; i < snake.getPoints().size(); i++) {
            Point p = snake.getPoints().get(i);
            g.fillRect((int) p.getX(), (int) p.getY(), DOT_SIZE, DOT_SIZE);
        }
        // 绘制食物
        g.drawImage(food, foodObj.getX(), foodObj.getY(), this);
    }
    // 其他辅助方法,如游戏重置等
}

蛇类(Snake.java)

import java.util.ArrayList;
import java.awt.Point;
public class Snake {
    private ArrayList<Point> points;
    private int direction;
    public Snake() {
        points = new ArrayList<>();
        // 初始化蛇的位置
        points.add(new Point(100, 100));
        points.add(new Point(80, 100));
        points.add(new Point(60, 100));
        direction = 1; // 1表示向右
    }
    public void move() {
        Point head = points.get(0);
        Point newHead = new Point();
        switch (direction) {
            case 1: // 右
                newHead.x = head.x + 20;
                newHead.y = head.y;
                break;
            case 2: // 左
                newHead.x = head.x - 20;
                newHead.y = head.y;
                break;
            case 3: // 下
                newHead.x = head.x;
                newHead.y = head.y + 20;
                break;
            case 4: // 上
                newHead.x = head.x;
                newHead.y = head.y - 20;
                break;
        }
        points.add(0, newHead);
        points.remove(points.size() - 1);
    }
    public void setDirection(int direction) {
        this.direction = direction;
    }
    public boolean checkCollision() {
        Point head = points.get(0);
        // 检查是否撞墙
        if (head.x < 0 || head.x >= 600 || head.y < 0 || head.y >= 400) {
            return true;
        }
        // 检查是否撞到自己
        for (int i = 1; i < points.size(); i++) {
            if (head.x == points.get(i).x && head.y == points.get(i).y) {
                return true;
            }
        }
        return false;
    }
    public boolean checkEat(FoodClass food) {
        Point head = points.get(0);
        if (head.x == food.getX() && head.y == food.getY()) {
            return true;
        }
        return false;
    }
    public ArrayList<Point> getPoints() {
        return points;
    }
}

食物类(FoodClass.java)

public class FoodClass {
    private int x, y;
    public FoodClass() {
        x = (int) (Math.random() * 550);
        y = (int) (Math.random() * 350);
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void randomizeLocation(ArrayList<Point> snakePoints) {
        do {
            x = (int) (Math.random() * 550);
            y = (int) (Math.random() * 350);
        } while (isOverlapping(snakePoints));
    }
    private boolean isOverlapping(ArrayList<Point> snakePoints) {
        for (Point p : snakePoints) {
            if (p.x == x && p.y == y) {
                return true;
            }
        }
        return false;
    }
}

运行游戏

将上述代码保存为相应的文件(SnakeGame.javaSnake.javaFoodClass.java),然后编译并运行SnakeGame.java,游戏窗口将会打开,使用键盘的方向键控制蛇的移动,当蛇吃到食物时,身体会变长,如果蛇撞到墙壁或自己的身体,游戏结束。


扩展与改进

这个简单的贪吃蛇游戏可以进一步扩展,例如添加分数显示、增加难度级别、添加音效等,通过这些扩展,你可以更好地理解Java编程和游戏开发的基本原理。

分类: 编程
责任编辑: 今题网
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。

相关文章:

文章已关闭评论!