服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - QT实现简单打地鼠游戏

QT实现简单打地鼠游戏

2021-10-15 14:30一颗小小小颗粒 C/C++

这篇文章主要为大家详细介绍了QT实现简单打地鼠游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了QT实现简单打地鼠游戏的具体代码,供大家参考,具体内容如下

开发工具:VS2017,qt5.9.8
开发语言:c++

实现功能:

有若干地鼠洞,每次出现一只地鼠,当击中地鼠后,分数加1,地鼠更换位置。当分数大于20时,游戏结束。

实现思路:

 1.先初始化一个页面,放一只地鼠和若干个地鼠洞,为地鼠和地鼠洞添加槽函数。
 2.当点击时就执行相应函数。判断是否击中,从而对其进行加分或者减分。
 3.当击中地鼠后,应该刷新页面,让地鼠换个位置出现。
 4.重复2.3,直到分数到达一定值或者其他结束条件后结束游戏。

用到的知识点:

 1.qt按钮组,以及按钮组连接信号槽(代码里地鼠是用按钮实现的,也可以使用QLabel实现,点击时,可以用static_cast(childAt(event->pos()));判断点中的是不是地鼠)
 2.QLabel设置图片,字体,颜色,大小
 3.QPushButton 设置图片
 4.给光标换图片

下面开始创建项目,代码在最下面,也可以直接拉到下面看代码

1.创建qt项目,等待项目创建完成,这里我的项目名是BeatMouse

QT实现简单打地鼠游戏

2.接下来会有这个弹框,点next即可

QT实现简单打地鼠游戏

3.继续next,release那里勾不勾都可以,不影响

QT实现简单打地鼠游戏

4.选择QWidget,然后finish

QT实现简单打地鼠游戏

5.静静等待项目创建完成就好啦! 然后删除项目里.cpp,.h文件里用到的ui相关的东西,这里用不到。

6.添加图片资源文件,在项目解决方案里有个 Resource Files 文件夹,打开里面应该有一个自动创建好的.qrc文件,双击打开,点击Add,选择Add Files,即可添加资源进来,点击添加好的某个资源,Resource URL就是资源的路径,在项目里直接使用这个路径,就可以用到这个资源。

QT实现简单打地鼠游戏

最后的效果图

QT实现简单打地鼠游戏

初学代码写的有点乱,下面放上代码

BeatMouse.h

 #pragma once #include  #include class BeatMouse : public QMainWindow { Q_OBJECT signals: void quit(); public: BeatMouse(QWidget *parent = Q_NULLPTR); public slots: void OnButtonClickMouse(int index); //连接按钮组,判断是哪个按钮被点击 void setScore(int score);  //设置分数 private: int m_width; //获取屏幕的宽高 默认尺寸1920*1080 int m_height; int mouseItem; //地鼠序号 int m_score; QTime t; QRect  m_screenGeometry; //屏幕尺寸 QLabel*   m_background;   //背景图 QLabel*  m_gameOver; //游戏结束后的遮罩 QLabel*  m_gameOverText; //游戏结束后的提示文字 QPushButton* m_btnQuit;  //右上角关闭按钮 QButtonGroup*  m_groupBtn;   // 按钮组 QVector m_Mouse; // 地鼠按钮 QLCDNumber* m_lcdScore;  //分数 void setBackground();  //设置背景 void setGameQuit();  //设置关闭按钮 void initMouse();  //初始化地鼠洞 void beginGame();  //随机选择一个地鼠洞变成地鼠 void loadScore();  //初始化分数 void gameOver();  //游戏结束 出现遮罩和提示文字 };

BeatMouse.cpp

 #include "BeatMouse.h" BeatMouse::BeatMouse(QWidget *parent) : QMainWindow(parent) { QDesktopWidget* pDesktop = QApplication::desktop(); //获取桌面大小 m_screenGeometry = pDesktop->screenGeometry(); m_width = m_screenGeometry.width(); m_height = m_screenGeometry.height(); m_rateHeight = m_height / 1080.0; m_rateWidth = m_height / 1920.0; this->setGeometry(m_screenGeometry); setBackground(); setGameQuit(); initMouse(); loadScore(); beginGame(); } void BeatMouse::setBackground() { QPixmap image(":/BeatMouse/qrc/bg.jpg"); QPixmap img = image.scaled(m_screenGeometry.size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); m_background = new QLabel(this); m_background->setPixmap(img); m_background->setFixedSize(img.size()); m_background->lower(); QPixmap imgCursor(":/BeatMouse/qrc/chuizi.png"); QCursor cursor(imgCursor); setCursor(cursor); } void BeatMouse::setGameQuit() { QPixmap image(":/BeatMouse/qrc/close.png"); QPixmap img = image.scaled(80,80, Qt::KeepAspectRatio, Qt::SmoothTransformation); m_btnQuit = new QPushButton(this); m_btnQuit->setIcon(img); m_btnQuit->setIconSize(img.size()); m_btnQuit->setFixedSize(img.size()); m_btnQuit->setStyleSheet("QPushButton{border:0px;background-color:rgba(0,0,0,0);outline:none;}"); m_btnQuit->move(m_width - 140, 50 ); QObject::connect(m_btnQuit, SIGNAL(clicked()), this, SIGNAL(quit())); } void BeatMouse::initMouse() { m_score = 0; m_Mouse.clear(); m_groupBtn = new QButtonGroup(this); QPushButton* m_pbtn; for (int i = 0; i <10; i++) { //2*5 m_pbtn = new QPushButton(this); QPixmap image(":/BeatMouse/qrc/dishu2.png"); QPixmap img = image.scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation); m_pbtn->setStyleSheet("QPushButton{border:0px;background-color:rgba(0,0,0,0);outline:none;}"); if (i > 4) { // 后4个放一起 //QPixmap img = image.scaled(160, 160, Qt::KeepAspectRatio, Qt::SmoothTransformation); m_pbtn->move(300+270*(i-5), 500); } else { m_pbtn->move(300+270*i, 700); } m_pbtn->setIcon(img); m_pbtn->setIconSize(img.size()); m_pbtn->setFixedSize(img.size()); m_Mouse.push_back(m_pbtn); m_groupBtn->addButton(m_Mouse[i], i); } QObject::connect(m_groupBtn, SIGNAL(buttonClicked(int)), this, SLOT(OnButtonClickMouse(int))); } void BeatMouse::OnButtonClickMouse(int index) { if (index == mouseItem) { //如果被打中的是地鼠 m_score++; setScore(m_score); QPixmap image(":/BeatMouse/qrc/dishu2.png"); QPixmap img = image.scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation); m_Mouse[mouseItem]->setIcon(img); beginGame(); } } void BeatMouse::beginGame() { QPixmap image(":/BeatMouse/qrc/dishu1.png"); QPixmap img = image.scaled(200, 200, Qt::KeepAspectRatio, Qt::SmoothTransformation); t = QTime::currentTime(); qsrand(t.msec()*100 + t.second() * 1000); mouseItem = qrand() % 10; m_Mouse[mouseItem]->setIcon(img); } void BeatMouse::loadScore() { m_lcdScore = new QLCDNumber(this); m_lcdScore->setDigitCount(1); m_lcdScore->setSegmentStyle(QLCDNumber::Flat); m_lcdScore->setStyleSheet("QLCDNumber{color:rgb(146,64,146);border:none;}"); m_lcdScore->display(0); // m_lcdScore->setGeometry(m_width/2-80, 20,150, 150); } void BeatMouse::setScore(int score) { if (score >= 100) { m_lcdScore->setDigitCount(3); } else if (score >= 10 && score <100) { m_lcdScore->setDigitCount(2); } else { m_lcdScore->setDigitCount(1); } if (score > 20) { score = 20; gameOver(); } m_lcdScore->display(score); } void BeatMouse::gameOver() { m_gameOver = new QLabel(this); m_gameOver->setGeometry(0, 200, m_width, m_height-200); m_gameOver->setStyleSheet("QLabel{background-color:rgba(0,0,0,20);}"); //m_gameOver->raise(); m_gameOver->show();   //显示 m_gameOverText=new QLabel(this); m_gameOverText->setText(QString::fromLocal8Bit("恭喜过关!")); m_gameOverText->show();   //显示 //颜色 QPalette pal; pal.setColor(QPalette::WindowText, Qt::red); m_gameOverText->setPalette(pal); //字号 QFont ft; ft.setPointSize(40); m_gameOverText->setFont(ft); m_gameOverText->setGeometry(m_width/2-100, m_height/2-100,400,200); m_gameOverText->raise(); }

简易版打地鼠,所以没有加计时功能,也没有加音乐,也没有加重玩游戏的功能,下面说一下实现这些功能的简单思路。

 //1.添加音乐 qt5里添加音乐需要增加MultiMedia模块,在项目属性里添加即可,并加上这个头文件 #include  使用: QMediaPlayer m_MediaObject; m_MediaObject.setMedia(QUrl("qrc:qrc/sound/enterSound.mp3")); m_MediaObject.play(); 注: enterSound.mp3在qrc里的路径是:/qrc/sound/enterSound.mp3,但是直接使用这个路径播放不出来声音,经过查寻,把路径换成这种qrc:qrc/sound/enterSound.mp3就可以使用,可以两种都试试。 qt5可以获取音乐播放的状态,在OnState槽函数中,可以判断音乐的状态,进而进行你想要的操作。 QObject::connect(&m_MediaObject, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(OnState(QMediaPlayer::State))); void BeatMouse::OnState(QMediaPlayer::State state) { switch (state) { //判断音乐的状态 case QMediaPlayer::StoppedState: //停止 case QMediaPlayer::PlayingState: //播放 break; case QMediaPlayer::PausedState: //暂停 break; default: break; } } //2.添加计时 使用QTimer 设置一个计时器,每间隔1s就刷新一下时间的显示。就能达到计时显示的效果。定义一个QTime 记录时长。 QTimer* m_timeUpdate; QTime m_tTotalTime; //总时长 //3.重玩游戏 重玩游戏就是一个把地鼠归位,时间,分数清零的动作。 

图片资源都是网图,如果哪里写的不好,欢迎指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_42282789/article/details/111146554

延伸 · 阅读

精彩推荐
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29