21xrx.com
2024-11-05 19:00:47 Tuesday
登录
文章检索 我的文章 写文章
Java贪吃蛇游戏-简单代码实现
2023-06-16 11:17:15 深夜i     --     --
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`方法中判断蛇头是否触碰到边界或自身,以及是否吃到食物并增加蛇长度。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复