用qt中的Widget类写一个完整的打地鼠小游戏

时间: 2023-06-15 07:06:58 浏览: 57
好的,以下是一个基于Qt Widget类的打地鼠小游戏的实现示例: 首先,我们需要一个地鼠的图片资源,可以在Qt的资源管理器中添加一个图片资源。 在窗口类中,我们需要定义一些变量和函数来实现游戏逻辑: ```cpp class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: QTimer* m_timer; QLabel* m_label; QLabel* m_scoreLabel; int m_score; QVector<QLabel*> m_holes; int m_currentHoleIndex; QPixmap m_mousePixmap; private slots: void onTimerTimeout(); void onHoleClicked(); }; ``` 其中,`m_timer`是用于定时切换地鼠出现位置的计时器,`m_label`是用于显示地鼠的标签控件,`m_scoreLabel`是用于显示分数的标签控件,`m_score`是记录当前分数的变量,`m_holes`是存储地鼠出现位置标签控件的向量,`m_currentHoleIndex`是记录当前地鼠出现位置的索引变量,`m_mousePixmap`是地鼠的图片资源。 在构造函数中,我们需要初始化这些变量和控件,并启动计时器: ```cpp Widget::Widget(QWidget *parent) : QWidget(parent) { // 初始化分数和地鼠图片 m_score = 0; m_mousePixmap = QPixmap(":/images/mouse.png"); // 初始化地鼠出现位置标签控件 for (int i = 0; i < 9; i++) { QLabel* hole = new QLabel(this); hole->setPixmap(QPixmap(":/images/hole.png")); hole->setScaledContents(true); hole->setGeometry(50 + 120 * (i % 3), 50 + 120 * (i / 3), 100, 100); hole->installEventFilter(this); m_holes.push_back(hole); } // 初始化分数标签控件 m_scoreLabel = new QLabel(this); m_scoreLabel->setText("Score: 0"); m_scoreLabel->setGeometry(20, 20, 100, 30); // 初始化地鼠标签控件 m_label = new QLabel(this); m_label->setPixmap(m_mousePixmap); m_label->setScaledContents(true); m_label->setVisible(false); // 初始化计时器 m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout())); m_timer->start(1000); } ``` 在`onTimerTimeout`函数中,我们需要在地鼠出现位置随机选择一个位置,并设置地鼠的位置和显示状态: ```cpp void Widget::onTimerTimeout() { // 随机选择一个地鼠出现位置 m_currentHoleIndex = qrand() % m_holes.size(); QLabel* hole = m_holes[m_currentHoleIndex]; // 设置地鼠位置和显示状态 m_label->setGeometry(hole->x() + 20, hole->y() + 20, 60, 60); m_label->setVisible(true); } ``` 在`onHoleClicked`函数中,我们需要处理玩家点击地鼠的事件,并更新分数和显示: ```cpp void Widget::onHoleClicked() { // 如果地鼠显示中,则判断是否被击中 if (m_label->isVisible()) { int x = m_label->x(); int y = m_label->y(); // 判断是否在地鼠位置范围内 if (x >= m_holes[m_currentHoleIndex]->x() && x <= m_holes[m_currentHoleIndex]->x() + 100 && y >= m_holes[m_currentHoleIndex]->y() && y <= m_holes[m_currentHoleIndex]->y() + 100) { // 击中地鼠,分数加一 m_score++; m_scoreLabel->setText(QString("Score: %1").arg(m_score)); } // 隐藏地鼠 m_label->setVisible(false); } } ``` 最后,我们需要在窗口类中实现`eventFilter`函数来处理地鼠出现位置标签控件的点击事件: ```cpp bool Widget::eventFilter(QObject* watched, QEvent* event) { if (event->type() == QEvent::MouseButtonRelease) { // 如果点击了地鼠出现位置标签控件,则处理点击事件 for (int i = 0; i < m_holes.size(); i++) { if (m_holes[i] == watched) { onHoleClicked(); return true; } } } return QWidget::eventFilter(watched, event); } ``` 完整代码如下: ```cpp #include "widget.h" #include <QTimer> #include <QLabel> #include <QPixmap> #include <QVector> #include <QEvent> Widget::Widget(QWidget *parent) : QWidget(parent) { // 初始化分数和地鼠图片 m_score = 0; m_mousePixmap = QPixmap(":/images/mouse.png"); // 初始化地鼠出现位置标签控件 for (int i = 0; i < 9; i++) { QLabel* hole = new QLabel(this); hole->setPixmap(QPixmap(":/images/hole.png")); hole->setScaledContents(true); hole->setGeometry(50 + 120 * (i % 3), 50 + 120 * (i / 3), 100, 100); hole->installEventFilter(this); m_holes.push_back(hole); } // 初始化分数标签控件 m_scoreLabel = new QLabel(this); m_scoreLabel->setText("Score: 0"); m_scoreLabel->setGeometry(20, 20, 100, 30); // 初始化地鼠标签控件 m_label = new QLabel(this); m_label->setPixmap(m_mousePixmap); m_label->setScaledContents(true); m_label->setVisible(false); // 初始化计时器 m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout())); m_timer->start(1000); } Widget::~Widget() { } void Widget::onTimerTimeout() { // 随机选择一个地鼠出现位置 m_currentHoleIndex = qrand() % m_holes.size(); QLabel* hole = m_holes[m_currentHoleIndex]; // 设置地鼠位置和显示状态 m_label->setGeometry(hole->x() + 20, hole->y() + 20, 60, 60); m_label->setVisible(true); } void Widget::onHoleClicked() { // 如果地鼠显示中,则判断是否被击中 if (m_label->isVisible()) { int x = m_label->x(); int y = m_label->y(); // 判断是否在地鼠位置范围内 if (x >= m_holes[m_currentHoleIndex]->x() && x <= m_holes[m_currentHoleIndex]->x() + 100 && y >= m_holes[m_currentHoleIndex]->y() && y <= m_holes[m_currentHoleIndex]->y() + 100) { // 击中地鼠,分数加一 m_score++; m_scoreLabel->setText(QString("Score: %1").arg(m_score)); } // 隐藏地鼠 m_label->setVisible(false); } } bool Widget::eventFilter(QObject* watched, QEvent* event) { if (event->type() == QEvent::MouseButtonRelease) { // 如果点击了地鼠出现位置标签控件,则处理点击事件 for (int i = 0; i < m_holes.size(); i++) { if (m_holes[i] == watched) { onHoleClicked(); return true; } } } return QWidget::eventFilter(watched, event); } ``` 最后,在主函数中创建窗口并运行应用程序: ```cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } ``` 运行后,即可看到一个简单的打地鼠小游戏界面。

相关推荐

最新推荐

recommend-type

Qt基础开发之Qt文件操作类QFile读写文件的详细方法与实例及QDataStream的使用方法

主要介绍了Qt基础开发之Qt文件操作类QFile读写文件的详细方法与实例,需要的朋友可以参考下
recommend-type

浅谈Qt中使用CEF的几个要点(Windows下)

下面小编就为大家带来一篇浅谈Qt中使用CEF的几个要点(Windows下)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例

主要介绍了Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例,需要的朋友可以参考下
recommend-type

Qt实现保存、浏览、预览、打印功能的示例代码

下面小编就为大家分享一篇Qt实现保存、浏览、预览、打印功能的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

确保MATLAB回归分析模型的可靠性:诊断与评估的全面指南

![确保MATLAB回归分析模型的可靠性:诊断与评估的全面指南](https://img-blog.csdnimg.cn/img_convert/4b823f2c5b14c1129df0b0031a02ba9b.png) # 1. 回归分析模型的基础** **1.1 回归分析的基本原理** 回归分析是一种统计建模技术,用于确定一个或多个自变量与一个因变量之间的关系。其基本原理是拟合一条曲线或超平面,以最小化因变量与自变量之间的误差平方和。 **1.2 线性回归和非线性回归** 线性回归是一种回归分析模型,其中因变量与自变量之间的关系是线性的。非线性回归模型则用于拟合因变量与自变量之间非
recommend-type

引发C++软件异常的常见原因

1. 内存错误:内存溢出、野指针、内存泄漏等; 2. 数组越界:程序访问了超出数组边界的元素; 3. 逻辑错误:程序设计错误或算法错误; 4. 文件读写错误:文件不存在或无法打开、读写权限不足等; 5. 系统调用错误:系统调用返回异常或调用参数错误; 6. 硬件故障:例如硬盘损坏、内存损坏等; 7. 网络异常:网络连接中断、网络传输中断、网络超时等; 8. 程序异常终止:例如由于未知原因导致程序崩溃等。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依