Qt实现一个抽奖游戏
首先来看一下效果:
这是主页面,点击Go按钮开始产生随机数,从而决定选中哪个奖品。
如果是单纯的产生一个随机数,直接调用Qt封装好的函数即可。然而这个例子比较有意思的点是:
在生成一个1到9之间的随机数时,可以保证每个数生成的概率都相等。比如说,生成9次,每次生成的值各不相同。直观点说,当我们有九次机会抽奖时,可以保证每次抽到的奖都不重复,不会出现第一次抽到苹果,第二次还抽到苹果的情况。其实这个思路源于leetcode 519题,我当时读完这道题,感觉可以做一个抽奖游戏,这便来了。
那具体思路是怎样的呢?
系统中的随机函数可以在给定范围内产生一个随机值,比如我们要一个[1,9]间的随机值,可以这样写:
rand() % 9 + 1;
我们还是利用这个函数,不过需要增加一个映射关系。具体:
在产生随机值时,让第一次产生1-9间的随机值,第二次产生1-8间的随机值,第三次产生1-7间的随机值,依次。。。
第一次产生随机值时,范围为[1, 9]:若随机值为3,返回3,同时建立一个hash[3] = 9的映射。
第二次产生随机值时,范围为[1, 8]:若随机值还为3,因为产生的随机值不能重复,这时返回hash[3]即9,同时更改hash[3]的映射为8,(当下次还产生3时,返回8)
第三次产生随机值时,范围为[1, 7]:若随机值为6,返回6,同时建立hash[6] = 7的映射。
第四次产生随机值时,范围为[1, 6]:若随机值为4,返回4,建立4到6的映射,但6已经被选过了,所以建立hash[4] = hash[6] == 7的映射关系。(当下次还产生4时,返回7)
依次类推,是不是很巧妙。
总结一下:
当产生一个随机值时,如果它之前没有产生过,直接返回它。如果它之前产生过了,则返回它的映射值(它的映射值一定是在右边部分的)同时产生随机数的范围从右向左不断缩小,右边部分的值,只能通过映射的关系取出。
在第四次结束后,如果今后都不产生4了,是不是也就拿不到7了?
其实并不然,当有需要建立某个数到4的映射关系时,发现4的映射是7,这时就能拿到7了。所以可以保证每个数都可以被取到。
看一下代码实现:
int Widget::customRandom()
{int iReturn;int iRandom = QRandomGenerator::global()->bounded(m_iPrizeNumber) + 1;//返回未产生过的随机值if (m_hashMap.count(iRandom)) {iReturn = m_hashMap[iRandom];} else {iReturn = iRandom;}//建立映射关系if (m_hashMap.count(m_iPrizeNumber)) {m_hashMap[iRandom] = m_hashMap[m_iPrizeNumber];} else {m_hashMap[iRandom] = m_iPrizeNumber;}//范围不断缩小m_iPrizeNumber--;return iReturn;
}
这便是整个产生随机值的过程了,也是例子最重要的部分了。
剩下的便是Qt界面相关了,主要用到定时器,不断的给每个方框加边框,产生动画效果。以及当选中某个方框时,方框中的图片(QLabel)显示出来。默认方框中的QLabel都是隐藏的,即看不见奖品。
源码(包含可执行程序):
https://gitee.com/gao-yuelong/qtdemo/tree/master/Lucky
欢迎试玩。
Qt实现一个抽奖游戏相关推荐
- 用Qt写一个迷宫游戏
用Qt写一个迷宫游戏 一段时间以前,我用c写了个使用随机数生成迷宫的代码,现在在自学学Qt,于是就想到了利用这个代码改一个小游戏. 现在记录一下自己的学习过程,也算抛砖引玉,各位看官请多指教. 话不多 ...
- html做一个抽奖游戏,js实现大转盘抽奖游戏实例
/p> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> js抽奖 td{width:50px;he ...
- 前端Vue简单编写一个幸运大转盘抽奖游戏
最近公司有一个需求要做一个抽奖类的大转盘游戏配合运营推广,先看看大概的界面ui图吧 使用rotate计算每一个奖项的角度进行奖项的布局 <ul class="gift-containe ...
- 【《关于我一个小学生用C++写了个抽奖游戏这件事》】
<关于我一个小学生用C++写了个抽奖游戏这件事> 本人6年级小学生一名,初学C++,最近闲来无事做了个游戏--<最成功的抽奖游戏>,当然,是我认为我做过最成功的C++游戏,不说 ...
- 使用Qt写一个简单的五子棋单机小游戏
使用Qt写一个简单的五子棋单机小游戏 刚学,不够专业请勿喷,有不对的地方还请指出,我渴望进步!现在贴出这个游戏我原创的所有代码.希望可以帮到有需要的人. 游戏界面: 因为后面添加了.wav的音频文件, ...
- python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密
原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...
- python抽奖教程_利用Python写一个抽奖程序,解密游戏内抽奖的秘密|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 分析需求 我们先整理下思路,目标是什么?目标是要写一个抽奖程序,那么抽奖程序的核心是什么?当然是如何判断一 ...
- 500行代码写一个俄罗斯方块游戏
导读:本文我们要制作一个俄罗斯方块游戏. 01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这 ...
- python抽奖游戏_python实现转盘效果 python实现轮盘抽奖游戏
本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下 #抽奖 面向对象版本 import tkinter import time import threading clas ...
- python设计抽奖游戏 球_python3实现小球转动抽奖小游戏
最近老师在讲 tkinter,所以我做了一个抽奖小游戏. 一.效果图 先上效果图.红色的小球会围绕蓝色小球做环形运动.我设置的四个角是奖品,其余的都是再接再厉. 二.方法 基于tkinter中的but ...
最新文章
- 作弊翻车!Kaggle 大赛第一团队获最严处分
- 排序算法-08基数排序(python实现)
- BigDecimal类的使用
- X明X源面试题《三》
- 机器学习-百度笔试题
- VirtualLab初学者教程-2.搭建一个光学系统
- 2018 UL国际皇冠杯将于10月4日-7日在仁川举行
- Apache Tomcat 文件包含漏洞(CNVD-2020-10487/CVE-2020-1938)
- python根据题库答案自动答题_python实现百万答题自动百度搜索答案
- cesium 3d建筑物光效 泛光实体
- 光流(七)--Brox算法(DeepFlow)
- 【数论】——Catalan 卡特兰数
- 网站SEO报告和代码工具平台系统源码
- Algorithm 算法常用术语
- 智能表带如何为Apple Watch添加功能
- nextpolish安装_NECAT: Nanopore数据的高效组装工具
- [转]	 去大公司还是去小公司?做专业性的工作,还是做销售?
- 题目:L2-031 深入虎穴 (25 分)
- Redis通用操作指令
- 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖
热门文章
- coturn源码解析
- 百度AI之身份证识别
- mysql修改数据sql语句_sql语句修改数据
- 用java或c语言编写真值表,离散数学C语言
- ubuntu中vim编辑器的安装与基本使用
- 在学校报名了计算机一级考试时间,2020年山东计算机一级报名及考试时间
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- Shiro框架(一)-Shiro概述
- Shiro - Shiro简介;Shiro与Spring Security区别;Spring Boot集成Shiro
- 西门子1200走总线FB284控制3台V90伺服和相机调整角 度,DP通讯控制FANUC机器人