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
Python字符串查找与判断:从基础到高级的全方位指南
https://www.shuihudhg.cn/134118.html
C语言如何高效输出字符串“inc“?深度解析printf、puts及格式化输出
https://www.shuihudhg.cn/134117.html
PHP高效获取CSV文件行数:从小型文件到海量数据的最佳实践与性能优化
https://www.shuihudhg.cn/134116.html
C语言控制台图形输出:从入门到精通的ASCII艺术实践
https://www.shuihudhg.cn/134115.html
Python在Linux环境下的执行与自动化:从基础到高级实践
https://www.shuihudhg.cn/134114.html
热门文章
Java中数组赋值的全面指南
https://www.shuihudhg.cn/207.html
JavaScript 与 Java:二者有何异同?
https://www.shuihudhg.cn/6764.html
判断 Java 字符串中是否包含特定子字符串
https://www.shuihudhg.cn/3551.html
Java 字符串的切割:分而治之
https://www.shuihudhg.cn/6220.html
Java 输入代码:全面指南
https://www.shuihudhg.cn/1064.html