iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt实现打地鼠游戏的方法详解
  • 621
分享到

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

Qt打地鼠游戏Qt 打地鼠Qt 游戏 2022-11-13 18:11:38 621人浏览 薄情痞子
摘要

目录功能讲解1.确定地鼠数量2.定义游戏难易程序3.难度切换4.定时器处理总结今天与大家分享一个小游戏的实现:打地鼠 看一下实现效果吧~ 在指定的时间内打中一定数额的地鼠,否则失败

今天与大家分享一个小游戏的实现:打地鼠

看一下实现效果吧~

在指定的时间内打中一定数额的地鼠,否则失败,就如上述展示效果一样,自己写的小程序,居然连第二关也过不去,还挺尴尬的!

实现打地鼠小游戏不难,最主要的核心就是依靠定时器,按照一定间隔触发。接下来,我来讲解下是如何实现的吧!

功能讲解

开发环境:VS2017 + Qt5.14.2 x64

1.确定地鼠数量

对于打地鼠这款游戏来说,地鼠是从任意的洞口钻出。

在效果中,一共存在6个地鼠洞,最容易实现的方式:创建6个地鼠,每个地鼠洞都对应一个地鼠。

实现代码如下:

for (int i = 0; i < num; i++)
{
	QPushButton *btn = new QPushButton(this);
	int nTop = i / 3 == 0 ? 300 : 450;
	int nRemainder = i % 3;
	if (nRemainder == 0)
	{
		btn->setGeometry(190, nTop, 180, 130);
	}
	else if (nRemainder == 1)
	{
		btn->setGeometry(480, nTop, 180, 130);
	}
	else if(nRemainder == 2)
	{
		btn->setGeometry(780, nTop, 180, 130);
	}
	btn->setStyleSheet(qsBtnStyle);
	btn->setProperty("num", i);
	btn->hide();
	connect(btn, &QPushButton::clicked, this, &QGrameWhacAmole::OnBnClickedSusliks); //选中地鼠
	m_vetBtnCtrls.push_back(btn);
}

代码解析:

num:此刻代表的是6,表明了需要创建6个地鼠,平均分配到每个洞中。

对每个地鼠按钮响应对应的clicked消息,每当打中一个地鼠,OnBnClickedSusliks消息内就对分数+1。

并且,创建出的地鼠默认是隐藏状态的。

2.定义游戏难易程序

在程序中定义了四种难度,设置了枚举类型:

enum ENUM_GameMode
{
	GameMode_difficulty1,
	GameMode_difficulty2,
	GameMode_difficulty3, 
	GameMode_difficulty4, 
	GameMode_OK,
	GameMode_Failed,
};

GameMode_difficulty1:难度1,说明有1个地鼠出没

GameMode_difficulty2:难度2,说明有2个地鼠出没,

GameMode_difficulty3:难度3,说明有3个地鼠出没,

GameMode_difficulty4:难度4,说明有4个地鼠出没

在程序中,如何判断通过某一关呢?

宏定义确定通关分数

#define  difficulty1Count 10 //难度1个数
#define  difficulty2Count 30 
#define  difficulty3Count 60
#define  difficulty4Count 100

当第一关时,只需要打中10个地鼠;第二关需要累计打中30个地鼠,以此类推。

3.难度切换

在OnBnClickedSusliks消息中,根据当前的分数来确定是否要晋级。

响应消息后,对分数进行+1处理

m_nScore += 1;

m_nScore是当前类的成员变量,表示:打中的地鼠次数也就是当前分数。

打中后隐藏该地鼠

当打中某个地鼠后,需要立刻隐藏地鼠,此时就运用到了刚刚在创建地鼠时"setProperty"绑定的变量了。

QPushButton *btn = qobject_cast<QPushButton*>(sender());
int num = btn->property("num").toInt();
m_vetBtnCtrls[num]->hide(); //隐藏对应编号控件

分数判断是否晋级

当分数到达难度1时,晋升成难度2,其它的关卡都一样

if (m_nScore == difficulty1Count) //难度1通过
{
	killTimer(m_nTimerStartId);
	m_nTimerStartId = 0;

	this->HideTotalSucliks();
		
	m_enumMode = GameMode_difficulty2;
	this->SetTipsStyle(m_enumMode);

	m_nTimerStartId = startTimer(difficulty2Time);
	m_dwBeginTime = GetTickCount();
}

当通过第一关后,停止定时器,隐藏正在展示的所有地鼠,更改模式状态,重新设置提示文本,开始定时器,重新记录开始通关时间。

m_dwBeginTime:是记录每次开始游戏时的时间,主要作用于挑战失败的判断,也就是说,每次触发定时器时,当前最新时间与最开始通关时间的差值 大于 通关时间时,说明当前关卡挑战失败!

4.定时器处理

这也是当前小游戏中最核心的处理部分了~

为了方便起见,直接使用QWidget自带的定时器,而不是使用new QTimer的方式

virtual void timerEvent(QTimerEvent *event);

在定时器的处理中,分成了4部分,我们分别讲述~

获取定时器Id的触发消息

if (event->timerId() == m_nTimerStartId)
{
    //消息处理
}

只有当定时器的触发id与我们设定的id一致时,才可以。

关闭提示页面

在进行难度切换时,设置了提示文本,也就是效果图中的“开始”、“开始第二关”等文字提示信息,在进入到定时器事件中,首先判断,该控件是否隐藏?如果未隐藏,先进行隐藏。

if (ui.labTips->isHidden() == false)
{
	ui.labTips->hide();
}

在这里需要我走过一个坑:使用isVisible()不一定获取出控件的显示状态,但是isHidden()始终是有效的

判断当前关卡是否超时?

这也就是上文说到的m_dwBeginTime与最新触发时间的差值

DWord dwTime = GetTickCount() - m_dwBeginTime;
if (dwTime > difficultyTimeout)
{
	this->RunningFailed();
}

根据关卡不同,显示不同的地鼠

这里,就是对地鼠显示的逻辑处理了,根据枚举模式不同,分别处理

switch (m_enumMode)
{
case QGrameWhacAmole::GameMode_difficulty1:
	this->RunningGamedifficulty(1);
break;
case QGrameWhacAmole::GameMode_difficulty2:
	this->RunningGamedifficulty(2);
break;
case QGrameWhacAmole::GameMode_difficulty3:
	this->RunningGamedifficulty(3);
break;
case QGrameWhacAmole::GameMode_difficulty4:
	this->RunningGamedifficulty(4);
break;
default:
break;
}

核心函数是:RunningGamedifficulty

如何让地鼠进行随机显示呢?

在当前例子中,获取随机数[0,6)之间的值,随机到哪个数,哪个下标下对应的地鼠被显示,其余的地鼠处于隐藏状态。

随机数生成方法:

int QGrameWhacAmole::GetRandomNumber()
{
	QTime time = QTime::currentTime();
	qsrand(time.msec() + time.second() * 1000);
	int n = qrand() % 6;
	return n;
}

有人说使用这种方法可以在短时间内生成的随机数不相同,这个方法我已经验证过了,不行!

还有的人说可以添加sleep,我也尝试过了,不行!

那么,该如何获取不重复的随机数呢?

在这里,采用了std::set<int>容器的方式,RunningGamedifficulty中的部分代码如下:

void QGrameWhacAmole::RunningGamedifficulty(int nCount)
{
    1:随机数生成
    std::set<int> setRandom; //存储随机数
    for (int i = 0; setRandom.size() < nCount; i++)
    {
	//获取随机数
	int num = this->GetRandomNumber();
	//如果随机数在容器中从未出现过,存储并应用
	if (setRandom.size() != 0)
	{
		std::set<int>::iterator itFind = setRandom.find(num);
		if (itFind != setRandom.end())
		{
			continue; //存在重复值,后续不进行处理
		}
	}
	//容器中存在数据,存储之前进行判断
	setRandom.insert(num);
     }
        
        
}

根据上述代码也可以看出,每生成一个随机数,就进行存储,当容器中出现相同的随机数时,重新生成。

nCount:就是需要展示的地鼠个数,在for循环中,中间的判断条件与以往不同,当有效地地鼠编号大于地鼠个数后,就不再获取随机数了。

这种方式,无论是获取多少个地鼠个数都是适用的。

其次,根据获取的显示的地鼠下标数就可以对所有的地鼠进行做显示、隐藏操作了,代码如下:

for (int m = 0; m < m_vetBtnCtrls.size(); m++)
{
	std::set<int>::iterator itNum = setRandom.find(m);
	if (itNum != setRandom.end())
	{
		m_vetBtnCtrls[m]->show();
	}
	else
	{
		m_vetBtnCtrls[m]->hide();
	}
}

总结

到这里,核心的实现功能就已经讲解完了,功能难点:

1:根据地鼠个数随机显示地鼠位置(RunningGamedifficulty处理逻辑)。

2:关卡晋级。

3:挑战失败处理。

到此这篇关于Qt实现打地鼠游戏的方法详解的文章就介绍到这了,更多相关Qt打地鼠游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt实现打地鼠游戏的方法详解

本文链接: https://www.lsjlt.com/news/169165.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt实现打地鼠游戏的方法详解
    目录功能讲解1.确定地鼠数量2.定义游戏难易程序3.难度切换4.定时器处理总结今天与大家分享一个小游戏的实现:打地鼠 看一下实现效果吧~ 在指定的时间内打中一定数额的地鼠,否则失败...
    99+
    2022-11-13
    Qt打地鼠游戏 Qt 打地鼠 Qt 游戏
  • Python实现打地鼠游戏
    目录开发工具相关模块环境搭建原理简介主要代码开发工具 python版本:3.6.4 相关模块 pygame;以及一些python自带的模块。 环境搭建 安装python并添加到环境变...
    99+
    2024-04-02
  • JavaScript实现打地鼠游戏
    本文实例为大家分享了JavaScript实现打地鼠游戏的具体代码,供大家参考,具体内容如下 游戏说明: 点击"开始游戏"按钮,在图中随机产生老鼠,老鼠消失前单击老鼠进行击打,打中一次...
    99+
    2024-04-02
  • Python如何实现打地鼠游戏
    这篇文章主要讲解了“Python如何实现打地鼠游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python如何实现打地鼠游戏”吧!开发工具python版本:3.6.4相关模块pygame;...
    99+
    2023-06-22
  • JavaScript实现简单打地鼠游戏
    本文实例为大家分享了JavaScript实现打地鼠游戏的具体代码,供大家参考,具体内容如下 效果如下: html代码: <!DOCTYPE html> <ht...
    99+
    2024-04-02
  • js实现如何打地鼠小游戏
    这篇文章将为大家详细讲解有关js实现如何打地鼠小游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。请看代码:<!doctype html> <...
    99+
    2024-04-02
  • PythonPygame实战之打地鼠小游戏
    目录前言开发工具环境搭建原理简介前言 今天给大家写一个个打地鼠小游戏,废话不多说直接开始~ 开发工具 Python版本: 3.6.4 相关模块: pygame模块; 以及一...
    99+
    2024-04-02
  • Python Pygame实战之欢乐打地鼠游戏
    目录导语​​​一、准备中二、环境安装​三、开始敲代码1)导入模块2)不同的图片设置3)界面头标、标题等。4)音乐设置5)右侧窗口控件不同的按钮设置四、效果展示导语 闲来无事: 铲屎...
    99+
    2024-04-02
  • Java编程实现打地鼠文字游戏实例代码
    控制台输入数字,与随机数匹配,匹配正确则返回“打中了!”匹配错误则返回“太遗憾!没打中!”package hitmouse; import java.util.Random; import java.util.Scanner; public...
    99+
    2023-05-30
    java 打地鼠代码 游戏
  • Python中怎么用Pygame实现欢乐打地鼠游戏
    这篇“Python中怎么用Pygame实现欢乐打地鼠游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中怎么用P...
    99+
    2023-06-29
  • QT实现贪吃蛇游戏代码详解
    目录一、新建一个Qt项目二、添加要用到的头文件三、写类声明信息四、对类函数的实现构造函数界面刷新随机奖励的生成移动绘图按键事件判断蛇身是否相撞五、结束一、新建一个Qt项目 新建Qt ...
    99+
    2024-04-02
  • Qt怎么实现方块游戏
    这篇“Qt怎么实现方块游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Qt怎么实现方块游戏”文章吧。1.方块游戏架构在这个...
    99+
    2023-07-05
  • Qt项目实战之方块游戏的实现
    目录1.方块游戏架构2.游戏逻辑3.效果图4.具体实现1.方块游戏架构 在这个游戏中,有一个区域用来摆放方块,该区域宽为10,高为20,以小正方形为单位,它可以看作是拥有20行10列...
    99+
    2023-03-19
    Qt实现方块游戏 Qt方块游戏 Qt游戏
  • Java实现简易拼图游戏的方法详解
    目录效果展示游戏结构实现代码效果展示 介绍:游戏共有五张图片可以选择,分成了4 X 4 十六个方格,点击开始就可以开始游戏。游戏运行的截图如下: 游戏结构 实现代码 代码如下:M...
    99+
    2024-04-02
  • Python实现猜拳与猜数字游戏的方法详解
    至此,我们的 Python零基础入门篇 的系列专栏到今天基本上算是结束了。今天没有任何的知识点,只是运用我们之前学习过的知识做两个小游戏的案例。第一个是模拟猜拳的小游戏,第二个就是猜...
    99+
    2024-04-02
  • java实现打砖块游戏算法
    一个打砖块游戏算法,供大家参考,具体内容如下 这里有一个打砖块游戏:小明面前有很多砖块,每个砖块上有一个字符,小明每击中一个砖块,会产生一个分值,而总分即这些分值总和。砖块上的字符可...
    99+
    2024-04-02
  • win7下360游戏大厅打不开无法玩游戏的解决方法
    想必有很多都喜欢在空闲时间打打游戏打发时间吧,而360游戏大厅为用户提供最热门的网页游戏及上万款精品小游戏,所有游戏即点即玩,不过有很多用户反映说360游戏大厅打不开,这是怎么回事呢?现在就随小编来学习一下解决win7下...
    99+
    2023-06-05
    win7 360游戏大厅 大厅 解决 游戏 玩游戏
  • PythonPygame实现落球游戏详解
    目录引包初始化配置捕捉事件填充屏幕让球下落完整代码引包 引入对应的包,和原来一样写一个打印文字的方法 import sys, random,  pygame from pygame....
    99+
    2024-04-02
  • C语言 小游戏打砖块实现流程详解
    始祖是美国英宝格公司(en:Atari Games,ja:アタリ (ゲーム))于1976年推出的街机游戏“Breakout”(en:Breakout),由该公司在1972年发行的“...
    99+
    2024-04-02
  • JavaScript实现生命游戏的方法
    这篇文章主要介绍JavaScript实现生命游戏的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript是一种什么语言javascript是一种动态类型、弱类型的语言,基于对象和事件驱动并具有相对安全...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作