用java写一个好看的贪吃蛇游戏
时间: 2023-12-06 09:03:23 浏览: 69
用java写的贪吃蛇游戏
好的,我可以为您提供一些思路和代码示例。
首先,您需要了解贪吃蛇游戏的规则和逻辑,以便能够设计出好玩的游戏。
接下来,您可以使用Java Swing库来开发游戏界面和游戏逻辑。以下是一个简单的Java代码示例,它实现了一个基本的贪吃蛇游戏:
```java
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SnakeGame extends JPanel implements ActionListener, KeyListener {
private static final long serialVersionUID = 1L;
// 游戏区域大小
private static final int WIDTH = 600;
private static final int HEIGHT = 600;
// 游戏格子大小
private static final int CELL_SIZE = 20;
// 初始蛇的长度
private static final int INIT_SNAKE_LENGTH = 3;
// 游戏速度
private static final int GAME_SPEED = 100;
// 蛇的身体
private ArrayList<Point> snake;
// 食物的位置
private Point food;
// 游戏是否结束
private boolean gameOver = false;
// 游戏分数
private int score = 0;
// 游戏计时器
private Timer timer;
public SnakeGame() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
// 初始化蛇
snake = new ArrayList<Point>();
for (int i = 0; i < INIT_SNAKE_LENGTH; i++) {
snake.add(new Point(WIDTH/2, HEIGHT/2 + i * CELL_SIZE));
}
// 初始化食物
generateFood();
// 启动游戏计时器
timer = new Timer(GAME_SPEED, this);
timer.start();
}
private void generateFood() {
Random random = new Random();
int x = random.nextInt(WIDTH / CELL_SIZE) * CELL_SIZE;
int y = random.nextInt(HEIGHT / CELL_SIZE) * CELL_SIZE;
food = new Point(x, y);
}
private void moveSnake() {
// 获取蛇头和蛇尾
Point head = snake.get(0);
Point tail = snake.remove(snake.size() - 1);
// 计算新的蛇头位置
int dx = 0, dy = 0;
switch (direction) {
case KeyEvent.VK_LEFT:
dx = -CELL_SIZE;
break;
case KeyEvent.VK_RIGHT:
dx = CELL_SIZE;
break;
case KeyEvent.VK_UP:
dy = -CELL_SIZE;
break;
case KeyEvent.VK_DOWN:
dy = CELL_SIZE;
break;
}
Point newHead = new Point(head.x + dx, head.y + dy);
// 判断是否撞墙或撞到自己
if (newHead.x < 0 || newHead.x >= WIDTH || newHead.y < 0 || newHead.y >= HEIGHT || snake.contains(newHead)) {
gameOver = true;
return;
}
// 判断是否吃到食物
if (newHead.equals(food)) {
score++;
generateFood();
} else {
snake.remove(tail);
}
// 将新的蛇头加入蛇身
snake.add(0, newHead);
}
@Override
public void actionPerformed(ActionEvent e) {
moveSnake();
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 画出蛇
g.setColor(Color.GREEN);
for (Point p : snake) {
g.fillRect(p.x, p.y, CELL_SIZE, CELL_SIZE);
}
// 画出食物
g.setColor(Color.RED);
g.fillRect(food.x, food.y, CELL_SIZE, CELL_SIZE);
// 画出分数
g.setColor(Color.WHITE);
g.drawString("Score: " + score, 10, 20);
// 画出游戏结束提示
if (gameOver) {
g.setColor(Color.WHITE);
g.drawString("Game Over! Press Enter to Restart.", WIDTH/2 - 100, HEIGHT/2);
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER && gameOver) {
// 重新开始游戏
snake.clear();
for (int i = 0; i < INIT_SNAKE_LENGTH; i++) {
snake.add(new Point(WIDTH/2, HEIGHT/2 + i * CELL_SIZE));
}
direction = KeyEvent.VK_UP;
generateFood();
score = 0;
gameOver = false;
} else if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) {
// 改变蛇的移动方向
direction = e.getKeyCode();
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
public static void main(String[] args) {
JFrame frame = new JFrame("Snake Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.getContentPane().add(new SnakeGame());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
```
该示例代码中,我们使用Java Swing库来实现游戏界面,并使用键盘事件来控制蛇的移动方向。同时,我们还使用计时器来控制游戏的速度,并使用随机数来生成食物的位置。
当蛇撞墙或撞到自己的身体时,游戏结束。玩家可以按下回车键重新开始游戏。
希望这个代码示例能够帮助您实现一个好看的贪吃蛇游戏!
阅读全文