Lintcode 3656 · Design Snake Game (贪吃蛇,设计题)

本文描述了一个设计矩阵蛇游戏类的任务,包括创建SnakeGame类,构造函数处理矩阵大小和初始食物位置,move()函数实现蛇的移动、吃食物和判断游戏结束。关键数据结构如deque用于存储蛇的身体,set用于防止蛇吃自己。

3656 · Design Snake Game
Medium

Description
In this question, you need to design a snake game class SnakeGame.

Snake Game: There exists a snake in a matrix. Food will appear continuously in this matrix, and we need to control the snake to move continuously (through the four directions of up, down, left, and right) to eat the food. after eating food. The length of the snake will increase by one bit. At the same time, the game score will be increased by 1. Afterwards, the next food will be refreshed (the position occupied by the snake will not be refreshed). If the snake hits the wall or eats its own body while eating the food, the game is over.

The function’s constructor receives the following parameters:

width: the number of columns in the snake matrix interface
height: the number of rows in the snake matrix interface
foods: The coordinates of the food, represented by a two-dimensional array, where the first element of each array is the row coordinate, and the second element is the column coordinate
In addition, you need to complete the move() function, which will receive a string indicating the direction. Indicates that the snake needs to move one space in this direction. You need to return the Snake score after the move (initial score is 0). Returns -1 if the game ends after the snake moves.

Only $39.9 for the “Twitter Comment System Project Practice” within a limited time of 7 days!

WeChat Notes Twitter for more information(WeChat ID jiuzhang104)

Example
Example 1

Input:

3
2
[[1, 2], [0, 0]]
[“r”, “d”, “r”, “u”, “l”, “l”, “l”]
Output:

[0, 0, 1, 1, 1, 1, 2, -1]
Explanation:

The initial state is as follows:

s | |
| | f
Among them, s represents the snake, and f represents the current food.

After action “r”:

| s |
| | f

After eating the first food:

f | |
| s |s

After eating the second food:

s | s | s
| |
Example 2

Input:

3
2
[[0, 1], [1, 1], [1, 0], [0, 2]]
[“r”, “d”, “l”, “u”, “r”, “r”, “d”, “l”, “u”]
Output:

[1, 2, 3, 3, 3, 4, 4, 4, -1]

解法1:蛇的身体用deque。另外再用set判重(如果吃到自己的身体的话)。
食物可以用queue,因为是按先后顺序一个一个出现。
为什么蛇的身体用deque呢,因为吃到食物要pop_tail,而在游走的过程中要pop_front。

class SnakeGame {
public:
    SnakeGame(int width, int height, vector<vector<int>>& foods) : width(width), height(height) {
        for (auto food : foods) {
            foodQueue.push({food[0], food[1]});
        }
        currPos = {0, 0}; //initial position (0,0)
        score = 0;
    }

    /**
     * @param direction: the direction of the move
     * @return: the score after the move
     */
    int move(string &direction) {
        int n = direction.size();
        switch (direction[0]) {
            case 'r':
                currPos.second++;
                break;
            case 'l':
                currPos.second--;
                break;
            case 'd':
                currPos.first++;
                break;
            case 'u':
                currPos.first--;
                break;
        }
        if (currPos.first < 0 || currPos.first >= height) return -1;
        if (currPos.second < 0 || currPos.second >= width) return -1;
        if (bodySet.find(currPos) != bodySet.end()) return -1;
        bodySet.insert(currPos);
        bodyQueue.push_back(currPos);
        if (!foodQueue.empty() && currPos == foodQueue.front()) {
            foodQueue.pop();
            score++;
        } else {
            bodySet.erase(bodyQueue.front());
            bodyQueue.pop_front();
        }
       
        return score;
    }
private:
    queue<pair<int, int>> foodQueue;
    int width, height;
    set<pair<int, int>> bodySet; // snake body set
    deque<pair<int, int>> bodyQueue; // snake body queue
    pair<int, int> currPos;
    int score;
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值