16-1猜数字练习

猜数字游戏

通过随机函数产生一个随机的四位数,用户在规定的时间去猜,每猜一次都出提示,数对了还是数大了或小了。

页面切换

语句:

ui->stackedWidget->setCurrentWidget(ui->pageStart);

在设计器中利用控件Stacked Widget加载4个页面:

前两个是游戏页面,后两个用于播放动画。(可不要)

首页的猜数时间

Combo Box可以直接点击去设定,不要代码去设置。

四个按钮需要转到槽:进入游戏、退出游戏、退格键、提示键

0~9数字键可以使用同一个槽函数,因此最好自拟。

源代码:

widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QString>

#include <QMovie>

#include <QTimerEvent>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

    void timerEvent(QTimerEvent *e);

private slots:

    void on_btnRun_clicked();

    void on_btnClose_clicked();

    void on_btnReturn_clicked();

    void on_btnTip_clicked();

public slots:

    void dealNum();

private:

    Ui::Widget *ui;

    int gameTime;       //游戏时间

    QString strRand;    //随机数

    int gameTimerId;    //游戏时间定时器ID

    int overTimerId;    //失败动画定时器ID

    int winTimerId;     //成功动画定时器ID

    QString strResult;  //结果数

    QMovie overMovie;   //失败动画

    QMovie winMovie;    //胜利动画

};

#endif // WIDGET_H

widget.cpp

#include "widget.h"

#include "ui_widget.h"

#include <QDebug>

#include <QTime>

#include <QMessageBox>

#include <QObject>

#include <QPushButton>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    //显示开始页面

    ui->stackedWidget->setCurrentWidget(ui->pageStart);

    //初始化数据

    //加载失败动画

    overMovie.setFileName("../1.jpg");

    //给标签设置动画

    ui->labelOver->setMovie(&overMovie);

    //让动画自动适应标签大小

    ui->labelOver->setScaledContents(true);

    //加载成功动画

    winMovie.setFileName("../12.jpg");

    //给标签设置动画

    ui->labelWin->setMovie(&winMovie);

    //让动画自动适应标签大小

    ui->labelWin->setScaledContents(true);

    //数字键

    //作用相同,均连接到同一个槽函数

    connect(ui->btn0,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn1,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn2,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn3,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn4,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn5,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn6,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn7,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn8,&QPushButton::clicked,this,&Widget::dealNum);

    connect(ui->btn9,&QPushButton::clicked,this,&Widget::dealNum);

}

Widget::~Widget()

{

    delete ui;

}

void Widget::on_btnRun_clicked()

{

    //获取下拉框游戏时间,.toInt():字符换转换成int

    gameTime=ui->comboBox->currentText().toInt();

    //切换到游戏界面

    // ui->stackedWidget->setCurrentWidget(1);  //1是第二个页面

    ui->stackedWidget->setCurrentWidget(ui->pageGame);

    int num;

    //以从0时0分0秒到现在的秒数为种子

    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    //保证是四位数

    while((num=qrand()%10000)<999);

    //把int类型转换成string

    strRand=QString::number(num);

    qDebug()<<"randnum="<<strRand;

    //设置进度条

    ui->progressBar->setMinimum(0);

    ui->progressBar->setMaximum(gameTime);

    ui->progressBar->setValue(gameTime);

    gameTimerId=0;

    //启动定时器

    gameTimerId=startTimer(1000);

    strResult.clear();

    ui->textEdit->clear();

}

void Widget::on_btnClose_clicked()

{

    this->close();

}

void Widget::timerEvent(QTimerEvent *e)

{

    //游戏时间

    if(e->timerId()==gameTimerId)

    {

        gameTime--;

        //设置进度条

        ui->progressBar->setValue(gameTime);

        if(gameTime==0)

        {

            //关闭定时器

            killTimer(gameTimerId);

            QMessageBox::information(this,"失败","游戏时间到");

            //启动失败动画

            overMovie.start();

            //切换到失败动画页面

            ui->stackedWidget->setCurrentWidget(ui->pageOver);

            overTimerId=startTimer(5000);

        }

    }

    //失败动画时间

    else if(e->timerId()==overTimerId)

    {

        //停止动画和定时器,回到游戏首页

        overMovie.stop();

        killTimer(overTimerId);

        ui->stackedWidget->setCurrentWidget(ui->pageStart);

    }

    //胜利动画时间

    else if(e->timerId()==winTimerId)

    {

        //停止动画和定时器,回到游戏首页

        winMovie.stop();

        killTimer(winTimerId);

        ui->stackedWidget->setCurrentWidget(ui->pageStart);

    }

}

//数字键处理

void Widget::dealNum()

{

    //获取信号接收者

    QObject *mySender=sender();

    //转换为按钮类型

    QPushButton *p= (QPushButton *)mySender;

    if(p!=NULL)

    {

        //获取按钮的内容

        QString strNum=p->text();

        strResult+=strNum;

        //数字不能以0开始

        if(strResult.size()==1&&strResult=="0")

        {

            strResult.clear();

        }

        if(strResult.size()<=4)

        {

            ui->textEdit->setText(strResult);

            if(strResult.size()==4)

            {

                if(strResult>strRand)

                {

                    ui->textEdit->append("数字太大");

                }

                else if(strResult<strRand)

                {

                    ui->textEdit->append("数字太小");

                }

                else

                {

                    ui->textEdit->append("猜对了");

                    killTimer(gameTimerId);

                    QMessageBox::information(this,"胜利","猜对了");

                    //切换到成功动画

                    winMovie.start();

                    ui->stackedWidget->setCurrentWidget(ui->pageWin);

                    winTimerId=startTimer(5000);

                }

                strResult.clear();

            }

        }

    }

}

//退格键

void Widget::on_btnReturn_clicked()

{

    if(strResult.size()==1)

    {

        strResult.clear();

        ui->textEdit->clear();

    }

    else

    {

        strResult.chop(1);  //截断最后一位字符

        ui->textEdit->setText(strResult);

    }

}

//提示键

void Widget::on_btnTip_clicked()

{

    strResult.clear();

    QString strTemp="随机数为:"+strRand;

    qDebug()<<strTemp;

    ui->textEdit->setText(strTemp);

}

原文地址:https://www.cnblogs.com/gd-luojialin/p/9215751.html