用qt程序构建一个贪吃蛇游戏的代码
时间: 2023-12-08 11:06:32 浏览: 27
以下是使用Qt编写的贪吃蛇游戏代码示例:
```cpp
#include <QMainWindow>
#include <QPainter>
#include <QKeyEvent>
#include <QTimer>
class SnakeGame : public QMainWindow {
Q_OBJECT
public:
SnakeGame(QWidget *parent = nullptr) : QMainWindow(parent) {
setFixedSize(400, 400);
snake_.push_back({200, 200});
snake_.push_back({200, 210});
snake_.push_back({200, 220});
food_ = generateFood();
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(100);
}
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
painter.drawRect(0, 0, width(), height());
painter.setBrush(Qt::red);
painter.drawRect(food_.x(), food_.y(), 10, 10);
painter.setBrush(Qt::green);
for (const auto &pos : snake_) {
painter.drawRect(pos.x(), pos.y(), 10, 10);
}
}
void keyPressEvent(QKeyEvent *event) override {
if (event->key() == Qt::Key_Left && direction_ != Direction::Right) {
direction_ = Direction::Left;
} else if (event->key() == Qt::Key_Right && direction_ != Direction::Left) {
direction_ = Direction::Right;
} else if (event->key() == Qt::Key_Up && direction_ != Direction::Down) {
direction_ = Direction::Up;
} else if (event->key() == Qt::Key_Down && direction_ != Direction::Up) {
direction_ = Direction::Down;
}
}
private slots:
void update() {
QPoint head = snake_.front();
switch (direction_) {
case Direction::Left:
head.rx() -= 10;
break;
case Direction::Right:
head.rx() += 10;
break;
case Direction::Up:
head.ry() -= 10;
break;
case Direction::Down:
head.ry() += 10;
break;
}
if (head == food_) {
snake_.push_front(head);
food_ = generateFood();
} else {
snake_.pop_back();
if (std::find(snake_.begin(), snake_.end(), head) != snake_.end() ||
head.x() < 0 || head.x() > width() || head.y() < 0 || head.y() > height()) {
snake_.clear();
snake_.push_back({200, 200});
snake_.push_back({200, 210});
snake_.push_back({200, 220});
food_ = generateFood();
} else {
snake_.push_front(head);
}
}
update();
}
private:
enum class Direction { Left, Right, Up, Down };
QList<QPoint> snake_;
QPoint food_;
Direction direction_ = Direction::Up;
QPoint generateFood() {
int x = (qrand() % (width() / 10)) * 10;
int y = (qrand() % (height() / 10)) * 10;
return {x, y};
}
};
```
此代码使用Qt绘制了一个400x400像素的窗口,并在其中创建了一个贪吃蛇游戏。运行程序后,玩家可以通过方向键控制蛇的移动,吃到食物后蛇的长度会增加。如果蛇碰到了边界或自己的身体,则游戏会重新开始。