您的位置:首页 > 编程语言 > Qt开发

猜数字游戏_Qt

2017-12-17 17:31 211 查看
这个小栗子很多人都写过,写它仅仅是为了熟悉一些控件的使用,既不高大上也没其他想法。

1、界面构建,进入界面和操作界面。

界面简单说明:




1、主界面,显示猜数字游戏、时间、确定和退出。
2、采用stackedWidget控件,我使用的是qt5.2默认两个,但需要四个界面,选择“stackedwidget”,右击“insert page", 点击"after current page"。具体布局自己把握。

2、正题前期准备。

说明:
1、设置主窗口显示的字体大小及样式。
2、设置好猜错和猜正确的显示图片,判断正确或错误后可直接调用显示。
3、数字键统一调用一个槽函数,方便操作。

    //显示第一个页面(设置页面)

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

    //初始化数据

    //失败动画

    overMovie.setFileName(":/new/prefix1/Image/over.gif");

    ui->labelOver->setMovie(&overMovie);//给标签设置动画

    ui->labelOver->setScaledContents(true);//让动画自动适应标签大小

    //胜利动画

    winMovie.setFileName(":/new/prefix1/Image/win.gif");

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

    ui->labelWin->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);

3、点击确认键的操作。

说明:
1、得到时间,进入操作界面。
2、产生一个随机数。
3、设置进度条、开始定时器倒计时。

    //获取下拉框的时间 .toInt():字符串转换为 int

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

    qDebug() << gameTime << "s";

    //切换到游戏界面

    //ui->stackedWidget->setCurrentIndex(1);

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

    int num;

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

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

    //调用全局的qrand()函数生成随机数,对10000取余,保证位于10000的范围内

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

    randStr = QString::number(num);

    qDebug() << "randNum = " << randStr;

    //设置进度条

    ui->progressBar->setMinimum(0);//最小值

    ui->progressBar->setMaximum(gameTime);//最大值

    ui->progressBar->setValue(gameTime); //当前值

    gameTimerId = 0;

    //启动定时器

    gameTimerId = startTimer(1000); //以 1000 毫秒(即1s)作为时间间隔

    resultStr.clear();

    ui->textEdit->clear();

4、定时器操作

说明:
1、时间到,关闭定时器,启动失败gif动画。
2、gif动画时间到,关闭gif动画定时器,切换后主界面。
3、猜对定时器时间到,然后切换回主界面。

    if(e->timerId() == gameTimerId)//游戏时间

    {

        gameTime--;

        ui->progressBar->setValue(gameTime); //当前值//设置进度条

        if(0 == gameTime)//时间到

        {

            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->pageSet);

    }

    else if(e->timerId() == winTimerId)//胜利动画时间

    {

        winMovie.stop();//停止动画

        killTimer(winTimerId);  //停止定时器

        //切换到游戏设置页面

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

    }

5、数字键处理

说明:
1、QObject * mySender = sender();可知道是哪个键被按下。
2、得到按钮上的内容,然后对数据进行比较。注意一点:第一次按下0键无效。
3、正确则启动成功动画。注意无论正确与否,都要清空数据区。

QObject * mySender = sender(); //获取信号接收者

    QPushButton *p = (QPushButton *)mySender;//转换为按钮类型

    if(NULL != p)

    {

        //获取按钮的内容

        QString numStr = p->text();

        resultStr += numStr;

        if(resultStr.size() == 1 && resultStr == "0")//数字不能以0开始

        {

            resultStr.clear();

        }

        if( resultStr.size() <= 4) //保证显示结果为4位

        {

             ui->textEdit->setText( resultStr );

             if(resultStr.size() == 4) //数字到第4位时

             {

                 if(resultStr > randStr)

                 {

                     ui->textEdit->append("数字大了点!!!");

                 }

                 else if(resultStr < randStr)

                 {

                     ui->textEdit->append("数字小了点!!!");

                 }

                 else

                 {

                     ui->textEdit->append("恭喜你猜对了!!!");

                     killTimer(gameTimerId);//关闭定时器

                     QMessageBox::information(this, "胜利", "恭喜你猜对了!!!");

                     winMovie.start();//切换到成功动画

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

                     winTimerId = startTimer(5000); //5s//启动定时器

                 }

                 resultStr.clear();//初始化字符串结果,清空

             }

        }

    }

6、退格和提示键

说明:
1、退格:两种情况,a:现在只有一个数据,则直接清空。b:通过chop(1)可清空最后一位。也可通过size-1,将最后一个设置为'\0'。
2、提示键:直接将随机数放TextEdit上显示即可。

    if(resultStr.size() == 1)

    {

        resultStr.clear();

        ui->textEdit->clear();

    }

    else

    {

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

        ui->textEdit->setText(resultStr);

    }

    resultStr.clear();

    QString str = "随机数为:" + randStr;

    ui->textEdit->setText( str );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: