下面是一个简单的伪代码示例,
展示了如何在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窗口,其中包含可以移动的贪吃蛇和随机产生的食物。您可以使用键盘方向键控制蛇的移动,吃掉食物后蛇将增加一个身体块。请注意,此示例仅涵盖了概念和基础功能,您可以根据需要添加更多的玩家交互、游戏逻辑等等。