一、新建一个Qt项目

新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认

二、添加要用到的头文件

#include <QKeyEvent>
#include <QRectF>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QDebug>
#include <QTimer>
#include <QTime>

三、写类声明信息

  • 贪吃蛇的本体使用小方框来代替
  • 使用QList类来保存贪吃蛇的本体
  • 使用定时器来设定刷新的时间
  • 使用随机函数生成奖励的节点
  • 使用paintEvent来进行绘图
  • keyPressEvent来监测按键的按下,控制贪吃蛇的移动
class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
protected:void paintEvent(QPaintEvent *);void keyPressEvent(QKeyEvent *);private:void addTopRectF();void addDownRectF();void addLeftRectF();void addRightRectF();void deleteLastRectF();bool snakeStrike();enum Move{Left,Right,Up,Down};
protected slots:void timeOut();void rewardTimeOut();private:Ui::Widget *ui;QList<QRectF> snake;//贪吃蛇本体int snakeNodeWidth = 10;int snakeNodeHeight = 10;QTimer *timer;QTimer *rewardTimer;int time = 100;int moveFlage = Up;bool gameOver = false;bool gameStart = false;QList<QRectF> rewardNode;//奖励节点};

四、对类函数的实现

  • 构造函数

    Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
    {ui->setupUi(this);resize(480,500);//设置窗体背景色为黑色setStyleSheet("QWidget{background:black}");setWindowOpacity(0.8);//设置窗口的透明度snake.append(QRectF(200,500,snakeNodeWidth,snakeNodeHeight));addTopRectF();addTopRectF();//首先生成一个奖励节点rewardNode.append(QRectF(100,100,snakeNodeWidth,snakeNodeWidth));timer = new QTimer;connect(timer, SIGNAL(timeout()),this,SLOT(timeOut()));//timer->start(time);rewardTimer = new QTimer;connect(rewardTimer,SIGNAL(timeout()),this,SLOT(rewardTimeOut()));//rewardTimer->start(time*30);
    }Widget::~Widget()
    {delete ui;
    }
  • 界面刷新

    void Widget::timeOut()
    {int flage = 1;for(int i=0; i<rewardNode.length(); i++){if(rewardNode.at(i).contains(snake.at(0).topLeft()+QPointF(snakeNodeWidth/2,snakeNodeHeight/2))){//if(snake.at(0).contains(rewardNode.at(i).x()+rewardNode.at(i).width()/2,rewardNode.at(i).y()+rewardNode.at(i).height()/2)){if(rewardNode.at(i).width()>snakeNodeWidth){//额外奖励flage += 2;}flage++;//正常奖励rewardNode.removeAt(i);break;}}while(flage--){switch (moveFlage) {case Up:addTopRectF();break;case Down:addDownRectF();break;case Right:addRightRectF();break;case Left:addLeftRectF();break;default:break;}}deleteLastRectF();update();
    }
  • 随机奖励的生成

    //随机奖励
    void Widget::rewardTimeOut()
    {qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));if(rewardNode.length() > 5){rewardNode.removeAt(qrand()%5);}rewardNode.append(QRectF(qrand()%(this->width()/20)*20,qrand()%(this->height()/20)*20,snakeNodeWidth,snakeNodeWidth));if(qrand()%5 == 3){rewardNode.append(QRectF(qrand()%(this->width()/20)*20-5,qrand()%(this->height()/20)*20-5,snakeNodeWidth*2,snakeNodeWidth*2));}
    }
  • 移动

    //向上移动
    void Widget::addTopRectF()
    {if(snake.at(0).y()-snakeNodeHeight < 0){snake.insert(0,QRectF(QPointF(snake.at(0).x(),this->height()-snakeNodeHeight),QPointF(snake.at(0).x()+snakeNodeWidth,this->height())));}else{snake.insert(0,QRectF(snake.at(0).topLeft()+QPointF(0,-snakeNodeHeight),snake.at(0).topRight()));}
    }
    //向下移动
    void Widget::addDownRectF()
    {if(snake.at(0).y()+snakeNodeHeight*2 > this->height()){snake.insert(0,QRectF(QPointF(snake.at(0).x(),snakeNodeHeight),QPointF(snake.at(0).x()+snakeNodeWidth,0)));}else{snake.insert(0,QRectF(snake.at(0).bottomLeft(),snake.at(0).bottomRight()+QPointF(0,snakeNodeHeight)));}
    }
    //向左移动
    void Widget::addLeftRectF()
    {if(snake.at(0).x()-snakeNodeWidth < 0){snake.insert(0,QRectF(QPointF(this->width()-snakeNodeWidth,snake.at(0).y()),QPointF(this->width(),snake.at(0).y()+snakeNodeHeight)));}else{snake.insert(0,QRectF(snake.at(0).topLeft()+QPointF(-snakeNodeWidth,0),snake.at(0).bottomLeft()));}
    }
    //向右移动
    void Widget::addRightRectF()
    {if(snake.at(0).x()+snakeNodeWidth*2 > this->width()){snake.insert(0,QRectF(QPointF(0,snake.at(0).y()),QPointF(snakeNodeWidth,snake.at(0).y()+snakeNodeHeight)));}else{snake.insert(0,QRectF(snake.at(0).topRight(),snake.at(0).bottomRight()+QPointF(snakeNodeWidth,0)));}
    }
    //删除结尾数据
    void Widget::deleteLastRectF()
    {snake.removeLast();
    }
  • 绘图

    //绘图
    void Widget::paintEvent(QPaintEvent *event)
    {QPainter painter(this);QPen pen;QBrush brush;QFont font("方正舒体",12,QFont::ExtraLight,false);//反锯齿painter.setRenderHint(QPainter::Antialiasing);pen.setColor(Qt::black);brush.setColor(Qt::green);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);for(int i=0; i<rewardNode.length(); i++){painter.drawEllipse(rewardNode.at(i));}pen.setColor(Qt::white);painter.setPen(pen);painter.setFont(font);painter.drawText(20,20,QString("当前得分:")+QString("%1").arg(snake.length()));if(snakeStrike()){QFont font("方正舒体",30,QFont::ExtraLight,false);painter.setFont(font);painter.drawText((this->width()-300)/2,(this->height()-30)/2,QString("GAME OVER!"));timer->stop();rewardTimer->stop();gameOver = true;}QWidget::paintEvent(event);
    }
  • 按键事件

    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_Enter:case Qt::Key_Return:if(gameOver){snake.clear();rewardNode.clear();moveFlage = Up;snake.append(QRectF(200,500,snakeNodeWidth,snakeNodeHeight));addTopRectF();addTopRectF();//首先生成一个奖励节点rewardNode.append(QRectF(100,100,snakeNodeWidth,snakeNodeWidth));timer->start(time);rewardTimer->start(time*30);gameOver = false;}break;case Qt::Key_Space:if(gameStart && !gameOver){timer->start(time);rewardTimer->start(time*30);gameStart = false;}else if(!gameStart && !gameOver){timer->stop();rewardTimer->stop();gameStart = true;}break;default:break;}
    }
  • 判断蛇身是否相撞

    //判断蛇头是否和蛇身相撞
    bool Widget::snakeStrike()
    {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;}
    

    五、结束

实现的效果:

提供源码在博客的资源中,Qt5.6版本正常运行。

点击下载源码

总结:

只是简单的使用了paintevent进行绘图,基本都是简单的对Qt的一些常用类的使用,对面向对象的编程应用的不是很好,更偏向于面向过程,所以完全可以改成C语言在Linux下实现,思路都是相同的。

QT实现简单的贪吃蛇小游戏相关推荐

  1. STM32+LCD实现简单的贪吃蛇小游戏

    寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...

  2. Python 简单实现贪吃蛇小游戏

    文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...

  3. Qt入门开发__贪吃蛇小游戏

    qt是一个由Qt Company于1991年开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序(比如控制台工具和服务器).在图形用户界面开发相比MFC更加 ...

  4. android 简单的贪吃蛇小游戏

    贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单. 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式. 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 ...

  5. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  6. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  7. C++/QT 贪吃蛇小游戏 界面设计

    C++/QT 贪吃蛇小游戏 界面设计 前言:本文所写的贪吃蛇是笔者初学QT练手的小项目,做出来的界面较为粗糙.由于很久没有接触C++,程序中类封装的不是很规范.写这篇文章,权当是记录生活了,手动狗头. ...

  8. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单

    贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...

  9. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

最新文章

  1. dubbo 单元测试_技术分享——一路踩坑构建Dubbo源码
  2. 循环神经网络-Dropout
  3. flex4.6 保留自动产生的actionscript代码的编译选项
  4. 前端学习(3289):object.define2
  5. JConsole连接远程linux服务器配置
  6. 4x3矩阵键盘扫描法c语言,四种4*4矩阵键盘的扫描方法
  7. java怎么检测代码安全_foritfy代码安全审计、foritfy代码检测服务、java代码安全审计检测、C/C++语言代码安全审计检测...
  8. 枚举值是什么意思_期权的Theta值是什么意思?有什么意义?
  9. MySQL错误Another MySQL daemon already running with the same unix socket.
  10. GridView中添加自动编号,以及鼠标经过时行背景色变和删除时提示。
  11. 阿里云张建锋:数字技术要服务好实体经济
  12. Django 从0开始创建一个项目
  13. WPS国外版更改语言设置mac
  14. 孤独最高境界:这款单人VR游戏竟能带来多人组队体验
  15. html header设置语言,html5 header标签 html header css布局教程
  16. poi 同时 冻结第一行和第一列
  17. [从源码学设计]蚂蚁金服SOFARegistry之服务上线
  18. 宝宝出现这些突发状况!你会处理吗?
  19. 小程序提示:downloadFile:fail 发生了 SSL 错误,无法建立与该服务器的安全连接
  20. 15元钱一杯咖啡,喝完后两个空杯换一杯,问:你有100元钱,最多可以喝到几杯咖啡

热门文章

  1. 考研高等数学公式(数学一)
  2. Linux shell命令示例介绍-个人笔记
  3. 2012年第三届C/C++ B组蓝桥杯省赛真题
  4. 主板检测卡(POST卡)故障代码及排除方法速查表
  5. Java小程序开发实例!字节跳动Java岗经典面试真题,实战解析
  6. xilinx fpga学习笔记5:Xst综合属性
  7. 夯实Java基础(一)
  8. 网络营销实战课-文案实操案例
  9. jenkins插件下载地址
  10. 微信公众号开发教程[010]-消息管理-获取公众号的自动回复规则