看吴健吴老师的视频做了一个打地鼠的小游戏,主要利用了qt中的2D显示器QGraphicsView,
QGraphicsScence场景,以及图元QgraphicsItem下的像素图元QGraphicsPixmapItem。
关系为一个个图元构成场景,场景显示在显示器中。

##效果如下(手机)

图元类
图元类主要设置每个图元上的图片是什么,该图元的状态(开始状态和暂停、停止状态),以及该图元上是否有老鼠(通过一个bool类型的成员变量来决定);图元类还需要设置置鼠标的状态为一个锤子;图元类还需要重写父类的基类QGraphicsItem中的鼠标按压事件和鼠标抬起事件。当鼠标按下时,如果在开始状态下该图元的mouse变量为true(有老鼠),则 说明打到了老鼠,此时利用获取到的单例对象向mainwindow发送一个beat信号,更新lcdnumber上的分数。

#include "myitem.h"
#include <QDebug>
myitem::myitem()
{this->setPixmap(QPixmap(":/pic/2"));//默认背景图片mouse = false;//没有老鼠start = false;//没开始this->setCursor(QCursor(QPixmap(":/pic/up1.png")));//鼠标为锤子抬起形态
}void myitem::setpic(QString path) //用于设置该图元的图片
{this->setPixmap(QPixmap(path));
}void myitem::setmouse(bool m) //设置该图元上是否有老鼠
{this->mouse = m;
}bool myitem::ismouse()//返回该图元上是否有老鼠
{return this->mouse;
}void myitem::mousePressEvent(QGraphicsSceneMouseEvent *event)//鼠标点击事件重写,继承自父类QGraphicItem{this->setCursor(QCursor(QPixmap(":/pic/down.png")));//鼠标点击锤子落下if(this->start)//判断是否是开始状态{if(ismouse())//判断是否有老鼠{this->setPixmap(QPixmap(":/pic/3"));//设置该图元为击中效果score* s = score::getscore();//获取单例对象s->addscore();//通知加分}}}void myitem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)//鼠标释放事件,锤子抬起{this->setCursor(QCursor(QPixmap(":/pic/up1.png")));}void myitem::setstart(bool m)//设置是否为开始状态{this->start = m;}bool myitem::isstart(){return this->start;}

场景类
场景类首先要进行背景的布局,将图元添加进场景并且依次排列成4*4的矩阵。然后需要设置定时器让游戏动起来。然后设置开始、暂停、停止三个按钮的槽函数(主要是改变定时器的状态)。

#include "myscene.h"myScenr::myScenr(QObject *parent) : QGraphicsScene(parent)
{int i = 0;for(i = 0;i<16;i++)//在该场景上添加(4*4)个图元{itm[i] = new myitem;itm[i]->setPos(i/4 * itm[i]->boundingRect().width(),i%4 * itm[i]->boundingRect().height());this->addItem(itm[i]);//依次添加进场景}this->life_time = 2000;//初始化老鼠刷新时间this->mouse_count = 4;//初始化每次刷新的最大数量pt = new QTimer(this);//刷新老鼠的定时器ppt = new QTimer(this);//更新老鼠刷新速度和数量定时器connect(pt,SIGNAL(timeout()),this,SLOT(showmouse()));connect(ppt,SIGNAL(timeout()),this,SLOT(change_time()));
}void myScenr::showmouse()//老鼠出动
{int count = rand()%this->mouse_count+1;//随机数获取出现几只老鼠int i = 0;for( i = 0;i<16;i++)//老鼠出现之前上一波老鼠回洞{itm[i]->setpic(":/pic/2");itm[i]->setmouse(false);}for(i = 0;i < count;i++){int pos = rand()%16;//随机数获取老鼠出现在那个图元itm[pos]->setpic(":/pic/4");itm[pos]->setmouse(true);}
}void myScenr::change_time()//改变刷新速度和数量
{this->life_time -= 500;//每30s将刷新时间减小0.5s,一局游戏控制在2minthis->mouse_count += 2;if(this->life_time == 0)//如果时间耗尽,发送finshed信号{emit finshed();}
}void myScenr::start()//开始
{int i = 0;for( i = 0;i<16;i++){itm[i]->setstart(true);//设置每一个图元的start状态}ppt->start(30000);//启动定时器pt->start(this->life_time);
}void myScenr::spause()//暂停
{pt->stop();ppt->stop();int i = 0;for( i = 0;i<16;i++){itm[i]->setstart(false);}
}void myScenr::stop()//停止
{pt->stop();ppt->stop();this->life_time = 2000;this->mouse_count = 4;int i = 0;for( i = 0;i<16;i++){itm[i]->setpic(":/pic/2");itm[i]->setmouse(false);itm[i]->setstart(false);}emit clear();//向mainwindow发送停止清空分数信号
}

#单例
因为是否打到老鼠是在图元上判断的,而分数的显示则在mainwindow里。所以设计了一个单例对象让图元和mainwindow都可以获取到同一个对象。图元类利用该对象发送beat信号,mainwindow则关联beat信号和用来更新分数的槽函数。

#include <QObject>
//单例
class score : public QObject
{Q_OBJECT
public:static score* getscore();void addscore();
private:explicit score(QObject *parent = nullptr);signals:void beat();//砸到老鼠后通知mainwindow加分public slots:
private:static score *s;
};

#mainwindow
mainwindow主要将场景加入显示器、并设置弹窗(重写关闭事件的函数、和一局游戏结束后的弹窗)、以及背景音乐的播放。

#源码地址
https://gitee.com/hou_yuan_hao/whacamole

QT实现打地鼠小游戏相关推荐

  1. Python 和 PyQt5 实现打地鼠小游戏

    Python 和 PyQt5 实现打地鼠小游戏 实现效果: 视频效果: https://live.csdn.net/v/264602https://live.csdn.net/v/264602 代码: ...

  2. PyQt5 打地鼠小游戏 代码及素材

    主要知识点:QWidget,QPushButton,QTimer 计时器 说明:学 Qt 时的第一个小练习,只做了最基础简单的功能. 效果如下: (注:鼠标点击时黄色圆圈是 录屏软件自带的) 完整代码 ...

  3. java 打地鼠 源代码_Java实现的打地鼠小游戏完整示例【附源码下载】

    本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体 ...

  4. 敲地鼠java_Java实现的打地鼠小游戏完整示例【附源码下载】

    本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体 ...

  5. java android 打地鼠_Android实现打地鼠小游戏

    本文实例为大家分享了Android实现打地鼠小游戏的具体代码,供大家参考,具体内容如下 实现结果 代码实现 playmouse.java package com.example.playmouse; ...

  6. 如何用python制作五子棋游戏_Python制作打地鼠小游戏

    原文链接 Python制作小游戏(二十一)​mp.weixin.qq.com 效果展示 打地鼠小游戏https://www.zhihu.com/video/1200492442610450432 简介 ...

  7. 【180730】WinForm打地鼠小游戏源码

    本源码是采用WinForm进行开发的一个并非简单的打地鼠小游戏,有动画效果哈!有打地鼠.计分.过关等功能. 菜单功能: 1.运行游戏后,输入玩家姓名,点击开始 2.用鼠标点击从洞中钻出的地鼠给予打击 ...

  8. android打地鼠设计报告,android开发中利用handler制作一个打地鼠小游戏

    android开发中利用handler制作一个打地鼠小游戏 发布时间:2020-11-25 15:21:11 来源:亿速云 阅读:136 作者:Leah 这期内容当中小编将会给大家带来有关androi ...

  9. linux打地鼠游戏代码,JavaScript实现打地鼠小游戏

    一.实验说明 1. 环境介绍 本实验环境采用Ubuntu Linux桌面环境,实验中会用到桌面上的程序: Xfce终端: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 Fir ...

  10. matlab制作打地鼠游戏,Python制作打地鼠小游戏

    原标题:Python制作打地鼠小游戏 导语 大家好,欢迎来到 Crossin的编程教室 ! 打地鼠游戏相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~ 今天就给大家分享一个 ...

最新文章

  1. AI 帮忙找 Bug ,英特尔开源代码编程工具 ControlFlag
  2. Angualr6表单提交验证并跳转
  3. 什么时候应该避免写代码注释?
  4. 【2018.4.7】模拟赛之二-ssl2383 睡眠【水题】
  5. java解析上的jar包里的pom_Maven引入本地Jar包并打包进War包中的方法
  6. RECOLL检索软件测试工资,Recoll桌面全文搜索工具
  7. Mybatis_day4_Mybatis的注解开发
  8. 关于中断和异常的几点认识
  9. java restsharp_RestSharp使用总结
  10. HTTP网络协议四:HTTP报文及报文字段说明
  11. 基于Spring Boot的人力资源管理系统
  12. 〖四信智慧方案〗LoRa无线技术在输电监测中的应用
  13. phpStudy安装框架教程
  14. 目标检测——手把手带你实现SSD(Single Shot MultiBox Detector)训练和检测自己的数据集
  15. 计算机看游戏显卡,如何看电脑显卡性能
  16. 文献关联分析图谱——connected papers网站
  17. 知识图谱发展历程简介
  18. intouch报表数据的获取
  19. BIOS 中断向量表
  20. 往后余生的计算机音乐,纯音乐《飞翔的梦》 往后余生,与你同行

热门文章

  1. Excel使用技巧—每30行取1行数据
  2. php电子邮件群发源码,php电子邮件群发源码
  3. VS编程俄罗斯方块游戏
  4. 监控报警平台设计思路
  5. 这就是中国80后!!!
  6. 用python写个脚本把QQ空间多年动态删了
  7. c语言实现审查元素,如何删除qq空间说说?一键自动删除QQ空间说说审查元素代码分享(超简单)...
  8. built a JNCIS LAB系列:Chapter 1 Routing Policy
  9. 我是怎么打开车库门的:ASK/OOK手动解码及重放
  10. 我是火枪,我想打dps