1. 创建项目

选择模板

选择编译器:

准备游戏素材

准备素材

添加数据成员

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));

绘制贪食蛇

#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);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);}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;
}

游戏结束效果

今天的分享就到这里了,大家要好好学C语言/C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:763855696【点击进入】

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

Qt版的贪食蛇游戏项目相关推荐

  1. [原]Console小技巧——Console版贪食蛇

    这一篇是我的Console小技巧的最后一篇文章,以下是索引: 1.[原]Console小技巧--七彩输出 2.[原]Console小技巧--字符涂鸦 3.[原]Console小技巧--Console版 ...

  2. C语言 实现贪食蛇游戏

    参照博客"贪食蛇的C语言实现"的图形界面,用了大概一天的时间我也写了一个简单版的贪食蛇,能玩. 游戏截图 1.调用Windows API 解决画图问题 2.初始化画出围墙,蛇身体 ...

  3. tomcat websock html5,websocket实战(4) websocket版贪食蛇游戏(tomcat官方自带)

    通过前面3篇的阐述,相信可以构建一个简单的socket应用了.当然,也会遗漏了许多知识点,相信会在以后分享的实例中捎带说明下. 本文的主要是分析下tomcat官方自带的贪食蛇游戏.为什么选择分析这个项 ...

  4. Python 简易版贪食蛇(源代码)

    Python 简易版贪食蛇 简易版贪食蛇代码如下,直接运行即可. 1. 效果图 2.源代码 源代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*-im ...

  5. java贪吃蛇设计流程_JAVA版贪食蛇(贪吃蛇)游戏的设计与实现(含录像)

    JAVA版贪食蛇(贪吃蛇)游戏的设计与实现(含录像)(任务书,开题报告,外文翻译,毕业论文12000字,程序代码,MySQL数据库,答辩PPT,答辩视频录像) 摘要 "贪食蛇"游戏 ...

  6. Java版贪食蛇游戏的设计与实现毕业设计

    技术:Java.JSP等 摘要: 使用java语言,贪吃蛇游戏,其界面简单易于操作,受到了世界各地玩家的喜爱.近年来,作为一种的高级语言java收到了大家的欢迎欢迎,具有简单.易于理解的特性,被广泛应 ...

  7. 网页版贪食蛇【基于HTML+CSS+JavaScript】实现

    最终效果 HTML代码 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  8. linux终端贪吃蛇,分享|nSnake: 在Linux的终端上玩经典的贪食蛇游戏

    你知道20世纪末的那些古老的诺基亚手机上最棒的东西是什么吗? 贪食蛇! 我以前在这个看似无聊但却让人上瘾的游戏上花费了大把的时间.在古老的诺基亚手机被智能手机取代的同时,贪食蛇也被另外的无聊但却令人上 ...

  9. java小程序贪吃蛇代码_微信小程序Demo之贪食蛇

    原标题:微信小程序Demo之贪食蛇 差不多大半年前,笔者发布了一篇关于OC版贪食蛇开发的文章,时隔多月,微信小程序横空出世,于是闲来无事的我又写了一个小程序版. 01页面布局 关于小程序笔者就不做介绍 ...

最新文章

  1. java.util中,util是什么意思
  2. 华为2017java笔试题_2017年java华为面试题
  3. 关于Sql语句的心得体会
  4. 2015年,大数据将改变客户关系
  5. mysql使用裸设备_请教dd清空裸设备问题
  6. BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争
  7. 计算机组成原理中的直接映像,计算机组成原理cache存储器的直接映像与变换.doc...
  8. Linux笔试题及答案
  9. iOS开发之MAC的内存清理,Xcode清理
  10. 微弱信号放大电路(电磁超声)
  11. 快速原型工具,帮你从0开始画原型图!
  12. 全国计算机将文件属性隐藏,一键玩转隐藏属性文件
  13. #java项目#《水果库存系统1.0》(java(jdbc)+mysql)
  14. linaro 网站资源
  15. 138529-46-1,Biotin-PEG2-amine可在EDC或HATU存在下与NHS酯或羧酸反应试剂
  16. C++ 命令行参数解析
  17. 中国移动国际mCloud体验再次升级,助力企业远程协同数字化转型
  18. Excel应用技巧:不规则合并单元格之批量填充序列
  19. 7-8 输出上三角队形,数值从大到小
  20. 申请专利时要不要向专利局出示实物?

热门文章

  1. 2020双十一成绩单
  2. PDF免费转换成word转换器
  3. 为什么要学计算机演讲稿,演讲稿:我们为什么要学习
  4. QQ欢乐斗地主的心得体会
  5. Luogu P1879玉米田题解
  6. CentOS8 配置本地yum源详细教程
  7. PaddleLite——将水果分类模型部署到树莓派
  8. performance_schema详解一
  9. 去掉textArea和input的边框
  10. 全国影子银行数据(含信托、理财、理财产品余额等数据)