数据结构用jdk链表,队列,栈贪吃蛇代码
时间: 2023-08-15 07:40:17 浏览: 56
以下是使用 JDK 中的链表、队列和栈实现的贪吃蛇代码:
```java
import java.util.*;
public class SnakeGame {
private int width;
private int height;
private LinkedList<Point> snake;
private Point food;
private Random random = new Random();
public SnakeGame(int width, int height) {
this.width = width;
this.height = height;
snake = new LinkedList<>();
snake.add(new Point(width / 2, height / 2)); // 初始位置在中心
generateFood();
}
public void play() {
Scanner scanner = new Scanner(System.in);
while (true) {
printBoard();
System.out.print("请输入方向(w/a/s/d):");
String input = scanner.nextLine();
if (!move(input)) {
System.out.println("游戏结束!");
break;
}
}
scanner.close();
}
private void printBoard() {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
Point p = new Point(j, i);
if (snake.contains(p)) {
System.out.print("O");
} else if (p.equals(food)) {
System.out.print("*");
} else {
System.out.print(".");
}
}
System.out.println();
}
}
private boolean move(String direction) {
// 计算新位置
Point head = snake.getFirst();
int dx = 0, dy = 0;
switch (direction) {
case "w":
dy = -1;
break;
case "a":
dx = -1;
break;
case "s":
dy = 1;
break;
case "d":
dx = 1;
break;
}
Point newHead = new Point(head.x + dx, head.y + dy);
// 判断是否合法
if (newHead.x < 0 || newHead.x >= width || newHead.y < 0 || newHead.y >= height) {
return false; // 撞墙了
}
if (snake.contains(newHead)) {
return false; // 撞自己了
}
// 移动蛇
snake.addFirst(newHead);
if (newHead.equals(food)) {
generateFood();
} else {
snake.removeLast();
}
return true;
}
private void generateFood() {
while (true) {
int x = random.nextInt(width);
int y = random.nextInt(height);
food = new Point(x, y);
if (!snake.contains(food)) {
break;
}
}
}
public static void main(String[] args) {
SnakeGame game = new SnakeGame(20, 10);
game.play();
}
}
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Point)) {
return false;
}
Point p = (Point) obj;
return x == p.x && y == p.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
```
其中,`LinkedList` 用于存储蛇的身体,`Point` 表示二维坐标,`Random` 用于生成食物的位置。在 `move` 方法中,使用了栈的思想,将蛇头插入链表的头部,将蛇尾从链表的尾部删除,以实现蛇的移动。在 `generateFood` 方法中,使用了队列的思想,不断生成随机坐标,直到生成的坐标不在蛇的身体中,以实现随机生成食物的位置。