QT实现简单打地鼠游戏

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

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

实现功能:

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

实现思路:

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

用到的知识点:

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

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

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

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

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

4.选择QWidget,然后finish

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

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

最后的效果图

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

BeatMouse.h

#pragma once
#include <QtWidgets>
#include<QTime>
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<QPushButton*> 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>
 使用:
 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.重玩游戏
重玩游戏就是一个把地鼠归位,时间,分数清零的动作。 

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

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

(0)

相关推荐

  • C++实现打地鼠游戏设计

    本文实例为大家分享了C++实现打地鼠游戏的具体代码,供大家参考,具体内容如下 代码: #include <afxwin.h> class CMyWnd :public CFrameWnd { private: CDC *m_pmdc; CBitmap *m_pbitmap[5]; CRect myRect[6]; CString picPath[5]; int hit; BOOL m_state[6]; int counter; int num; int hammer_x; int hamme

  • QT实现简单打地鼠游戏

    本文实例为大家分享了QT实现简单打地鼠游戏的具体代码,供大家参考,具体内容如下 开发工具:VS2017,qt5.9.8 开发语言:c++ 实现功能: 有若干地鼠洞,每次出现一只地鼠,当击中地鼠后,分数加1,地鼠更换位置.当分数大于20时,游戏结束. 实现思路: 1.先初始化一个页面,放一只地鼠和若干个地鼠洞,为地鼠和地鼠洞添加槽函数.  2.当点击时就执行相应函数.判断是否击中,从而对其进行加分或者减分.  3.当击中地鼠后,应该刷新页面,让地鼠换个位置出现.  4.重复2.3,直到分数到达一定

  • QT实现简单五子棋游戏

    本文实例为大家分享了QT实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 FIR.pro #------------------------------------------------- # # Project created by QtCreator 2012-09-01T15:09:11 # #------------------------------------------------- QT += core gui TARGET = FIR TEMPLATE = app SO

  • JavaScript实现简单打地鼠游戏

    本文实例为大家分享了JavaScript实现打地鼠游戏的具体代码,供大家参考,具体内容如下 效果如下: html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="js/index.js"></script> <link rel="s

  • Qt实现打地鼠游戏的方法详解

    目录 功能讲解 1.确定地鼠数量 2.定义游戏难易程序 3.难度切换 4.定时器处理 总结 今天与大家分享一个小游戏的实现:打地鼠 看一下实现效果吧~ 在指定的时间内打中一定数额的地鼠,否则失败,就如上述展示效果一样,自己写的小程序,居然连第二关也过不去,还挺尴尬的! 实现打地鼠小游戏不难,最主要的核心就是依靠定时器,按照一定间隔触发.接下来,我来讲解下是如何实现的吧! 功能讲解 开发环境:VS2017 + Qt5.14.2 x64 1.确定地鼠数量 对于打地鼠这款游戏来说,地鼠是从任意的洞口钻

  • Python实现打地鼠游戏

    目录 开发工具 相关模块 环境搭建 原理简介 主要代码 开发工具 python版本:3.6.4 相关模块 pygame:以及一些python自带的模块. 环境搭建 安装python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~首先,让我们确定一下游戏中有哪些元素.打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类呗 显然,地鼠有被锤子击中和未被锤子击中这两种状态,所以需要加载两张图,

  • QT实现贪吃蛇游戏代码详解

    目录 一.新建一个Qt项目 二.添加要用到的头文件 三.写类声明信息 四.对类函数的实现 构造函数 界面刷新 随机奖励的生成 移动 绘图 按键事件 判断蛇身是否相撞 五.结束 一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEvent> #include <QRectF> #include <QPainter> #include

  • Python Pygame实战之欢乐打地鼠游戏

    目录 导语 ​​​一.准备中 二.环境安装 ​三.开始敲代码 1)导入模块 2)不同的图片设置 3)界面头标.标题等. 4)音乐设置 5)右侧窗口控件不同的按钮设置 四.效果展示 导语 闲来无事: 铲屎官用废旧的纸箱,给猫主子做了一个打地鼠玩具,看,主子玩得不亦乐乎 打掉了——咦,怎么还有,怎么还有两个呢?是不是很心动呀?这可是和猫主子增进感情的好机会哦! ​ 哈哈哈!看完上面的简介知道我今天要做什么游戏了吧~嗯哼 对 今天来给大家写一款打地鼠小游戏,宅在家里的无聊的时候可以玩一玩啦!不过文末也

  • Python实现简单扫雷游戏

    本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 #coding: utf-8 __note__ = """ * 扫雷小游戏 * 需要python3.x以上 * 需要安装PyQt5 * pip install PyQt5 """   import sys   try:     import PyQt5 except ImportError:     import tkinter     from tkinter

  • python实现的简单RPG游戏流程实例

    本文实例讲述了python实现的简单RPG游戏流程.分享给大家供大家参考.具体如下: #RPG rpg = True whp = 100 mahp = 100 hhp = 100 MHP = 10 def dgrnd () : wa = raw_input ("What does Warrior do?") ma = raw_input ("What does Mage do?") ha = raw_input ("What does Healer do?

  • Python加pyGame实现的简单拼图游戏实例

    本文实例讲述了Python加pyGame实现的简单拼图游戏.分享给大家供大家参考.具体实现方法如下: import pygame, sys, random from pygame.locals import * # 一些常量 WINDOWWIDTH = 500 WINDOWHEIGHT = 500 BACKGROUNDCOLOR = (255, 255, 255) BLUE = (0, 0, 255) BLACK = (0, 0, 0) FPS = 40 VHNUMS = 3 CELLNUMS

随机推荐