【Qt】三种方式实现抽奖小游戏

这篇具有很好参考价值的文章主要介绍了【Qt】三种方式实现抽奖小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

本文章是基本Qt与C++实现一个抽奖小游戏,用到的知识点在此前发布的几篇文章。
下面是跳转链接:
【Qt控件之QLabel】用法及技巧链接: https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm=1001.2014.3001.5501

【Qt控件之QPushButton】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133692079?spm=1001.2014.3001.5501

【Qt控件之QDialog】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133721638?spm=1001.2014.3001.5501

【Qt控件之QMainWindow】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133722035?spm=1001.2014.3001.5501

【Qt控件之QTimer】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133722476?spm=1001.2014.3001.5501

实现方式

实现方式多种多样,但毕竟是小程序,需求明确(就没考虑操作及优化),功能简单,条理清晰,主要提供三种实现方式(此阶段未实现概率设置,之后再发布概率设置版本吧):

1. 基于while循环
  • 示例:
    先粘贴UI
    【Qt】三种方式实现抽奖小游戏,Qt记录,Qt编程,c++,qt,c++,开发语言

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_FORWARD_DECLARE_CLASS(C_DlgSetting)

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // 退出
    void slot_actQuit_triggered();
    // 设置概率
    void slot_actSetting_triggered();
    // 开始
    void slot_btnStart_clicked();
    // 停止
    void slot_btnStop__clicked();

private:
    Ui::MainWindow *ui;

    C_DlgSetting*       m_pDlgSetting; // 概率设置类

    bool                m_bFlag = false;// 标志
};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "DlgSetting.h"

#include <QTime>
#include <QThread>
#include <QCoreApplication>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // m_pDlgSetting = new C_DlgSetting(this);

    // 信号和槽
    {
        connect(ui->action_quit, &QAction::triggered, this, &MainWindow::slot_actQuit_triggered);
        connect(ui->action_setting, &QAction::triggered, this, &MainWindow::slot_actSetting_triggered);
        connect(ui->btn_start, &QPushButton::clicked, this, &MainWindow::slot_btnStart_clicked);
        connect(ui->btn_stop, &QPushButton::clicked, this, &MainWindow::slot_btnStop__clicked);
    }

    // 声明随机数种子,不然就是伪随机(每次产生的随机数都一样)
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slot_actQuit_triggered()
{
    close();
}

void MainWindow::slot_actSetting_triggered()
{
    // m_pDlgSetting->exec();
}

void MainWindow::slot_btnStart_clicked()
{
    if(m_bFlag)
    {
        return;
    }
    QStringList sl;
    sl << "一等奖" << "二等奖" << "三等奖" << "四等奖" << "五等奖";
    m_bFlag = true;
    while (m_bFlag) {
        int nRange = qrand() % 5;
        ui->label_turn->setText(sl.at(nRange));
        // 100ms转一次
        QThread::msleep(100);
        // 防止界面卡死
        QCoreApplication::processEvents();
    }
}

void MainWindow::slot_btnStop__clicked()
{
    m_bFlag = false;
    // 显示最终获奖结果
    QString strRes = QString("最终结果: %1").arg(ui->label_turn->text());
    ui->label_res->setText(strRes);
}

.main

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

  • 结果
    【Qt】三种方式实现抽奖小游戏,Qt记录,Qt编程,c++,qt,c++,开发语言
  • 实现思路
    – 设置UI,注意命名
    – 进行信号和槽连接
    – 实现"开始"和"结束"功能
    – 显示结果
2. 基于定时器
  • 示例
    UI显示与1.是一样的,需借助QTimer实现

QTimer 是 Qt 框架中的一个类,用于在特定的时间间隔后发出一个信号。它是 Qt
的事件循环系统的一部分,该系统允许程序在等待某些事件(如用户输入或定时器超时)时保持响应。

QTimer 的工作原理是将定时器的超时作为一个事件添加到 Qt
的事件队列中。当事件循环检测到定时器超时时,它就会发出预定的信号。这种机制允许 QTimer
在等待定时器超时时不会阻塞用户界面,因为事件循环可以继续处理其他事件,如用户输入或绘制事件。

相比之下,如果使用标准的 C++ 定时器,如
std::this_thread::sleep_for,在等待定时器超时时,当前线程将被阻塞,无法处理其他事件。这会导致用户界面无响应,给用户一种程序已经卡死的感觉。

直接粘贴相关代码:
.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    // 退出
    void slot_actQuit_triggered();
    // 开始
    void slot_btnStart_clicked();
    // 停止
    void slot_btnStop__clicked();
    // 定时器处理
    void slot_timeout();

private:
    Ui::MainWindow *ui;
    bool                m_bFlag = false;// 标志

    QTimer*             m_pTimer;// 定时器
};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QTime>
#include <QThread>
#include <QCoreApplication>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_pTimer = new QTimer(this);
    // 处理
    connect(m_pTimer, &QTimer::timeout, this, &MainWindow::slot_timeout);

    // 信号和槽
    {
        connect(ui->action_quit, &QAction::triggered, this, &MainWindow::slot_actQuit_triggered);
        connect(ui->btn_start, &QPushButton::clicked, this, &MainWindow::slot_btnStart_clicked);
        connect(ui->btn_stop, &QPushButton::clicked, this, &MainWindow::slot_btnStop__clicked);
    }

    // 声明随机数种子,不然就是伪随机(每次产生的随机数都一样)
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slot_actQuit_triggered()
{
    close();
}
void MainWindow::slot_btnStart_clicked()
{
	// 此处可先判断定时器是否处于活动状态,如果是,则返回;否则,再启动
	// ToDoSomething
	{
	
	}
    m_pTimer->start(100);
}

void MainWindow::slot_btnStop__clicked()
{
    m_pTimer->stop();
    // 显示最终获奖结果
    QString strRes = QString("最终结果: %1").arg(ui->label_turn->text());
    ui->label_res->setText(strRes);
}

void MainWindow::slot_timeout()
{
    QStringList sl;
    sl << "一等奖" << "二等奖" << "三等奖" << "四等奖" << "五等奖";
    int nRange = qrand() % 5;
    ui->label_turn->setText(sl.at(nRange));
}

  • 实现思路
    – 点击"开始",启动定时器
    – “定时器"实现界面刷新
    – 点击"结束”,停止定时器,并将结果显示
3. 基于线程
  • 实现思路(等之后发布线程文章后,实现)
    – 在主窗口创建一个线程对象
    – 点击"开始",将信号发送到线程中,用于更新几等奖
    – 线程将更新后的信息发送到主窗口
    – 主窗口动态显示
    – 点击"结束",停止线程,显示结果

go.文章来源地址https://www.toymoban.com/news/detail-727040.html

到了这里,关于【Qt】三种方式实现抽奖小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT-贪吃小游戏

    https://download.csdn.net/download/u013083044/88758860

    2024年01月19日
    浏览(52)
  • QT-QML2048小游戏

    https://download.csdn.net/download/u013083044/88758829

    2024年01月19日
    浏览(42)
  • Unity学习记录:制作双屏垃圾分类小游戏

    要实现的功能 游戏操作 在规定时间内,垃圾通过拖拽进入正确垃圾桶的容器,垃圾在这里消失,飞入第二个屏上对应垃圾桶的位置并实现加分和加时间的效果,垃圾拖拽进入不正确的垃圾桶,垃圾会返回到原来的位置,同时,相应的时间也会减少 胜利和失败的条件: 胜利:

    2024年02月03日
    浏览(54)
  • 使用QT制作贪吃蛇小游戏(含登录注册界面)

    login.h register.h user.h userlist.h widget.h login.cpp main.cpp register.cpp user.cpp userlist.cpp widget.cpp login.ui register.ui widget.ui

    2024年02月13日
    浏览(42)
  • Unity项目转微信小游戏踩坑记录

    1.首先 你需要去他的SDK地址,去下载SDK,并浏览一下相关流程内容       这个SDK现在没有一个长期稳定的版本,基本三天一小更,五天一大更。所以你懂的,更新之前好好看看更新的内容在决定。 2.webgl不支持多线程,Socket,同步加载。如果项目用到比较多的这些内容,工作

    2024年02月09日
    浏览(46)
  • Unity微信小游戏使用微信云开发记录

    最近项目上架微信小游戏,首先使用了微信官方sdk转成微信小游戏,官方地址如下: https://github.com/wechat-miniprogram/minigame-unity-webgl-transform 官方给了各种指导,虽然都有但是都不太精哈哈 因为要做排行榜,云存档,而我司没服务器,那只能用微信云开发了。具体开通啥的初始

    2023年04月09日
    浏览(54)
  • python小游戏 2048小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 2048小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 今天我们用python实现

    2024年02月11日
    浏览(56)
  • python小游戏 拼图小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 拼图小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 游戏规则: 将图像

    2024年02月08日
    浏览(51)
  • python小游戏 滑雪小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 滑雪小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 我们利用python制作

    2024年02月04日
    浏览(46)
  • python小游戏 接金币小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 接金币小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:3分 基于python实现的

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包