用不同的类实现一个贪吃蛇游戏,包含测试类
时间: 2024-03-24 17:40:23 浏览: 23
好的,我可以为您提供一个简单的实现。以下是一个基于 Java 的贪吃蛇游戏,包含 Snake 类和测试类:
Snake 类:
```java
import java.awt.Point;
import java.util.ArrayList;
import java.util.Random;
public class Snake {
// 游戏区域的宽度和高度
private final int width;
private final int height;
// 贪吃蛇的身体
private ArrayList<Point> body;
// 贪吃蛇的当前方向
private Direction direction;
// 食物的位置
private Point food;
// 随机数生成器
private Random random;
// 游戏是否结束
private boolean gameOver;
// 枚举表示方向
private enum Direction {
UP, DOWN, LEFT, RIGHT;
}
public Snake(int width, int height) {
this.width = width;
this.height = height;
body = new ArrayList<>();
body.add(new Point(width / 2, height / 2));
direction = Direction.RIGHT;
random = new Random();
generateFood();
}
public void move() {
// 根据当前方向移动贪吃蛇
Point head = body.get(0);
Point newHead = new Point(head.x, head.y);
switch (direction) {
case UP:
newHead.y--;
break;
case DOWN:
newHead.y++;
break;
case LEFT:
newHead.x--;
break;
case RIGHT:
newHead.x++;
break;
}
body.add(0, newHead);
// 如果贪吃蛇吃到了食物,重新生成食物
if (newHead.equals(food)) {
generateFood();
} else {
body.remove(body.size() - 1);
}
// 判断游戏是否结束
if (newHead.x < 0 || newHead.x >= width || newHead.y < 0 || newHead.y >= height) {
gameOver = true;
}
for (int i = 1; i < body.size(); i++) {
if (newHead.equals(body.get(i))) {
gameOver = true;
break;
}
}
}
public void setDirection(Direction direction) {
// 如果新的方向与当前方向相反,则不改变方向
if ((this.direction == Direction.UP && direction == Direction.DOWN) ||
(this.direction == Direction.DOWN && direction == Direction.UP) ||
(this.direction == Direction.LEFT && direction == Direction.RIGHT) ||
(this.direction == Direction.RIGHT && direction == Direction.LEFT)) {
return;
}
this.direction = direction;
}
public Point getFood() {
return food;
}
public ArrayList<Point> getBody() {
return body;
}
public boolean isGameOver() {
return gameOver;
}
private void generateFood() {
// 随机生成食物位置,不能与贪吃蛇重合
while (true) {
food = new Point(random.nextInt(width), random.nextInt(height));
boolean overlap = false;
for (Point p : body) {
if (food.equals(p)) {
overlap = true;
break;
}
}
if (!overlap) {
break;
}
}
}
}
```
测试类:
```java
public class SnakeGame {
public static void main(String[] args) {
// 创建游戏区域
int width = 20;
int height = 20;
char[][] board = new char[height][width];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
board[i][j] = ' ';
}
}
// 创建贪吃蛇
Snake snake = new Snake(width, height);
// 游戏循环
while (!snake.isGameOver()) {
// 渲染游戏区域
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
board[i][j] = ' ';
}
}
Point food = snake.getFood();
board[food.y][food.x] = '*';
for (Point p : snake.getBody()) {
board[p.y][p.x] = '#';
}
// 输出游戏区域
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
System.out.print(board[i][j]);
}
System.out.println();
}
// 处理用户输入
System.out.print("Enter direction (u/d/l/r): ");
String input = System.console().readLine().toLowerCase();
Snake.Direction direction = null;
if (input.equals("u")) {
direction = Snake.Direction.UP;
} else if (input.equals("d")) {
direction = Snake.Direction.DOWN;
} else if (input.equals("l")) {
direction = Snake.Direction.LEFT;
} else if (input.equals("r")) {
direction = Snake.Direction.RIGHT;
}
if (direction != null) {
snake.setDirection(direction);
}
// 移动贪吃蛇
snake.move();
}
System.out.println("Game over!");
}
}
```
这个实现并不完美,有一些可以改进的地方,例如可以使用面向对象的设计模式,将贪吃蛇的身体封装成一个类。但是这个实现可以作为一个简单的参考,帮助您了解如何实现一个贪吃蛇游戏。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)