21xrx.com
2025-03-31 02:04:16 Monday
文章检索 我的文章 写文章
Java贪吃蛇游戏-简单代码实现
2023-06-16 11:17:15 深夜i     6     0
Java 贪吃蛇 游戏开发

贪吃蛇游戏是老少皆宜的益智游戏,也是Java学习中的经典案例。在这篇文章中,我们将使用Java语言编写一个简单的贪吃蛇游戏,展示基本的游戏制作思路和代码实现过程。

实现思路:

1. 初始化游戏界面,设置蛇的起始位置、大小以及食物的位置。

2. 监听用户键盘输入操作,根据用户输入调整蛇的移动方向。

3. 每次移动时,判断蛇头是否触碰到边界或自身,如果是则游戏结束,否则检查是否吃到了食物,如果是则增加蛇的长度,重新生成食物位置,如果不是则正常移动。

4. 循环执行上述操作,直到游戏结束。

代码实现:

为了让代码简单易懂,我们使用Swing框架实现游戏界面,并采用二维数组记录蛇和食物的位置。完整代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class Snake extends JFrame implements KeyListener {
  private final int ROW_COUNT = 30;  // 游戏面板行数
  private final int COL_COUNT = 30;  // 游戏面板列数
  private JPanel jPanel;            // 游戏面板
  private final int BLOCK_SIZE = 20// 单个方块的大小
  private int[][] block = new int[ROW_COUNT][COL_COUNT];  // 记录每个方块的状态
  private int foodRow, foodCol;  // 食物位置
  private int snakeLength = 3// 蛇的初始长度
  private int snakeRow = ROW_COUNT / 2, snakeCol = COL_COUNT / 2// 蛇头的初始位置
  private boolean gameOver = false// 游戏结束标志
  public Snake() {
    setTitle("贪吃蛇游戏");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jPanel = new JPanel() {
      @Override
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, COL_COUNT * BLOCK_SIZE, ROW_COUNT * BLOCK_SIZE);  // 绘制游戏背景
        // 绘制方块
        for (int i = 0; i < ROW_COUNT; i++) {
          for (int j = 0; j < COL_COUNT; j++) {
            if (block[i][j] == 1) {   // 蛇身
              g.setColor(Color.BLACK);
              g.fillRect(j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
            } else if (block[i][j] == 2) {   // 食物
              g.setColor(Color.RED);
              g.fillOval(j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
            }
          }
        }
      }
    };
    jPanel.setPreferredSize(new Dimension(COL_COUNT * BLOCK_SIZE, ROW_COUNT * BLOCK_SIZE));
    add(jPanel);
    addKeyListener(this);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
    initGame();
  }
  // 初始化游戏
  private void initGame() {
    for (int i = 0; i < ROW_COUNT; i++) {
      for (int j = 0; j < COL_COUNT; j++) {
        block[i][j] = 0;
      }
    }
    // 初始化蛇的位置
    for (int i = 0; i < snakeLength; i++) {
      block[snakeRow][snakeCol - i] = 1;
    }
    // 随机生成食物位置
    Random random = new Random();
    foodRow = random.nextInt(ROW_COUNT);
    foodCol = random.nextInt(COL_COUNT);
    block[foodRow][foodCol] = 2;
    jPanel.repaint();
    gameOver = false;
  }
  // 给蛇增加长度
  private void grow() {
    snakeLength++;
    jPanel.repaint();
  }
  // 移动蛇
  private void move(int newRow, int newCol) {
    // 判断是否到达边界
    if (newRow < 0 || newRow >= ROW_COUNT || newCol < 0 || newCol >= COL_COUNT)
      gameOver = true;
      return;
    
    // 判断是否吃到食物
    if (block[newRow][newCol] == 2) {
      grow();
      // 重新生成食物位置
      Random random = new Random();
      foodRow = random.nextInt(ROW_COUNT);
      foodCol = random.nextInt(COL_COUNT);
      while (block[foodRow][foodCol] != 0) {
        foodRow = random.nextInt(ROW_COUNT);
        foodCol = random.nextInt(COL_COUNT);
      }
      block[foodRow][foodCol] = 2;
    } else {
      // 移动蛇的身体
      for (int i = 0; i < ROW_COUNT; i++) {
        for (int j = 0; j < COL_COUNT; j++) {
          if (block[i][j] == 1) {
            block[i][j] = 0;
            if (i == snakeRow && j == snakeCol)
              gameOver = true;
              return;
            
          }
        }
      }
      // 移动蛇头
      snakeRow = newRow;
      snakeCol = newCol;
    }
    block[snakeRow][snakeCol] = 1;
    jPanel.repaint();
  }
  @Override
  public void keyPressed(KeyEvent e) {
    if (gameOver)
      return;
    
    switch (e.getKeyCode()) {
      case KeyEvent.VK_UP:
        move(snakeRow - 1, snakeCol);
        break;
      case KeyEvent.VK_DOWN:
        move(snakeRow + 1, snakeCol);
        break;
      case KeyEvent.VK_LEFT:
        move(snakeRow, snakeCol - 1);
        break;
      case KeyEvent.VK_RIGHT:
        move(snakeRow, snakeCol + 1);
        break;
    }
  }
  @Override
  public void keyTyped(KeyEvent e)
  
  @Override
  public void keyReleased(KeyEvent e)
  
  public static void main(String[] args) {
    new Snake();
  }
}

代码说明:

1. 使用`JPanel`类作为游戏面板,重写`paintComponent`方法绘制游戏界面。

2. 使用二维数组`block`记录每个方块的状态,0代表空白,1代表蛇身,2代表食物。

3. 采用`keyPressed`方法监听用户键盘输入,通过判断用户输入方向调用`move`方法移动蛇。

4. 在`move`方法中判断蛇头是否触碰到边界或自身,以及是否吃到食物并增加蛇长度。

  
  

评论区