QT实现贪吃蛇
设备描述
1。Linux操作系统
2。QT5。5。1
关键点分析
1。贪吃蛇的身体用什么形式展现
2。当方向改变时,蛇身如何实现转向前进
3。如何记录蛇身的每一个坐标
4。如何判断游戏结束
实现步骤
1。首先有两种办法实现,第一:用QPushButton按键类,每个一个按键就是蛇的一部分身体,另外:用QPaintEvent绘图事件画出蛇的身体,个人认为用QPushButton实现比较简单粗暴,表面上看起来效果都一样。
2。之前在想这个问题的时候很头痛,进入了一个误区,一直在想蛇头可以根据转向而立刻改变,但是蛇尾该如何慢慢转变过去呢,蛇身每转一次就有一个转折点,后面的蛇身都需要根据这个转折点来转向,心想还需要记录每一个转折点地址。但是后面发现根本就没用这么复杂,只需要将蛇身的每一个点根据上一个点的坐标走,第一个蛇身点根据蛇头走就可以了。
3。由于我的蛇身每一个节点都是一个QPushButton对象,而这个类有一个获取坐标的函数geometry();和设置控件坐标的函数setGeometry();这样我们只需要用一个指针数组记录下每一个QPushButton的地址,通过遍历数组的方式就可知道每一个蛇身节点的地址QPushButtondot1newQPushButton;Snakebuff〔buffip〕(unsignedint)dot1;
4。游戏结束有两种情况,第一:当蛇头碰到活动边界时,游戏结束。第二:当蛇头碰到蛇身体时,游戏结束。这里就要注意用全局变量存放活动边界的坐标。代码讲解
main。h文件includeQMainWindowincludeQPushButtonincludeQTimerincludeQPaintEventnamespaceUi{classMainWindow;}classMainWindow:publicQMainWindow{QOBJECTpublic:explicitMainWindow(QWidgetparent0);MainWindow();virtualvoidpaintEvent(QPaintEvent);voidover();voidSnakeInit();publicslots:voidonButStart();voidonButUp();voidonButDown();voidonButLift();voidonButRight();voidonTimer();private:Ui::MainWindowui;QPushButtondot;蛇头QPushButtonnewdot;食物QTimertimerId;定时器intdirection;行驶方向unsignedintSnakebuff〔100〕;蛇身intbuffip;蛇身长度,同时也是游戏得分体现intSnakefood〔3〕;食物坐标,状态};
复写voidpaintEvent(QPaintEvent)绘图函数,画四条边线。头文件
includeQPaintEventvoidMainWindow::paintEvent(QPaintEvent){画一条直线QPainterpainternewQPainter(this);创建QPainter一个对象QPenpen;pen。setColor(Qt::black);设置画笔为黑色paintersetPen(pen);设置画笔painterdrawLine(linelift,lineup,lineright,lineup);painterdrawLine(linelift,linedown,lineright,linedown);painterdrawLine(linelift,lineup,linelift,linedown);painterdrawLine(lineright,lineup,lineright,linedown);}
main。cpp主函数
主要实现功能:初始化界面,初始化定时器,链接信号与槽MainWindow::MainWindow(QWidgetparent):QMainWindow(parent),ui(newUi::MainWindow){uisetupUi(this);setWindowIcon(QIcon(:newprefix1icondothead。png));setWindowTitle(贪吃蛇);timerIdnewQTimer(this);connect(timerId,SIGNAL(timeout()),this,SLOT(onTimer()));uistartsetStyleSheet(borderimage:url(:newprefix1icondotgreen。png);font:28ptSans;);uistartsetText(开始);dotNULL;newdotNULL;connect(uistart,SIGNAL(clicked(bool)),this,SLOT(onButStart()));connect(uilift,SIGNAL(clicked(bool)),this,SLOT(onButLift()));connect(uiright,SIGNAL(clicked(bool)),this,SLOT(onButRight()));connect(uiup,SIGNAL(clicked(bool)),this,SLOT(onButUp()));connect(uidown,SIGNAL(clicked(bool)),this,SLOT(onButDown()));}
main。cpp定时器函数
主要实现功能:蛇的运动过程,判断是否吃到食物,判断是否游戏结束voidMainWindow::onTimer(){intxdotgeometry()。x();获取蛇头坐标intydotgeometry()。y();if(xSnakefood〔0〕ySnakefood〔1〕)判断蛇头与食物坐标是否相同,相同表示吃到食物{QPushButtondot1newQPushButton;创Snakebuff〔buffip〕(unsignedint)dot1;将新的节点存入数组dot1setEnabled(0);设置按钮为不可点击状态dot1setParent(this);设置新建按钮显示在当前界面dot1setStyleSheet(borderimage:url(:newprefix1icondotgreen。png););QPushButtondot2(QPushButton)Snakebuff〔buffip1〕;intx1dot2geometry()。x();获取当前蛇身的最后一个节点inty1dot2geometry()。y();dot1setGeometry(x1,y1,dotsize,dotsize);将新节点加入蛇身末尾dot1show();显示出该节点Snakefood〔2〕1;食物已被吃标志}switch(direction){判断当前行驶方向case1:if(ylineup)dotsetGeometry(x,ydotsize,dotsize,dotsize);改变蛇头坐标当向左或右行驶时,下一个方向只能是上,或着下当向上或下行驶时,下一个方向只能是左,或者右uiupsetEnabled(0);uidownsetEnabled(0);设置按钮状态为不可点击uiliftsetEnabled(1);设置按钮状态为可以点击uirightsetEnabled(1);break;case2:if(ylinedown)dotsetGeometry(x,ydotsize,dotsize,dotsize);uiupsetEnabled(0);uidownsetEnabled(0);uiliftsetEnabled(1);uirightsetEnabled(1);break;case3:if(xlinelift)dotsetGeometry(xdotsize,y,dotsize,dotsize);uiupsetEnabled(1);uidownsetEnabled(1);uiliftsetEnabled(0);uirightsetEnabled(0);break;case4:if(xlineright)dotsetGeometry(xdotsize,y,dotsize,dotsize);uiupsetEnabled(1);uidownsetEnabled(1);uiliftsetEnabled(0);uirightsetEnabled(0);break;default:break;}if(buffip)当蛇身长度大于等于一时,将蛇身的后一个节点等于前一个节点的坐标{for(intibuffip1;i0;i)遍历蛇身所有节点{QPushButtondot1(QPushButton)Snakebuff〔i〕;QPushButtondot2(QPushButton)Snakebuff〔i1〕;intx1dot2geometry()。x();inty1dot2geometry()。y();dot1setGeometry(x1,y1,dotsize,dotsize);}QPushButtondot1(QPushButton)Snakebuff〔0〕;dot1setGeometry(x,y,dotsize,dotsize);}当贪吃蛇碰到边界时,游戏结束if(ylineupylinedownxlineliftxlineright)over();当贪吃蛇碰到自己尾巴时,游戏结束for(inti2;ibuffip;i){QPushButtondot2(QPushButton)Snakebuff〔i〕;if(xdot2geometry()。x()ydot2geometry()。y())over();}if(Snakefood〔2〕)当食物被吃掉时,创建下一个食物坐标{qsrand(QTime(0,0,0)。secsTo(QTime::currentTime()));生成随机数intnewxqrand()10005620linelift;qsrand(QTime(0,0,0)。secsTo(QTime::currentTime()));intnewyqrand()100820lineup;Snakefood〔0〕newx;记录下食物的坐标Snakefood〔1〕newy;newdotsetGeometry(newx,newy,dotsize,dotsize);newdotshow();Snakefood〔2〕0;设置食物未被吃掉标志}uilabelsetText(QString::number(buffip));显示当前游戏得分设置蛇行驶速度,得分越高,速度越快if(buffip5)timerIdsetInterval(300);elseif(buffip10)timerIdsetInterval(250);elseif(buffip20)timerIdsetInterval(200);elseif(buffip50)timerIdsetInterval(150);}
【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】
点击这里:链接