「值得收藏」小白高薪捷径-Qt开发

1. C/C++初学者的困惑

很多C/C++初学者,自学了很多年,考了很多证,开发水平仍停留在控制台小项目上,就业更是遥遥无期,进退两难。

「值得收藏」小白高薪捷径-Qt开发

C/C++的最强大的地方,当然是开发高性能框架、高性能服务器:

基于C++框架Tenserflow实现的阿尔法狗:

「值得收藏」小白高薪捷径-Qt开发

千万级并发服务器Nginx:

「值得收藏」小白高薪捷径-Qt开发

在问鼎C/C++技术之巅之前,有没有一个技术方向,让C/C++小白就能够快速高薪就业的呢?

扫描二维码关注公众号,回复: 11316402 查看本文章

「值得收藏」小白高薪捷径-Qt开发

小白高薪研发的最佳方向,莫不过于C++ Qt开发,已经广泛应用于物联网、嵌入式、音视频、图形处理!

来自研发一线的岗位召唤:

「值得收藏」小白高薪捷径-Qt开发

「值得收藏」小白高薪捷径-Qt开发

「值得收藏」小白高薪捷径-Qt开发

让我们从零起步,90分钟开发一个Qt版的贪食蛇,快速掌握C++ Qt开发!

「值得收藏」小白高薪捷径-Qt开发

视频教程:https://www.bilibili.com/video/BV1aa4y1v7PK


1. 创建项目

「值得收藏」小白高薪捷径-Qt开发

选择模板

「值得收藏」小白高薪捷径-Qt开发

选择编译器:

「值得收藏」小白高薪捷径-Qt开发

准备游戏素材

「值得收藏」小白高薪捷径-Qt开发

添加数据成员

enum Direct{Left,Right,Up,Down};

    QList<QRectF> snake;//贪吃蛇本体

    int snakeNodeWidth = 20;
    int snakeNodeHeight = 20;
    QTimer *timer;

    int time = 150;
    int moveFlage = Up;
    bool gameStart = false;

    QRectF rewardNode;

添加方法的声明

protected:
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *);

    void addTop();
    void addDown();
    void addLeft();
    void addRight();

    void deleteLast();
    bool checkContact();
    void addNewReward();

添加槽函数

protected  slots:
    void timeOut();

构造函数

#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    resize(600, 368);

    snake.append(QRectF(300,180,snakeNodeWidth,snakeNodeHeight));
    addTop();
    addTop();

    timer = new QTimer;
    connect(timer, SIGNAL(timeout()),this,SLOT(timeOut()));

    addNewReward();
}

按键时间处理

#include <QKeyEvent>

void Widget::keyPressEvent(QKeyEvent *event)
{
    switch(event->key()){
    case Qt::Key_Up:
        if(moveFlage != Down){
            moveFlage = Up;
        }
        break;
    case Qt::Key_Down:
        if(moveFlage != Up){
            moveFlage = Down;
        }
        break;
    case Qt::Key_Right:
        if(moveFlage != Left){
            moveFlage = Right;
        }
        break;
    case Qt::Key_Left:
        if(moveFlage != Right){
            moveFlage = Left;
        }
        break;
    case Qt::Key_Space:
        if(!gameStart){
            timer->start(time);
            gameStart = true;
        }else {
            timer->stop();
            gameStart = false;
        }
        break;
    default:
        break;
    }
}

超时事件处理

void Widget::timeOut()
{
    int count = 1;

    if (snake.at(0).intersects(rewardNode)) {
        addNewReward();
        count++;
    }

    while (count--) {
        switch (moveFlage) {
        case Up:
            addTop();
            break;
        case Down:
            addDown();
            break;
        case Right:
            addRight();
            break;
        case Left:
            addLeft();
            break;
        default:
            break;
        }
    }

    deleteLast();
    update();
}

添加新方块

void Widget::addNewReward() {
    rewardNode = QRectF(
        qrand()%(this->width()/20)*20,
        qrand()%(this->height()/20)*20,
        snakeNodeWidth,
        snakeNodeWidth);
}

各个方向的运动实现

//向上移动
void Widget::addTop()
{
    QPointF leftTop;
    QPointF rightBotom;
    if(snake.at(0).y()-snakeNodeHeight < 0){
        leftTop = QPointF(
                    snake.at(0).x(),                 //左上角x坐标
                    this->height()-snakeNodeHeight); //左上角y坐标
        rightBotom = QPointF(
                    snake.at(0).x()+snakeNodeWidth,
                    this->height());
    }else{
        leftTop = QPointF(snake.at(0).x(),
                    snake.at(0).y() - snakeNodeHeight);
        rightBotom = snake.at(0).topRight();
    }

    snake.insert(0, QRectF(leftTop, rightBotom));
}

//向下移动
void Widget::addDown()
{
    QPointF leftTop;
    QPointF rightBotom;

    if(snake.at(0).y()+snakeNodeHeight*2 > this->height()){
        leftTop = QPointF(snake.at(0).x(), 0);
        rightBotom = QPointF(snake.at(0).x()+snakeNodeWidth, snakeNodeHeight);
    }else{
        leftTop = snake.at(0).bottomLeft();
        rightBotom = snake.at(0).bottomRight() + QPointF(0, snakeNodeHeight);
    }

    snake.insert(0, QRectF(leftTop, rightBotom));
}
//向左移动
void Widget::addLeft()
{
    QPointF leftTop;
    QPointF rightBotom;

    if(snake.at(0).x()-snakeNodeWidth < 0){
        leftTop = QPointF(this->width() -snakeNodeWidth, snake[0].y());
    }else{
        leftTop = snake[0].topLeft() - QPointF(snakeNodeWidth, 0);
    }

    rightBotom = leftTop + QPointF(snakeNodeWidth, snakeNodeHeight);
    snake.insert(0, QRectF(leftTop, rightBotom));
}
//向右移动
void Widget::addRight()
{
    QPointF leftTop;
    QPointF rightBotom;

    if(snake.at(0).x()+snakeNodeWidth*2 > this->width()){
        leftTop = QPointF(0, snake[0].y());
    }else{
        leftTop = snake[0].topRight();
    }

    rightBotom = leftTop + QPointF(snakeNodeWidth, snakeNodeHeight);
    snake.insert(0, QRectF(leftTop, rightBotom));
}

//删除结尾数据
void Widget::deleteLast()
{
    snake.removeLast();
}

绘制贪食蛇

#include <QPainter>
#include <QPen>
#include <QBrush>

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPen pen;  //画笔,用于绘制轮廓
    QBrush brush;  //画刷,用于填充

    QPixmap pix;
    pix.load("D:/tmp/snake.jpg");
    painter.drawPixmap(0,0, 600, 368,pix);

    //反锯齿
    painter.setRenderHint(QPainter::Antialiasing);

    pen.setColor(Qt::black);
    brush.setColor(Qt::darkMagenta);
    brush.setStyle(Qt::SolidPattern);
    painter.setPen(pen);
    painter.setBrush(brush);

    for(int i=0; i<snake.length(); i++){
        painter.drawRect(snake.at(i));
    }

    brush.setColor(Qt::red);
    painter.setBrush(brush);
    painter.drawEllipse(rewardNode);

    pen.setColor(Qt::black);
    painter.setPen(pen);
    QFont font("微软雅黑", 12,QFont::ExtraLight,false);
    painter.setFont(font);
    painter.drawText(560, 32, QString("%1").arg(snake.length()));

    if(checkContact()){
        QFont font("方正舒体",30,QFont::ExtraLight,false);
        painter.setFont(font);
        painter.drawText((this->width()-300)/2,(this->height()-30)/2,QString("GAME OVER!"));
        timer->stop();
    }

    QWidget::paintEvent(event);
}

失败检测

//判断蛇头是否和蛇身相撞, 以及蛇身和蛇身相撞
bool Widget::checkContact()
{
    for(int i=0; i<snake.length();i++) {
        for(int j=i+1; j<snake.length(); j++){
            if(snake.at(i) == snake.at(j)){
                return true;
            }
        }
    }

    return false;
}

游戏结束效果

「值得收藏」小白高薪捷径-Qt开发


关注我获取更多项目源码,资料,笔记,录制视频~

可以进群:782648055

更多视频教程:https://space.bilibili.com/478717458/video

猜你喜欢

转载自blog.csdn.net/xiangxin1030/article/details/106603474