利用java写一个类使用户可以用键盘控制贪吃蛇的移动
时间: 2024-01-04 10:03:21 浏览: 66
好的,下面提供一个简单的示例代码,实现用户用键盘控制贪吃蛇的移动。
首先,我们需要设计一个Snake类,表示贪吃蛇的状态和行为。
```java
import java.awt.Point;
import java.util.ArrayList;
public class Snake {
private int direction; // 蛇当前的移动方向,0表示上,1表示右,2表示下,3表示左
private ArrayList<Point> body; // 蛇的身体,用点表示
public Snake(int x, int y) {
direction = 1; // 初始方向向右
body = new ArrayList<Point>();
body.add(new Point(x, y)); // 初始化时只有一个点
}
public void move() {
// 根据方向移动蛇头
Point head = body.get(0);
switch (direction) {
case 0: // 向上
head.y--;
break;
case 1: // 向右
head.x++;
break;
case 2: // 向下
head.y++;
break;
case 3: // 向左
head.x--;
break;
default:
break;
}
// 把新的蛇头加入到身体的最前面
body.add(0, head);
// 去掉尾部,即把身体的最后一个点删除
body.remove(body.size() - 1);
}
public void setDirection(int direction) {
// 防止蛇掉头走,例如当前向右,不能立即向左转
if (Math.abs(this.direction - direction) != 2) {
this.direction = direction;
}
}
public ArrayList<Point> getBody() {
return body;
}
}
```
然后,在主程序中,我们需要实现一个继承自JFrame的SnakeFrame类,来显示贪吃蛇的界面,并监听用户的键盘事件来控制贪吃蛇的移动。
```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.Random;
import javax.swing.JFrame;
public class SnakeFrame extends JFrame implements KeyListener {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 600; // 界面宽度
private static final int HEIGHT = 600; // 界面高度
private static final int ROWS = 30; // 界面行数
private static final int COLS = 30; // 界面列数
private static final int BLOCK_SIZE = WIDTH / COLS; // 每个格子的大小
private Snake snake; // 贪吃蛇
private Point food; // 食物的位置
public SnakeFrame() {
setTitle("贪吃蛇");
setSize(WIDTH, HEIGHT);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addKeyListener(this);
snake = new Snake(COLS / 2, ROWS / 2); // 初始化蛇的位置
createFood(); // 随机生成食物
}
@Override
public void paint(Graphics g) {
// 清空界面
g.clearRect(0, 0, WIDTH, HEIGHT);
// 绘制贪吃蛇
g.setColor(Color.GREEN);
for (Point p : snake.getBody()) {
g.fillRect(p.x * BLOCK_SIZE, p.y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
// 绘制食物
g.setColor(Color.RED);
g.fillOval(food.x * BLOCK_SIZE, food.y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP: // 按上键,向上移动
snake.setDirection(0);
break;
case KeyEvent.VK_RIGHT: // 按右键,向右移动
snake.setDirection(1);
break;
case KeyEvent.VK_DOWN: // 按下键,向下移动
snake.setDirection(2);
break;
case KeyEvent.VK_LEFT: // 按左键,向左移动
snake.setDirection(3);
break;
default:
break;
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
public void createFood() {
// 随机生成食物的位置
Random rand = new Random();
int x = rand.nextInt(COLS);
int y = rand.nextInt(ROWS);
food = new Point(x, y);
}
public void run() {
while (true) {
// 移动贪吃蛇
snake.move();
// 判断是否吃到食物
if (snake.getBody().get(0).equals(food)) {
snake.getBody().add(food); // 把食物加入到身体中
createFood(); // 重新生成食物
}
// 判断是否游戏结束
Point head = snake.getBody().get(0);
if (head.x < 0 || head.x >= COLS || head.y < 0 || head.y >= ROWS) {
System.out.println("游戏结束!");
break;
}
for (int i = 1; i < snake.getBody().size(); i++) {
if (head.equals(snake.getBody().get(i))) {
System.out.println("游戏结束!");
return;
}
}
// 刷新界面
repaint();
// 等待一段时间
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
SnakeFrame frame = new SnakeFrame();
frame.setVisible(true);
frame.run();
}
}
```
这个示例程序只是一个简单的演示,你可以根据需要进行修改和扩展,例如增加计分功能、加入音效等。注意,这个示例程序没有考虑贪吃蛇撞墙或咬到自己的情况,你需要根据具体需求进行处理。
阅读全文