qt开发并发服务器_「值得收藏」小白高薪捷径-Qt开发

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

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

5fb9413d1cca51c5a3dedd2b9667899f.png

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

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

0ba348b8053e2129dc18d20b38403f49.png

千万级并发服务器Nginx:

7c317a3d19d1f5e0e1ab176b28300df2.png

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

37ad1cb9ef0c563ff034a9dec7782a75.png

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

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

786f964e91a62e6b58302df02c563255.png
bcb62093fe5f474dd4addef36bc66109.png
1805d6bb902840ebc796c44e3f8d1c98.png
990a9f8898cf3e61a67e3ad29c7e8d04.png

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

87d849d0642f771d56bb33abee92d379.gif

私信小编,获取视频版的完整教程


1. 创建项目

21e93f1ebfca60fc28a643c9ec6807bf.png

选择模板

d3a36108a473e69daf1434a7c5e275f0.png

选择编译器:

6d0efc71599d19f487c83f33ad9b9d31.png

准备游戏素材

ea650c5a65715a3822e74b83d94d4720.png

添加数据成员

enum Direct{Left,Right,Up,Down};    QList 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 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 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 #include #include 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; iwidth()-300)/2,(this->height()-30)/2,QString("GAME OVER!"));        timer->stop();    }    QWidget::paintEvent(event);}

失败检测

//判断蛇头是否和蛇身相撞, 以及蛇身和蛇身相撞bool Widget::checkContact(){    for(int i=0; i

游戏结束效果

85d5219c9ed31a14118c446a6efb9ca9.png

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

还有13个企业级开发项目等着你(点击下方了解更多)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值