353 贪吃蛇

本文介绍了如何设计一款贪吃蛇游戏。游戏在指定尺寸的屏幕上进行,初始时蛇位于左上角,长度为1。给定食物序列后,蛇每吃到一个食物,长度加1,得分也增加1。每次移动,需要检查蛇是否与自身或边界碰撞,以及是否吃到食物。文章提供了具体的游戏逻辑实现思路。
摘要由CSDN通过智能技术生成

题目描述:
请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 = 宽度 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值