21xrx.com
2025-03-24 06:16:29 Monday
文章检索 我的文章 写文章
贪吃蛇游戏 - Java实现与设计
2023-06-18 06:39:03 深夜i     9     0
Java 贪吃蛇 游戏

贪吃蛇游戏是一款经典的游戏,现在我们可以通过Java来实现这个游戏。在这篇文章中,我们将详细介绍如何实现一个基于Java的贪吃蛇游戏。

Java是一种流行的编程语言,它非常适合用于游戏的开发。在这个项目中,我们将使用Java Swing框架来构建游戏的界面,并通过Java代码来实现游戏的逻辑。

在这个项目中,我们需要实现贪吃蛇的移动、食物的生成以及判断游戏是否结束等功能。在Java中,我们可以使用数组来存储贪吃蛇的身体部分,使用随机数生成食物的位置,并使用计时器来控制游戏的速度。

下面是一份示例代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SnakeGame extends JPanel implements ActionListener {
  private final int BOX_WIDTH = 25;
  private final int BOX_HEIGHT = 25;
  private final int BOARD_WIDTH = 20;
  private final int BOARD_HEIGHT = 20;
  private final int DELAY = 90;
  private int score = 0;
  private Timer timer;
  private boolean gameOver = false;
  private int[] x = new int[BOARD_WIDTH * BOARD_HEIGHT];
  private int[] y = new int[BOARD_WIDTH * BOARD_HEIGHT];
  private int foodX;
  private int foodY;
  private int bodyLength = 3;
  private SnakeGame() {
    initGame();
  }
  private void initGame() {
    addKeyListener(new TAdapter());
    setBackground(Color.WHITE);
    setPreferredSize(new Dimension(BOARD_WIDTH * BOX_WIDTH, BOARD_HEIGHT * BOX_HEIGHT));
    setFocusable(true);
    generateFood();
    timer = new Timer(DELAY, this);
    timer.start();
  }
  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawGame(g);
  }
  private void drawGame(Graphics g) {
    if (gameOver) {
      gameOver(g);
    } else {
      drawSnake(g);
      drawFood(g);
    }
    Toolkit.getDefaultToolkit().sync();
  }
  private void gameOver(Graphics g) {
    String msg = "Game Over";
    Font small = new Font("Helvetica", Font.BOLD, 14);
    FontMetrics metr = getFontMetrics(small);
    g.setColor(Color.BLACK);
    g.setFont(small);
    g.drawString(msg, (BOARD_WIDTH * BOX_WIDTH - metr.stringWidth(msg)) / 2, BOARD_HEIGHT * BOX_HEIGHT / 2);
  }
  private void drawSnake(Graphics g) {
    for (int i = 0; i < bodyLength; i++) {
      if (i == 0) {
        g.setColor(Color.BLACK);
        g.fillRect(x[i], y[i], BOX_WIDTH, BOX_HEIGHT);
      } else {
        g.setColor(Color.GRAY);
        g.fillRect(x[i], y[i], BOX_WIDTH, BOX_HEIGHT);
      }
    }
  }
  private void drawFood(Graphics g) {
    g.setColor(Color.RED);
    g.fillRect(foodX, foodY, BOX_WIDTH, BOX_HEIGHT);
  }
  private void move() {
    for (int i = bodyLength; i > 0; i--) {
      x[i] = x[(i - 1)];
      y[i] = y[(i - 1)];
    }
    x[0] += BOX_WIDTH;
    if (x[0] >= BOARD_WIDTH * BOX_WIDTH) {
      x[0] = 0;
    }
    checkFood();
    checkCollision();
  }
  private void checkFood() {
    if (x[0] == foodX && y[0] == foodY) {
      bodyLength++;
      score += 10;
      generateFood();
    }
  }
  private void checkCollision() {
    for (int i = bodyLength; i > 0; i--) {
      if (x[0] == x[i] && y[0] == y[i])
        gameOver = true;
      
    }
    if (y[0] >= BOARD_HEIGHT * BOX_HEIGHT)
      gameOver = true;
    
    if (x[0] < 0)
      gameOver = true;
    
    if (y[0] < 0)
      gameOver = true;
    
    if (gameOver) {
      timer.stop();
    }
  }
  private void generateFood() {
    int random = (int) (Math.random() * (BOARD_WIDTH * BOARD_HEIGHT - bodyLength));
    foodX = (random % BOARD_WIDTH) * BOX_WIDTH;
    foodY = (random / BOARD_WIDTH) * BOX_HEIGHT;
  }
  @Override
  public void actionPerformed(ActionEvent e) {
    if (!gameOver) {
      move();
    }
    repaint();
  }
  private class TAdapter extends KeyAdapter {
    @Override
    public void keyPressed(KeyEvent e) {
      int key = e.getKeyCode();
      if (key == KeyEvent.VK_LEFT) {
        if (bodyLength > 1 && x[0] != x[1]) {
          x[0] -= BOX_WIDTH;
        }
      }
      if (key == KeyEvent.VK_RIGHT) {
        if (bodyLength > 1 && x[0] != x[1]) {
          x[0] += BOX_WIDTH;
        }
      }
      if (key == KeyEvent.VK_UP) {
        if (bodyLength > 1 && y[0] != y[1]) {
          y[0] -= BOX_HEIGHT;
        }
      }
      if (key == KeyEvent.VK_DOWN) {
        if (bodyLength > 1 && y[0] != y[1]) {
          y[0] += BOX_HEIGHT;
        }
      }
    }
  }
  public static void main(String[] args) {
    JFrame frame = new JFrame("Snake Game");
    frame.getContentPane().add(new SnakeGame());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }
}

在这份代码中,我们定义了几个常量,包括每个方块的大小、游戏界面的大小、移动的速度等。我们使用数组来存储贪吃蛇的身体部分,使用一个计时器来控制游戏的运行速度。

我们使用Java Swing框架来构建游戏的界面,并使用Graphics类来绘制游戏的元素。我们通过一些函数来实现贪吃蛇的移动、食物的生成以及判断游戏是否结束等功能,从而实现了贪吃蛇游戏的基本逻辑。

如果你也想在Java中实现一个贪吃蛇游戏,那么这份示例代码可以作为一个很好的起点。你可以根据你的需要进行修改与扩展,从而实现属于自己的贪吃蛇游戏。

  
  

评论区