小鸟游菜花 2024-06-02 19:20 采纳率: 86.5%
浏览 3

贪吃蛇QT c++实现

我想要将(":/image/tuzi.png")图片作为蛇头
(":/image/tuzi_shen.png")作为蛇身
(":/image/xfood.png")作为随机生成的食物,用QTc++实现一个贪吃蛇游戏,蛇头吃到食物蛇身加一,初始蛇为一个蛇头两个蛇身,食物随机生成,.h和.cpp该怎么写

  • 写回答

4条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    以下是一个使用QT C++实现的贪吃蛇游戏的.h和.cpp文件的示例代码:

    snake.h:

    #ifndef SNAKE_H
    #define SNAKE_H
    
    #include <QMainWindow>
    #include <QKeyEvent>
    #include <QTimer>
    #include <QPainter>
    
    class Snake : public QMainWindow
    {
        Q_OBJECT
    
    public:
        Snake(QWidget *parent = nullptr);
        ~Snake();
    
    protected:
        void paintEvent(QPaintEvent *event);
        void keyPressEvent(QKeyEvent *event);
        void timerEvent(QTimerEvent *event);
    
    private:
        enum Direction { Up, Down, Left, Right };
    
        int timerId;
        Direction direction;
        QPoint head;
        QList<QPoint> body;
        QPoint food;
    
        void generateFood();
        bool checkCollision();
    };
    
    #endif // SNAKE_H
    

    snake.cpp:

    #include "snake.h"
    
    Snake::Snake(QWidget *parent)
        : QMainWindow(parent)
    {
        setFixedSize(400, 400);
        direction = Direction::Right;
        head = QPoint(10, 10);
        body.append(QPoint(9, 10));
        body.append(QPoint(8, 10));
        generateFood();
    
        timerId = startTimer(100); // 设置定时器,每100ms触发一次定时器事件
    }
    
    Snake::~Snake()
    {
    }
    
    void Snake::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.fillRect(rect(), Qt::black);
    
        // 绘制蛇头
        painter.setBrush(Qt::red);
        painter.drawEllipse(head.x() * 20, head.y() * 20, 20, 20);
    
        // 绘制蛇身
        painter.setBrush(Qt::blue);
        for (int i = 0; i < body.size(); i++) {
            painter.drawEllipse(body.at(i).x() * 20, body.at(i).y() * 20, 20, 20);
        }
    
        // 绘制食物
        painter.setBrush(Qt::green);
        painter.drawEllipse(food.x() * 20, food.y() * 20, 20, 20);
    }
    
    void Snake::keyPressEvent(QKeyEvent *event)
    {
        switch (event->key()) {
        case Qt::Key_Up:
            if (direction != Direction::Down)
                direction = Direction::Up;
            break;
        case Qt::Key_Down:
            if (direction != Direction::Up)
                direction = Direction::Down;
            break;
        case Qt::Key_Left:
            if (direction != Direction::Right)
                direction = Direction::Left;
            break;
        case Qt::Key_Right:
            if (direction != Direction::Left)
                direction = Direction::Right;
            break;
        default:
            QMainWindow::keyPressEvent(event);
            break;
        }
    }
    
    void Snake::timerEvent(QTimerEvent *event)
    {
        // 移动蛇身
        for (int i = body.size() - 1; i > 0; i--) {
            body[i] = body[i - 1];
        }
        body[0] = head;
    
        // 移动蛇头
        switch (direction) {
        case Direction::Up:
            head.setY(head.y() - 1);
            break;
        case Direction::Down:
            head.setY(head.y() + 1);
            break;
        case Direction::Left:
            head.setX(head.x() - 1);
            break;
        case Direction::Right:
            head.setX(head.x() + 1);
            break;
        }
    
        // 检查是否吃到食物
        if (head == food) {
            body.append(body.last());
            generateFood();
        }
    
        // 检查是否碰撞
        if (checkCollision()) {
            killTimer(timerId);
        }
    
        update();
    }
    
    void Snake::generateFood()
    {
        int x = qrand() % (width() / 20);
        int y = qrand() % (height() / 20);
        food = QPoint(x, y);
    }
    
    bool Snake::checkCollision()
    {
        // 检查是否碰到边界
        if (head.x() < 0 || head.x() >= width() / 20 ||
            head.y() < 0 || head.y() >= height() / 20) {
            return true;
        }
    
        // 检查是否碰到身体
        for (int i = 1; i < body.size(); i++) {
            if (head == body.at(i))
                return true;
        }
    
        return false;
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日

悬赏问题

  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题