用java写一个可运行的贪吃蛇程序
时间: 2024-06-11 14:04:07 浏览: 8
这里提供一个简单的贪吃蛇程序示例:
```java
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.Random;
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 = 600;
private static final int HEIGHT = 600;
private static final int DOT_SIZE = 10;
private static final int MAX_DOTS = (WIDTH * HEIGHT) / (DOT_SIZE * DOT_SIZE);
private static final int RAND_POS = WIDTH / DOT_SIZE;
private static final int DELAY = 140;
private LinkedList<Point> snake;
private Point food;
private int dots;
private boolean inGame;
private boolean leftDirection;
private boolean rightDirection;
private boolean upDirection;
private boolean downDirection;
public SnakeGame() {
initGame();
}
private void initGame() {
setBackground(Color.black);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
addKeyListener(this);
snake = new LinkedList<Point>();
dots = 3;
inGame = true;
leftDirection = false;
rightDirection = true;
upDirection = false;
downDirection = false;
for (int i = 0; i < dots; i++) {
snake.add(new Point((WIDTH / 2) - i * DOT_SIZE, HEIGHT / 2));
}
generateFood();
}
private void generateFood() {
Random rand = new Random();
int x = rand.nextInt(RAND_POS) * DOT_SIZE;
int y = rand.nextInt(RAND_POS) * DOT_SIZE;
food = new Point(x, y);
}
private void move() {
Point head = snake.getFirst();
int x = (int) head.getX();
int y = (int) head.getY();
if (leftDirection) {
x -= DOT_SIZE;
} else if (rightDirection) {
x += DOT_SIZE;
} else if (upDirection) {
y -= DOT_SIZE;
} else if (downDirection) {
y += DOT_SIZE;
}
Point newHead = new Point(x, y);
if (snake.contains(newHead)) {
inGame = false;
return;
}
snake.addFirst(newHead);
if (newHead.equals(food)) {
dots++;
generateFood();
} else {
snake.removeLast();
}
checkCollision();
}
private void checkCollision() {
if (snake.getFirst().getX() < 0
|| snake.getFirst().getX() >= WIDTH
|| snake.getFirst().getY() < 0
|| snake.getFirst().getY() >= HEIGHT) {
inGame = false;
}
}
@Override
public void run() {
while (inGame) {
move();
repaint();
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (inGame) {
g.setColor(Color.white);
g.fillOval(food.x, food.y, DOT_SIZE, DOT_SIZE);
g.setColor(Color.green);
for (Point p : snake) {
g.fillOval(p.x, p.y, DOT_SIZE, DOT_SIZE);
}
} else {
g.setColor(Color.white);
g.drawString("Game over!", WIDTH / 2 - 50, HEIGHT / 2);
}
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT && !rightDirection) {
leftDirection = true;
upDirection = false;
downDirection = false;
} else if (key == KeyEvent.VK_RIGHT && !leftDirection) {
rightDirection = true;
upDirection = false;
downDirection = false;
} else if (key == KeyEvent.VK_UP && !downDirection) {
upDirection = true;
leftDirection = false;
rightDirection = false;
} else if (key == KeyEvent.VK_DOWN && !upDirection) {
downDirection = true;
leftDirection = false;
rightDirection = false;
}
}
@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.setContentPane(new SnakeGame());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
new Thread((SnakeGame) frame.getContentPane()).start();
}
}
```
这个程序使用Java的Swing框架实现,主要包括以下几个部分:
1. 初始化游戏:设置背景颜色、大小、添加键盘监听器等,并初始化贪吃蛇和食物的位置。
2. 生成食物:随机生成食物的位置。
3. 移动贪吃蛇:根据当前方向移动贪吃蛇,并检查是否与边界或自身碰撞,如果有则游戏结束。
4. 检查碰撞:检查贪吃蛇的头部是否与边界碰撞。
5. 绘制画面:根据当前游戏状态绘制游戏画面。
6. 处理键盘事件:根据按键更新贪吃蛇的移动方向。
7. 启动游戏:创建JFrame窗口并启动游戏线程。
运行该程序,即可看到一个简单的贪吃蛇游戏了。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![java](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)