zoukankan      html  css  js  c++  java
  • 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);

    }

  • 相关阅读:
    Crazypony四轴飞行器代码框架
    Python中 sys.argv[]的用法简明解释
    详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!(转)
    jquery——所有版本下载
    jsop跨域请求方式--及中文乱码解决方案
    js ---任何浏览器关闭当前网页的代码
    jquery ajax跨域请求 IE9及以下不支持---调试
    poi---Excel导入数据-ClassNotFoundException
    ajax获取json数据为undefined--原因解析
    可变参数 / 枚举--详解
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/9215751.html
Copyright © 2011-2022 走看看