用c++写一个简单地2D我的世界贪吃蛇

下面是一个简单的伪代码示例,

展示了如何在C++中使用SFML库创建一个简单的贪吃蛇游戏。

#include <SFML/Graphics.hpp>
#include <vector>

const int TILE_SIZE = 20;
const int BOARD_WIDTH = 30;
const int BOARD_HEIGHT = 20;
const int WINDOW_WIDTH = TILE_SIZE * BOARD_WIDTH;
const int WINDOW_HEIGHT = TILE_SIZE * BOARD_HEIGHT;

enum class Direction {
    None,
    Up,
    Down,
    Left,
    Right
};

class Snake {
public:
    Snake(sf::Vector2i head_pos)
        : m_direction(Direction::None)
    {
        m_body.push_back(head_pos);
    }

    void setDirection(Direction dir) { m_direction = dir; }
    void move()
    {
        sf::Vector2i new_head_pos = m_body.front();

        switch (m_direction) {
        case Direction::Up:
            new_head_pos.y--;
            break;
        case Direction::Down:
            new_head_pos.y++;
            break;
        case Direction::Left:
            new_head_pos.x--;
            break;
        case Direction::Right:
            new_head_pos.x++;
            break;
        default:
            break;
        }

        m_body.insert(m_body.begin(), new_head_pos);
        m_body.pop_back();
    }

    void grow()
    {
        sf::Vector2i new_tail_pos = m_body.back();
        m_body.push_back(new_tail_pos);
    }

    const std::vector<sf::Vector2i>& getBody() const { return m_body; }

private:
    std::vector<sf::Vector2i> m_body;
    Direction m_direction;
};

class Food {
public:
    Food(sf::Vector2i pos) : m_position(pos) {}

    const sf::Vector2i& getPosition() const { return m_position; }

private:
    sf::Vector2i m_position;
};

class Game {
public:
    Game()
        : m_window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Snake")
        , m_snake(sf::Vector2i(BOARD_WIDTH / 2, BOARD_HEIGHT / 2))
        , m_food(sf::Vector2i(0, 0))
    {
        spawnFood();
    }

    void run()
    {
        while (m_window.isOpen()) {
            handleEvents();
            update();
            render();
        }
    }

private:
    void handleEvents()
    {
        sf::Event event;
        while (m_window.pollEvent(event)) {
            if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                m_window.close();

            if (event.type == sf::Event::KeyPressed) {
                switch (event.key.code) {
                case sf::Keyboard::Up:
                    m_snake.setDirection(Direction::Up);
                    break;
                case sf::Keyboard::Down:
                    m_snake.setDirection(Direction::Down);
                    break;
                case sf::Keyboard::Left:
                    m_snake.setDirection(Direction::Left);
                    break;
                case sf::Keyboard::Right:
                    m_snake.setDirection(Direction::Right);
                    break;
                default:
                    break;
                }
            }
        }
    }

    void update()
    {
        m_snake.move();

        if (m_snake.getBody().front().x < 0 ||
            m_snake.getBody().front().x >= BOARD_WIDTH ||
            m_snake.getBody().front().y < 0 ||
            m_snake.getBody().front().y >= BOARD_HEIGHT)
            m_window.close();

        if (m_snake.getBody().front() == m_food.getPosition()) {
            m_snake.grow();
            spawnFood();
        }
    }

    void render()
    {
        m_window.clear();

        // 绘制蛇
        for (auto& pos : m_snake.getBody()) {
            sf::RectangleShape rect(sf::Vector2f(TILE_SIZE, TILE_SIZE));
            rect.setFillColor(sf::Color::Green);
            rect.setPosition(pos.x * TILE_SIZE, pos.y * TILE_SIZE);
            m_window.draw(rect);
        }

        // 绘制食物
        sf::RectangleShape rect(sf::Vector2f(TILE_SIZE, TILE_SIZE));
        rect.setFillColor(sf::Color::Red);
        rect.setPosition(m_food.getPosition().x * TILE_SIZE, m_food.getPosition().y * TILE_SIZE);
        m_window.draw(rect);

        m_window.display();
    }

    void spawnFood()
    {
        bool intersects = true;
        while (intersects) {
            sf::Vector2i new_pos(rand() % BOARD_WIDTH, rand() % BOARD_HEIGHT);
            intersects = false;

            for (auto& pos : m_snake.getBody()) {
                if (pos == new_pos) {
                    intersects = true;
                    break;
                }
            }

            if (!intersects)
                m_food = Food(new_pos);
        }
    }

    sf::RenderWindow m_window;
    Snake m_snake;
    Food m_food;
};

int main()
{
    Game game;
    game.run();

    return 0;
}

此代码创建一个800x600窗口,其中包含可以移动的贪吃蛇和随机产生的食物。您可以使用键盘方向键控制蛇的移动,吃掉食物后蛇将增加一个身体块。请注意,此示例仅涵盖了概念和基础功能,您可以根据需要添加更多的玩家交互、游戏逻辑等等。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值