黑马Qt_Day03_猜数字游戏

[亡魂溺海] 提交于 2020-04-02 10:30:17

需求:在主页面选择游戏时间,开始游戏,系统生成随机数,用户开始猜数,超时或猜数成功都会出现对话框以及相应动画。

 

现在ui设计器对页面进行设计

 

 

 

动画的实现都是在栈容器的对应页面上放置一个标签

 

 

 

mywidget.h

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QComboBox>//数字下拉框
#include<QDebug>
#include<QMessageBox>
#include<QTime>


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




    //程序开始页
    //ui->stackedWidget->setCurrentIndex(0);
    ui->stackedWidget->setCurrentWidget(ui->page_set);

    ui->label->setText("<center><h1>猜数字游戏</center></h1>");
    ui->label->setFont(QFont("楷体",20,QFont::Bold));
    ui->label_2->setText("<center>请设置猜数字时间(秒)</center>");
    ui->pushButtonStart->setText("进入游戏");
    ui->pushButtonEnd->setText("退出游戏");

    //编辑下拉框,直接ui界面添加

    //动画设置
    //成功动画
    winMovie.setFileName("://image/win.gif");
    ui->label_win->setMovie(&winMovie);
    ui->label_win->setScaledContents(true);
    //失败动画
    overMovie.setFileName("://image/over.gif");
    ui->label_over->setMovie(&overMovie);
    ui->label_over->setScaledContents(true);

    //处理按键
    connect(ui->pushButton0,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton1,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton2,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton3,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton4,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton5,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton6,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton7,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton8,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton9,&QPushButton::clicked,this,&MyWidget::DealNum);

}

MyWidget::~MyWidget()
{
    delete ui;

}


void MyWidget::on_pushButtonStart_clicked()
{
    ui->textEdit->clear();
    resultStr.clear();
    //获取游戏时间
    gameTime=ui->comboBox->currentText().toInt();
    qDebug()<<gameTime<<'s';

    //切换游戏界面
    //ui->stackedWidget->setCurrentIndex(1);
    ui->stackedWidget->setCurrentWidget(ui->page_game);
    ui->textEdit->setFont(QFont("楷体",45));

    //生成随机数
    int num;
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    while((num=qrand()%10000)<999);
    randStr=QString::number(num);//获得随机数
    qDebug()<<num;

    //设置进度条
    ui->progressBar->setMinimum(0);
    ui->progressBar->setMaximum(gameTime);
    ui->progressBar->setValue(gameTime);

    gameTimerId=this->startTimer(1000);//每隔1s触发定时器



}

void MyWidget::DealNum()
{
    //获得信号接收者
    QObject *mySender=sender();
    QPushButton *p=(QPushButton *)mySender;
    if(p)
    {
        //获取按钮的内容
        resultStr+=p->text();

        if(resultStr.size()==1&&resultStr=='0')
        {
            resultStr.clear();
        }
        if(resultStr.size()<=4)
        {
            //显示数字
            ui->textEdit->setText(resultStr);
            if(resultStr.size()==4)
            {
                if(resultStr<randStr)
                {
                    ui->textEdit->append("数字小啦!!!");
                }
                else if(resultStr>randStr)
                {
                    ui->textEdit->append("数字大啦!!!");
                }
                else
                {
                    ui->textEdit->append("恭喜你猜对啦!!!");
                    //关掉定时器
                    killTimer(gameTimerId);
                    //显示对话框
                    QMessageBox::information(this,"胜利","恭喜你猜对啦!");

                    //切换到成功动画界面
                    ui->stackedWidget->setCurrentWidget(ui->page_win);
                    winMovie.start();
                    winTimerId=this->startTimer(5000);

                }
                resultStr.clear();
            }
        }

    }


}
void MyWidget::timerEvent(QTimerEvent *e)
{
    if(e->timerId()==this->gameTimerId)
    {
        //设置进度条时间
        gameTime--;
        ui->progressBar->setValue(gameTime);
        //计时结束,弹出对话框
        if(0==gameTime)
        {
            killTimer(gameTimerId);
            QMessageBox::warning(this,"错误","时间到啦!");

            //启动失败动画
            ui->stackedWidget->setCurrentWidget(ui->page_over);
            overMovie.start();
            //设置动画时间
            overTimerId=this->startTimer(5000);

        }
    }
    if(e->timerId()==this->winTimerId)
    {
        //停止定时器 ,停止动画,返回到开始页面
        killTimer(winTimerId);
        winMovie.stop();
        ui->stackedWidget->setCurrentWidget(ui->page_set);
    }
    if(e->timerId()==overTimerId)
    {
        //停止定时器 ,停止动画,返回到开始页面
        killTimer(overTimerId);
        overMovie.stop();
        ui->stackedWidget->setCurrentWidget(ui->page_set);
    }
}

void MyWidget::on_pushButtonEnd_clicked()//ui设计器的相应按键,右击,转到槽
{
    this->close();
}

void MyWidget::on_pushButtonDel_clicked()
{
    if(resultStr==1)
    {
        resultStr.clear();
        ui->textEdit->clear();
    }
    else
    {
        resultStr.chop(1);
        ui->textEdit->setText(resultStr);
    }
}

void MyWidget::on_pushButtonTip_clicked()
{
    resultStr.clear();
    QString str="随机数:"+randStr;
    ui->textEdit->setText(str);
}

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QComboBox>//数字下拉框
#include<QDebug>
#include<QMessageBox>
#include<QTime>


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




    //程序开始页
    //ui->stackedWidget->setCurrentIndex(0);
    ui->stackedWidget->setCurrentWidget(ui->page_set);

    ui->label->setText("<center><h1>猜数字游戏</center></h1>");
    ui->label->setFont(QFont("楷体",20,QFont::Bold));
    ui->label_2->setText("<center>请设置猜数字时间(秒)</center>");
    ui->pushButtonStart->setText("进入游戏");
    ui->pushButtonEnd->setText("退出游戏");

    //编辑下拉框,直接ui界面添加

    //动画设置
    //成功动画
    winMovie.setFileName("://image/win.gif");
    ui->label_win->setMovie(&winMovie);
    ui->label_win->setScaledContents(true);
    //失败动画
    overMovie.setFileName("://image/over.gif");
    ui->label_over->setMovie(&overMovie);
    ui->label_over->setScaledContents(true);

    //处理按键
    connect(ui->pushButton0,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton1,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton2,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton3,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton4,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton5,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton6,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton7,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton8,&QPushButton::clicked,this,&MyWidget::DealNum);
    connect(ui->pushButton9,&QPushButton::clicked,this,&MyWidget::DealNum);

}

MyWidget::~MyWidget()
{
    delete ui;

}


void MyWidget::on_pushButtonStart_clicked()
{
    ui->textEdit->clear();
    resultStr.clear();
    //获取游戏时间
    gameTime=ui->comboBox->currentText().toInt();
    qDebug()<<gameTime<<'s';

    //切换游戏界面
    //ui->stackedWidget->setCurrentIndex(1);
    ui->stackedWidget->setCurrentWidget(ui->page_game);
    ui->textEdit->setFont(QFont("楷体",45));

    //生成随机数
    int num;
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    while((num=qrand()%10000)<999);
    randStr=QString::number(num);//获得随机数
    qDebug()<<num;

    //设置进度条
    ui->progressBar->setMinimum(0);
    ui->progressBar->setMaximum(gameTime);
    ui->progressBar->setValue(gameTime);

    gameTimerId=this->startTimer(1000);//每隔1s触发定时器



}

void MyWidget::DealNum()
{
    //获得信号接收者
    QObject *mySender=sender();
    QPushButton *p=(QPushButton *)mySender;
    if(p)
    {
        //获取按钮的内容
        resultStr+=p->text();

        if(resultStr.size()==1&&resultStr=='0')
        {
            resultStr.clear();
        }
        if(resultStr.size()<=4)
        {
            //显示数字
            ui->textEdit->setText(resultStr);
            if(resultStr.size()==4)
            {
                if(resultStr<randStr)
                {
                    ui->textEdit->append("数字小啦!!!");
                }
                else if(resultStr>randStr)
                {
                    ui->textEdit->append("数字大啦!!!");
                }
                else
                {
                    ui->textEdit->append("恭喜你猜对啦!!!");
                    //关掉定时器
                    killTimer(gameTimerId);
                    //显示对话框
                    QMessageBox::information(this,"胜利","恭喜你猜对啦!");

                    //切换到成功动画界面
                    ui->stackedWidget->setCurrentWidget(ui->page_win);
                    winMovie.start();
                    winTimerId=this->startTimer(5000);

                }
                resultStr.clear();
            }
        }

    }


}
void MyWidget::timerEvent(QTimerEvent *e)
{
    if(e->timerId()==this->gameTimerId)
    {
        //设置进度条时间
        gameTime--;
        ui->progressBar->setValue(gameTime);
        //计时结束,弹出对话框
        if(0==gameTime)
        {
            killTimer(gameTimerId);
            QMessageBox::warning(this,"错误","时间到啦!");

            //启动失败动画
            ui->stackedWidget->setCurrentWidget(ui->page_over);
            overMovie.start();
            //设置动画时间
            overTimerId=this->startTimer(5000);

        }
    }
    if(e->timerId()==this->winTimerId)
    {
        //停止定时器 ,停止动画,返回到开始页面
        killTimer(winTimerId);
        winMovie.stop();
        ui->stackedWidget->setCurrentWidget(ui->page_set);
    }
    if(e->timerId()==overTimerId)
    {
        //停止定时器 ,停止动画,返回到开始页面
        killTimer(overTimerId);
        overMovie.stop();
        ui->stackedWidget->setCurrentWidget(ui->page_set);
    }
}

void MyWidget::on_pushButtonEnd_clicked()
{
    this->close();
}

void MyWidget::on_pushButtonDel_clicked()
{
    if(resultStr==1)
    {
        resultStr.clear();
        ui->textEdit->clear();
    }
    else
    {     //resultStr[resultStr.size()-1]='\0';
        resultStr.chop(1);
        ui->textEdit->setText(resultStr);
    }
}

void MyWidget::on_pushButtonTip_clicked()
{
    resultStr.clear();
    QString str="随机数:"+randStr;
    ui->textEdit->setText(str);
}

 

Qt设置应用程序图标和可执行程序图标🔗:

https://www.cnblogs.com/nanqiang/p/11023535.html

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!