1.效果图
以下是点击开奖按钮后的开奖结果
2.代码部分
2.1简单构思
设定双色球由6个红球和1个蓝球组成,红球1-33,蓝球1-16,我们这边自己规定中三个相同号码即中五等奖以上其他奖项按相同号码数目依次叠加。
由用户输入号码和随机生成号码组成,以及使用定时器使页面的随机号码数字动起来。
具体可见代码注释,超详细!!!
2.2头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QString>
#include <stdlib.h>
#include <time.h>
#include <QWidget>
#include <QTimer>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void getzjnum();
void getusernum();
void quch(int,int);
void duijiang();
int isSave(int nums[],int len,int tag);
int suiji();
private:
Ui::Widget *ui;
int usernum[7] = {0};
int zjnum[7] = {0};
int num = 0;
int useri = 0;
QTimer *timer;
public slots:
void start();
void getnum();
};
#endif // WIDGET_H
2.3源文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建定时器对象
timer = new QTimer;
//设置随机数种子
srand(time(NULL));
//设置开始按钮的信号与槽函数
connect(ui->startbtn,SIGNAL(clicked(bool)),this,SLOT(start()));
//设置随机数对象的信号与槽函数
connect(timer,&QTimer::timeout,this,&Widget::getnum);
}
Widget::~Widget()
{
delete ui;
}
//获取随机数组的函数
void Widget::getzjnum()
{
for (int i = 0; i < 7; i++)
{
if(i != 6)
{
int x = (rand() % 33) + 1;
int t = isSave(zjnum,6,x);
if (t)
{
i--;
continue;
}
zjnum[i] = x;
}
else
{
int x = rand() % 16 + 1;
zjnum[i] = x;
}
}
}
void Widget::getusernum()
{ //获取页面用户输入数据并调用去重函数将其存入用户数组中
quch(ui->red1->text().toInt(),0);
quch(ui->red2->text().toInt(),1);
quch(ui->red3->text().toInt(),2);
quch(ui->red4->text().toInt(),3);
quch(ui->red5->text().toInt(),4);
quch(ui->red6->text().toInt(),5);
quch(ui->userblue->text().toInt(),6);
}
//去重和限制范围函数unmu为接收用户输入的形参,i 为用户输入数字的序号 方便用做赋值数组的下标
void Widget::quch(int unum,int i)
{ //如果小于1大于33的数,在页面上展示不在范围,并结束函数,不让继续执行
if(unum < 1 || unum > 33){
ui->zjtext->setText(QString::number(unum) + "不在输入范围");
return;
}
//将最后一个数进行范围判断
if(i == 6){
if(unum > 16){
ui->zjtext->setText(QString::number(unum) + "不在输入范围");
return;
}
usernum[i] = unum;
}else{
// 对前六个数进行判断,结束函数并在页面显示
int t = isSave(usernum,6,unum);
if (t)
{
ui->zjtext->setText(QString::number(unum) + "重复输入");
return;
}else{
usernum[i] = unum;
}
}
}
//兑奖函数,用用户输入数组和随机的数组进行查找比对,进行开奖
void Widget::duijiang()
{
for(int i = 0;i < 6;i++){
for(int j = 0; j < 6;j++){
if(usernum[i] == zjnum[j]){
num++;
}
}
}
if(usernum[6] == zjnum[6]){
num++;
}
switch (num) {
case 7: ui->zjtext->setText("一等奖2000万");
break;
case 6: ui->zjtext->setText("二等奖20万");
break;
case 5: ui->zjtext->setText("三等奖1万");
break;
case 4: ui->zjtext->setText("四等奖200");
break;
case 3: ui->zjtext->setText("五等奖5块");
break;
default:
ui->zjtext->setText("感谢好心人!");
break;
}
}
//判断重复函数,1代表有重复,0代表无
int Widget::isSave(int nums[],int len,int tag)
{
for(int i = 0; i < len; i++)
{
if(nums[i] == tag)
{
return 1;
}
}
return 0;
}
//获取一个1-33的随机数,并使其返回该数
int Widget::suiji()
{
int x = rand() % 33 + 1;
return x;
}
void Widget::start()
{ //使点击开始按钮后,页面显示中奖结果区域显示 开奖中。
ui->zjtext->setText("开奖中");
//将用来记录结果得变量和数组都重置,以免下次使用有残留值
for(int i = 0;i < 7;i++){
zjnum[i] = 0;
usernum[i] = 0;
}
num = 0;
//调用获取随机双色球的函数,生成并存入数组中,以备后续取用。
getzjnum();
//开启定时器,每80毫秒发一次信号并执行对应的槽函数getnum()
timer->start(80);
//调用获取用户输入的号码组 函数
getusernum();
}
void Widget::getnum()
{
//定义一个静态局部变量,用于控制定时器执行的次数
static int i = 0 ;
//执行30次本函数,并在页面动态展示30次
if(i<30){
// qDebug() << suiji() << endl;
ui->jxred1->setText(QString::number(suiji()));
ui->jxred2->setText(QString::number(suiji()));
ui->jxred3->setText(QString::number(suiji()));
ui->jxred4->setText(QString::number(suiji()));
ui->jxred5->setText(QString::number(suiji()));
ui->jxred6->setText(QString::number(suiji()));
ui->jxblue->setText(QString::number((rand() % 16) + 1));
}else{
//在大于三十次后,停止定时器,并使其记录定时器次数的 i 值归零方便下次使用
timer->stop();
//在定时器停止后调用兑奖函数,以免过快将结果展示出来
duijiang();
i = 0;
//将存入随机获取的数组中的数取出分别展示在页面上
ui->jxred1->setText(QString::number(zjnum[0]));
ui->jxred2->setText(QString::number(zjnum[1]));
ui->jxred3->setText(QString::number(zjnum[2]));
ui->jxred4->setText(QString::number(zjnum[3]));
ui->jxred5->setText(QString::number(zjnum[4]));
ui->jxred6->setText(QString::number(zjnum[5]));
ui->jxblue->setText(QString::number(zjnum[6]));
}
i++;//定时器次数累加
}