Java实现贪吃蛇游戏148


简介

贪吃蛇是一款经典的益智游戏,它考验玩家的策略和反应能力。本文将介绍如何使用Java编程语言编写贪吃蛇游戏,包括游戏逻辑、图形界面和输入处理。

游戏逻辑

贪吃蛇的游戏逻辑相对简单。玩家控制一条由许多方块组成的蛇。蛇只能朝四个方向(上、下、左、右)移动。当蛇吃到食物时,它会变长。当蛇撞到自身或游戏边界时,游戏结束。

以下代码实现了贪吃蛇的移动逻辑:```java
public void moveSnake() {
int newHeadX = headX + dx;
int newHeadY = headY + dy;

if (newHeadX < 0 || newHeadX >= width || newHeadY < 0 || newHeadY >= height) {
// 蛇撞到边界,游戏结束
gameOver = true;
} else if (newHeadX == foodX && newHeadY == foodY) {
// 蛇吃到食物,增长并生成新的食物
(new Point(headX, headY));
headX = newHeadX;
headY = newHeadY;
generateFood();
} else {
// 蛇正常移动
(new Point(headX, headY));
headX = newHeadX;
headY = newHeadY;
(0);
}
}
```

图形界面

为了在屏幕上显示贪吃蛇,我们需要创建一个图形界面。可以使用Java Swing库或JavaFX库来实现这一点。以下代码使用Java Swing创建了一个简单的图形界面:```java
public SnakePanel() {
setPreferredSize(new Dimension(width * DOT_SIZE, height * DOT_SIZE));
setBackground();
addKeyListener(this);
setFocusable(true);
}
```

输入处理

玩家通过键盘输入来控制贪吃蛇的移动。以下代码处理键盘输入:```java
@Override
public void keyPressed(KeyEvent e) {
int key = ();

switch (key) {
case KeyEvent.VK_UP:
if (dy != 1) {
dx = 0;
dy = -1;
}
break;
case KeyEvent.VK_DOWN:
if (dy != -1) {
dx = 0;
dy = 1;
}
break;
case KeyEvent.VK_LEFT:
if (dx != 1) {
dx = -1;
dy = 0;
}
break;
case KeyEvent.VK_RIGHT:
if (dx != -1) {
dx = 1;
dy = 0;
}
break;
}
}
```

完整代码

以下是一个完整的Java贪吃蛇游戏代码:```java
import .*;
import .*;
import .*;
public class Snake extends JFrame implements ActionListener, KeyListener {
private static final int WIDTH = 30;
private static final int HEIGHT = 30;
private static final int DOT_SIZE = 10;
private JPanel snakePanel;
private Timer timer;
private int dx = 1;
private int dy = 0;
private int foodX;
private int foodY;
private boolean gameOver = false;
private LinkedList tail = new LinkedList();
public Snake() {
setTitle("贪吃蛇");
setSize(WIDTH * DOT_SIZE, HEIGHT * DOT_SIZE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
snakePanel = new SnakePanel();
add(snakePanel);
addKeyListener(this);
timer = new Timer(100, this);
();
startGame();
}
private void startGame() {
(new Point(WIDTH / 2, HEIGHT / 2));
generateFood();
}
private void moveSnake() {
int newHeadX = headX + dx;
int newHeadY = headY + dy;

if (newHeadX < 0 || newHeadX >= width || newHeadY < 0 || newHeadY >= height) {
// 蛇撞到边界,游戏结束
gameOver = true;
} else if (newHeadX == foodX && newHeadY == foodY) {
// 蛇吃到食物,增长并生成新的食物
(new Point(headX, headY));
headX = newHeadX;
headY = newHeadY;
generateFood();
} else {
// 蛇正常移动
(new Point(headX, headY));
headX = newHeadX;
headY = newHeadY;
(0);
}
}
private void generateFood() {
foodX = (int)(() * WIDTH);
foodY = (int)(() * HEIGHT);
}
@Override
public void actionPerformed(ActionEvent e) {
if (!gameOver) {
moveSnake();
();
}
}
@Override
public void keyPressed(KeyEvent e) {
int key = ();

switch (key) {
case KeyEvent.VK_UP:
if (dy != 1) {
dx = 0;
dy = -1;
}
break;
case KeyEvent.VK_DOWN:
if (dy != -1) {
dx = 0;
dy = 1;
}
break;
case KeyEvent.VK_LEFT:
if (dx != 1) {
dx = -1;
dy = 0;
}
break;
case KeyEvent.VK_RIGHT:
if (dx != -1) {
dx = 1;
dy = 0;
}
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
private class SnakePanel extends JPanel {
public void paintComponent(Graphics g) {
(g);
();
for (Point point : tail) {
(point.x * DOT_SIZE, point.y * DOT_SIZE, DOT_SIZE, DOT_SIZE);
}
();
(foodX * DOT_SIZE, foodY * DOT_SIZE, DOT_SIZE, DOT_SIZE);
}
}
public static void main(String[] args) {
(() -> {
Snake snake = new Snake();
(true);
});
}
}
```

2024-10-23


上一篇:方法内部类:在 Java 中提升代码可重用性和可扩展性

下一篇:Java 贪吃蛇代码:打造经典街机游戏