题目描述:
请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 = 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏,可以 点击这里 在线试玩。
起初时,蛇在左上角的 (0, 0) 位置,身体长度为 1 个单位。
你将会被给出一个 (行, 列) 形式的食物位置序列。当蛇吃到食物时,身子的长度会增加 1 个单位,得分也会 +1。
食物不会同时出现,会按列表的顺序逐一显示在屏幕上。比方讲,第一个食物被蛇吃掉后,第二个食物才会出现。
当一个食物在屏幕上出现时,它被保证不能出现在被蛇身体占据的格子里。
对于每个 move() 操作,你需要返回当前得分或 -1(表示蛇与自己身体或墙相撞,意味游戏结束)。
示例:
给定 width = 3, height = 2, 食物序列为 food = [[1,2],[0,1]]。
Snake snake = new Snake(width, height, food);
初始时,蛇的位置在 (0,0) 且第一个食物在 (1,2)。
|S| | |
| | |F|
snake.move(“R”); -> 函数返回 0
| |S| |
| | |F|
snake.move(“D”); -> 函数返回 0
| | | |
| |S|F|
snake.move(“R”); -> 函数返回 1 (蛇吃掉了第一个食物,同时第二个食物出现在位置 (0,1))
| |F| |
| |S|S|
snake.move(“U”); -> 函数返回 1
| |F|S|
| | |S|
snake.move(“L”); -> 函数返回 2 (蛇吃掉了第二个食物)
| |S|S|
| | |S|
snake.move(“U”); -> 函数返回 -1 (蛇与边界相撞,游戏结束)
方法1:
主要思路:
(1)使用deque顺序存储蛇的身体所占的空间,使用set存储蛇的身体各个位置,便于判断是否会与自己碰撞的情形,使用变量index标识现在吃到第几个食物了,同时作为返回的当前分数值(已经吃过的食物的数量);
(2)随后,每次移动,根据输入的方向改变当前蛇的头结点的位置,判断新的位置是否与边界碰撞;
(3)若没有,则接着判断新的位置是否能够是当前食物的位置,若是,则增加分数(既索引),增加蛇的身体的长度,既将新的位置插入到deque和set中,若不是当前食物的位置,则调整蛇的身体,既删除最后一个位置,插入新的位置,并在插入前判断新的位置是否会和身体碰撞;
class SnakeGame {
public:
/** Initialize your data structure here.
@param width - screen width
@param height - screen height
@param food - A list of food positions
E.g food = [[1,1], [1,0]] means the first food is positioned at [1,1], the second is at [1,0]. */
int w,h;//边界
vector<vector<int>> f;//食物
deque<vector<int>> q;//顺序存储蛇的身体
set<vector<int>