1. C/C++初学者的困惑
很多C/C++初学者,自学了很多年,考了很多证,开发水平仍停留在控制台小项目上,就业更是遥遥无期,进退两难。
C/C++的最强大的地方,当然是开发高性能框架、高性能服务器:
基于C++框架Tenserflow实现的阿尔法狗:
千万级并发服务器Nginx:
在问鼎C/C++技术之巅之前,有没有一个技术方向,让C/C++小白就能够快速高薪就业的呢?
小白高薪研发的最佳方向,莫不过于C++ Qt开发,已经广泛应用于物联网、嵌入式、音视频、图形处理!
来自研发一线的岗位召唤:
让我们从零起步,90分钟开发一个Qt版的贪食蛇,快速掌握C++ Qt开发!
【私信小编,获取视频版的完整教程】
1. 创建项目
选择模板
选择编译器:
准备游戏素材
添加数据成员
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