贪吃蛇游戏试玩:https://patorjk.com/games/snake/
问题描述
设计一个贪吃蛇游戏,要求实现以下功能:
- 初始化游戏:给定网格宽度、高度和食物位置序列
- 移动操作:根据指令(上、下、左、右)移动蛇头
- 规则:
- 蛇头碰到边界或自身身体时游戏结束(返回-1)
- 吃到食物时蛇身长度增加
- 未吃到食物时正常移动(蛇头前进,蛇尾收缩)
核心思路
- 网格坐标转换
- 使用一维坐标表示位置:
x + y * 宽度
- 简化位置计算和存储(0 表示 (0,0),1 表示 (1,0) 等)
- 使用一维坐标表示位置:
- 蛇身存储
- 使用队列(LinkedList)存储蛇身位置
- 队首(头部)是最早加入的位置(蛇尾)
- 队尾(尾部)是最新加入的位置(蛇头)
- 移动处理
- 根据方向更新蛇头坐标
- 边界检查:超出网格边界立即结束游戏
- 碰撞检测:通过位置队列判断是否撞到自身
- 食物机制
- 按顺序检查当前食物是否被吃
- 吃到食物:不移除蛇尾,蛇身增长
- 未吃到食物:移除蛇尾,保持长度
关键算法步骤
-
初始化
public SnakeGame(int width, int height, int[][] food) { this.W = width; // 网格宽度 this.H = height; // 网格高度 this.FOOD = food; // 食物序列 this.queue.offer(0); // 初始位置(0,0) }
-
移动操作
public int move(String direction) { // 1. 更新蛇头坐标 switch (direction.charAt(0)) { case 'U'