写一个基于Java的贪吃蛇游戏的代码
时间: 2024-04-30 20:19:22 浏览: 82
以下是一个基于Java的贪吃蛇游戏的代码示例:
```java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SnakeGame extends JPanel implements Runnable, KeyListener {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 500, HEIGHT = 500;
private Thread thread;
private boolean running = false;
private LinkedList<Point> snake;
private Point food;
private int dx = 0, dy = 0;
private boolean gameOver = false;
public SnakeGame() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
snake = new LinkedList<Point>();
snake.add(new Point(10, 10));
snake.add(new Point(9, 10));
snake.add(new Point(8, 10));
food = new Point((int) (Math.random() * (WIDTH / 10)), (int) (Math.random() * (HEIGHT / 10)));
}
public void start() {
running = true;
thread = new Thread(this);
thread.start();
}
public void stop() {
running = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void run() {
while (running) {
update();
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void update() {
if (gameOver) {
return;
}
Point head = snake.peekFirst();
Point newHead = new Point(head.x + dx, head.y + dy);
if (newHead.x < 0 || newHead.x >= WIDTH / 10 || newHead.y < 0 || newHead.y >= HEIGHT / 10) {
gameOver = true;
} else if (snake.contains(newHead)) {
gameOver = true;
} else if (newHead.equals(food)) {
snake.addFirst(newHead);
food.setLocation((int) (Math.random() * (WIDTH / 10)), (int) (Math.random() * (HEIGHT / 10)));
} else {
snake.removeLast();
snake.addFirst(newHead);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (gameOver) {
g.setColor(Color.WHITE);
g.drawString("Game Over", WIDTH / 2 - 30, HEIGHT / 2);
} else {
g.setColor(Color.GREEN);
for (Point p : snake) {
g.fillRect(p.x * 10, p.y * 10, 10, 10);
}
g.setColor(Color.RED);
g.fillRect(food.x * 10, food.y * 10, 10, 10);
}
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = -1;
dy = 0;
} else if (key == KeyEvent.VK_RIGHT) {
dx = 1;
dy = 0;
} else if (key == KeyEvent.VK_UP) {
dx = 0;
dy = -1;
} else if (key == KeyEvent.VK_DOWN) {
dx = 0;
dy = 1;
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public static void main(String[] args) {
JFrame frame = new JFrame("Snake Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SnakeGame game = new SnakeGame();
frame.getContentPane().add(game);
frame.pack();
frame.setVisible(true);
game.start();
}
}
```
这个游戏使用Java Swing库进行编写,包含了游戏的主逻辑、绘制逻辑和键盘事件处理。在这个游戏中,贪吃蛇的运动由一个由点组成的链表表示,每一帧更新时根据键盘方向键的输入来更新贪吃蛇的位置,同时也检测是否吃到了食物或者是否碰到了边界或者自己的身体。如果游戏结束,会在屏幕中央显示“Game Over”的提示。