21xrx.com
2024-05-19 17:35:19 Sunday
登录
文章检索 我的文章 写文章
贪吃蛇游戏 - Java实现与设计
2023-06-18 06:39:03 深夜i     --     --
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中实现一个贪吃蛇游戏,那么这份示例代码可以作为一个很好的起点。你可以根据你的需要进行修改与扩展,从而实现属于自己的贪吃蛇游戏。

  
  

评论区

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