首先来看一下效果:

这是主页面,点击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实现一个抽奖游戏相关推荐

  1. 用Qt写一个迷宫游戏

    用Qt写一个迷宫游戏 一段时间以前,我用c写了个使用随机数生成迷宫的代码,现在在自学学Qt,于是就想到了利用这个代码改一个小游戏. 现在记录一下自己的学习过程,也算抛砖引玉,各位看官请多指教. 话不多 ...

  2. html做一个抽奖游戏,js实现大转盘抽奖游戏实例

    /p> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> js抽奖 td{width:50px;he ...

  3. 前端Vue简单编写一个幸运大转盘抽奖游戏

    最近公司有一个需求要做一个抽奖类的大转盘游戏配合运营推广,先看看大概的界面ui图吧 使用rotate计算每一个奖项的角度进行奖项的布局 <ul class="gift-containe ...

  4. 【《关于我一个小学生用C++写了个抽奖游戏这件事》】

    <关于我一个小学生用C++写了个抽奖游戏这件事> 本人6年级小学生一名,初学C++,最近闲来无事做了个游戏--<最成功的抽奖游戏>,当然,是我认为我做过最成功的C++游戏,不说 ...

  5. 使用Qt写一个简单的五子棋单机小游戏

    使用Qt写一个简单的五子棋单机小游戏 刚学,不够专业请勿喷,有不对的地方还请指出,我渴望进步!现在贴出这个游戏我原创的所有代码.希望可以帮到有需要的人. 游戏界面: 因为后面添加了.wav的音频文件, ...

  6. python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...

  7. python抽奖教程_利用Python写一个抽奖程序,解密游戏内抽奖的秘密|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 分析需求 我们先整理下思路,目标是什么?目标是要写一个抽奖程序,那么抽奖程序的核心是什么?当然是如何判断一 ...

  8. 500行代码写一个俄罗斯方块游戏

    导读:本文我们要制作一个俄罗斯方块游戏. 01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这 ...

  9. python抽奖游戏_python实现转盘效果 python实现轮盘抽奖游戏

    本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下 #抽奖 面向对象版本 import tkinter import time import threading clas ...

  10. python设计抽奖游戏 球_python3实现小球转动抽奖小游戏

    最近老师在讲 tkinter,所以我做了一个抽奖小游戏. 一.效果图 先上效果图.红色的小球会围绕蓝色小球做环形运动.我设置的四个角是奖品,其余的都是再接再厉. 二.方法 基于tkinter中的but ...

最新文章

  1. 作弊翻车!Kaggle 大赛第一团队获最严处分
  2. 排序算法-08基数排序(python实现)
  3. BigDecimal类的使用
  4. X明X源面试题《三》
  5. 机器学习-百度笔试题
  6. VirtualLab初学者教程-2.搭建一个光学系统
  7. 2018 UL国际皇冠杯将于10月4日-7日在仁川举行
  8. Apache Tomcat 文件包含漏洞(CNVD-2020-10487/CVE-2020-1938)
  9. python根据题库答案自动答题_python实现百万答题自动百度搜索答案
  10. cesium 3d建筑物光效 泛光实体
  11. 光流(七)--Brox算法(DeepFlow)
  12. 【数论】——Catalan 卡特兰数
  13. 网站SEO报告和代码工具平台系统源码
  14. Algorithm 算法常用术语
  15. 智能表带如何为Apple Watch添加功能
  16. nextpolish安装_NECAT: Nanopore数据的高效组装工具
  17. [转] 去大公司还是去小公司?做专业性的工作,还是做销售?
  18. 题目:L2-031 深入虎穴 (25 分)
  19. Redis通用操作指令
  20. 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖

热门文章

  1. coturn源码解析
  2. 百度AI之身份证识别
  3. mysql修改数据sql语句_sql语句修改数据
  4. 用java或c语言编写真值表,离散数学C语言
  5. ubuntu中vim编辑器的安装与基本使用
  6. 在学校报名了计算机一级考试时间,2020年山东计算机一级报名及考试时间
  7. Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
  8. Shiro框架(一)-Shiro概述
  9. Shiro - Shiro简介;Shiro与Spring Security区别;Spring Boot集成Shiro
  10. 西门子1200走总线FB284控制3台V90伺服和相机调整角 度,DP通讯控制FANUC机器人