java可暂停的贪吃蛇代码
时间: 2023-11-15 07:04:15 浏览: 38
以下是一个基于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.LinkedList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SnakeGame extends JPanel implements KeyListener, ActionListener {
private static final long serialVersionUID = 1L;
// 游戏界面大小
private static final int WIDTH = 600;
private static final int HEIGHT = 600;
// 每个方格大小
private static final int SIZE = 20;
// 游戏界面上的行数和列数
private static final int ROWS = HEIGHT / SIZE;
private static final int COLS = WIDTH / SIZE;
// 初始化蛇的长度和位置
private static final int INIT_LENGTH = 3;
private static final int INIT_X = COLS / 2;
private static final int INIT_Y = ROWS / 2;
// 定义蛇和食物的颜色
private static final Color SNAKE_COLOR = Color.GREEN;
private static final Color FOOD_COLOR = Color.RED;
// 定义蛇和食物的位置
private LinkedList<Point> snake = new LinkedList<Point>();
private Point food = new Point();
// 定义蛇的移动方向
private static final int LEFT = 0;
private static final int RIGHT = 1;
private static final int UP = 2;
private static final int DOWN = 3;
private int direction = LEFT;
// 定义定时器和暂停状态
private Timer timer = new Timer(100, this);
private boolean paused = false;
public SnakeGame() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
// 初始化蛇的位置
for (int i = 0; i < INIT_LENGTH; i++) {
snake.add(new Point(INIT_X + i, INIT_Y));
}
// 初始化食物的位置
newFood();
}
// 生成新的食物位置
private void newFood() {
Random random = new Random();
int x = random.nextInt(COLS);
int y = random.nextInt(ROWS);
food.setLocation(x, y);
// 如果新的食物位置和蛇的位置重合,则重新生成
for (Point p : snake) {
if (p.equals(food)) {
newFood();
break;
}
}
}
// 画蛇和食物
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 画蛇
g.setColor(SNAKE_COLOR);
for (Point p : snake) {
g.fillRect(p.x * SIZE, p.y * SIZE, SIZE, SIZE);
}
// 画食物
g.setColor(FOOD_COLOR);
g.fillRect(food.x * SIZE, food.y * SIZE, SIZE, SIZE);
}
// 移动蛇
private void move() {
// 计算蛇头的新位置
Point head = snake.getFirst();
Point newHead = new Point(head);
switch (direction) {
case LEFT:
newHead.x--;
break;
case RIGHT:
newHead.x++;
break;
case UP:
newHead.y--;
break;
case DOWN:
newHead.y++;
break;
}
// 如果蛇头碰到边界或自己的身体,则游戏结束
if (newHead.x < 0 || newHead.x >= COLS || newHead.y < 0 || newHead.y >= ROWS || snake.contains(newHead)) {
timer.stop();
System.out.println("Game Over!");
return;
}
// 如果蛇头碰到食物,则增加蛇的长度,并生成新的食物
if (newHead.equals(food)) {
snake.addFirst(newHead);
newFood();
} else {
// 否则,将蛇尾移除,并将蛇头插入到新位置
snake.removeLast();
snake.addFirst(newHead);
}
// 重绘游戏界面
repaint();
}
// 处理键盘事件
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch (keyCode) {
case KeyEvent.VK_LEFT:
if (direction != RIGHT) {
direction = LEFT;
}
break;
case KeyEvent.VK_RIGHT:
if (direction != LEFT) {
direction = RIGHT;
}
break;
case KeyEvent.VK_UP:
if (direction != DOWN) {
direction = UP;
}
break;
case KeyEvent.VK_DOWN:
if (direction != UP) {
direction = DOWN;
}
break;
case KeyEvent.VK_SPACE:
if (paused) {
timer.start();
paused = false;
} else {
timer.stop();
paused = true;
}
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
// 定时器事件
@Override
public void actionPerformed(ActionEvent e) {
move();
}
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);
}
}
```
在这个示例代码中,我们使用了Java Swing框架来创建游戏窗口,并使用键盘事件来控制蛇的移动方向和暂停游戏。定时器事件则用于控制蛇的移动和游戏的运行。你可以根据需要对代码进行修改和扩展。