用java写一个贪吃蛇游戏可用键盘控制移动
时间: 2024-03-23 13:42:39 浏览: 16
好的,以下是一个简单的贪吃蛇游戏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.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SnakeGame extends JPanel implements KeyListener {
private static final long serialVersionUID = 1L;
private JFrame frame;
private ArrayList<Point> snake;
private Point food;
private int direction;
private int score;
private boolean gameOver;
private Random rand;
public SnakeGame() {
frame = new JFrame("Snake Game");
frame.add(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
frame.addKeyListener(this);
snake = new ArrayList<Point>();
snake.add(new Point(250, 250));
snake.add(new Point(240, 250));
snake.add(new Point(230, 250));
food = new Point(200, 200);
direction = KeyEvent.VK_RIGHT;
score = 0;
gameOver = false;
rand = new Random();
Thread gameThread = new Thread(new GameLoop());
gameThread.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!gameOver) {
g.setColor(Color.RED);
g.fillRect(food.x, food.y, 10, 10);
g.setColor(Color.BLACK);
for (Point p : snake) {
g.fillRect(p.x, p.y, 10, 10);
}
g.drawString("Score: " + score, 10, 20);
} else {
g.drawString("Game Over! Score: " + score, 200, 250);
}
}
public void move() {
Point head = snake.get(0);
switch (direction) {
case KeyEvent.VK_UP:
snake.add(0, new Point(head.x, head.y - 10));
break;
case KeyEvent.VK_DOWN:
snake.add(0, new Point(head.x, head.y + 10));
break;
case KeyEvent.VK_LEFT:
snake.add(0, new Point(head.x - 10, head.y));
break;
case KeyEvent.VK_RIGHT:
snake.add(0, new Point(head.x + 10, head.y));
break;
}
if (snake.get(0).equals(food)) {
food.setLocation(rand.nextInt(49) * 10, rand.nextInt(49) * 10);
score += 10;
} else {
snake.remove(snake.size() - 1);
}
if (snake.get(0).x < 0 || snake.get(0).x > 490 || snake.get(0).y < 0 || snake.get(0).y > 490) {
gameOver = true;
}
for (int i = 1; i < snake.size(); i++) {
if (snake.get(0).equals(snake.get(i))) {
gameOver = true;
}
}
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if ((keyCode == KeyEvent.VK_UP && direction != KeyEvent.VK_DOWN)
|| (keyCode == KeyEvent.VK_DOWN && direction != KeyEvent.VK_UP)
|| (keyCode == KeyEvent.VK_LEFT && direction != KeyEvent.VK_RIGHT)
|| (keyCode == KeyEvent.VK_RIGHT && direction != KeyEvent.VK_LEFT)) {
direction = keyCode;
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
private class GameLoop implements Runnable {
public void run() {
while (!gameOver) {
move();
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new SnakeGame();
}
}
```
这个代码示例中,我们通过继承JPanel类和实现KeyListener接口来创建了一个贪吃蛇游戏。通过调用JFrame的addKeyListener()方法,我们可以让JFrame监听键盘事件。在keyPressed()方法中,我们根据按下的键盘按键来改变蛇的方向。
游戏的主要逻辑在move()方法中实现,它负责计算蛇的新位置、是否吃到了食物、是否碰到了边界或蛇身等。在GameLoop中,我们通过线程循环调用move()方法,并且每次移动后都调用repaint()方法来重新绘制游戏界面。
这只是一个简单的贪吃蛇游戏实现,您可以根据需要进行修改和优化。