Qt定时猜字游戏

        随机产生一个数字,在一定的时间内进行猜测,时间内有提示,类似于数字炸弹的游戏。

       1.需求分析

        猜字游戏,功能:选择猜字的时间(comboBox);倒计时功能(定时器);输入功能,比较提示功能;胜利失败判断功能。

        2.具体完成操作

                a.Ui界面搭建

                考虑点击开始游戏,显示胜利动画和失败动画,我这里使用stackedWidget,有两种切换界面的方式,搭建的四个UI界面如下。

                开始设置界面:使用label作标题,comboBox作为时间选择器,两个pushButton按钮实现开始游戏和退出游戏的功能。

游戏界面:垂直布局,顶上是时间倒计时的进度条,中间是输入显示界面,下面是输入的案件,与计算器那个demo的用法类似。

胜利和结束页都只放了一个label用于插入动态图。

         b.资源导入:将动态图导入

        

        c.代码功能设计

                设计初始界面和资源准备以及绑定槽函数:里面的overMovie和winMovie都是QMovie类,这里使用的信号槽连接写法不同于计算器的SINGNAL和SLOT,也是点击然后操作的意思。

//显示首页面 两种放法:一种是index 一种是widget
    //ui->stackedWidget->setCurrentIndex(0);
    ui->stackedWidget->setCurrentWidget(ui->page);

    //失败动画
    overMovie.setFileName(":/Image/over.gif");
    ui->label_4->setMovie(&overMovie);//给标签设置动画
    ui->label_4->setScaledContents(true);//让动画自动适应标签大小

    //胜利动画
    winMovie.setFileName(":/Image/win.gif");
    ui->label_3->setMovie(&winMovie);
    ui->label_3->setScaledContents(true);

    //猜数字游戏界面相应设置
    //数字按钮都连接同一个槽 不同的写法和计算器
    connect(ui->pushButton0, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton1, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton2, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton3, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton4, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton5, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton6, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton7, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton8, &QPushButton::clicked, this, &Widget::dealNum);
    connect(ui->pushButton9, &QPushButton::clicked, this, &Widget::dealNum);

        绑定完成后功能以界面为基准自简单的往难的实现

        退出功能:关闭窗口即可

void Widget::on_pushButtonEnd_clicked()
{
    this->close(); //关闭窗口
}

        开始游戏:只有点击开始游戏,才需要获取设置的时间数,点击开始游戏后,生成答案的随机数,用randstr保存,同时启动定时器。

void Widget::on_pushButtonStart_clicked()
{
    //获取下拉框的时间 .toInt():字符串转换为 int
    gameTime = ui->comboBox->currentText().toInt();
    //切换界面
     ui->stackedWidget->setCurrentWidget(ui->page_2);

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

     //设置进度条
         ui->progressBar->setMinimum(0);//最小值
         ui->progressBar->setMaximum(gameTime);//最大值
         ui->progressBar->setValue(gameTime); //当前值

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

         resultStr.clear();
         ui->textEdit->clear();
}

        定时器的函数设置,这里将时间分为三类:游戏时间,即进度条倒计时,时间到提示直接进入失败动画;失败时间:动态图显示的时间只有5s,显示完回到主界面;胜利时间与失败时间相同。这里的gameTimerId,winTimerId,overTimerId是flag的功能,同时用在定时器上。

void Widget::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == gameTimerId)//游戏时间
    {
        gameTime--;

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

        if(0 == gameTime)//时间到
        {
            //关闭定时器
            killTimer(gameTimerId);

            QMessageBox::information(this, "失败", "时间到了啊!!!");


            overMovie.start();//启动动画

            //切换失败动画页面
            //ui->stackedWidget->setCurrentIndex(2);
            ui->stackedWidget->setCurrentWidget(ui->page_4);

            overTimerId = startTimer(5000); //启动定时器

        }

    }
    else if(e->timerId() == overTimerId)//失败动画时间
    {
        //停止动画,停止定时器,回到游戏设置页面
        overMovie.stop();//停止动画
        killTimer(overTimerId);  //停止定时器

        //切换到游戏设置页面
        ui->stackedWidget->setCurrentWidget(ui->page);

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

        winMovie.stop();//停止动画
        killTimer(winTimerId);  //停止定时器

        //切换到游戏设置页面
        ui->stackedWidget->setCurrentWidget(ui->page);

    }
}

按键<--

void Widget::on_pushButtonDel_clicked()
{
    if(resultStr.size() == 1)
    {
        resultStr.clear();
        ui->textEdit->clear();
    }
    else
    {
        resultStr.chop(1); //截断最后一位字符
        ui->textEdit->setText(resultStr);
    }

}

按键 提示: 直接显示随机数

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

输入的数字处理:不能从0开始,四位截止进行判断,给出提示,成功要关闭定时器。

void Widget:: dealNum(){
    //获取信号接收者
    QObject * mySender = sender();
    //转换为按钮类型
    QPushButton *p = (QPushButton *)mySender;
    if(NULL != p)
    {
        //获取按钮的内容
        QString numStr = p->text();
        resultStr += numStr;

        //数字不能以0开始
        if(resultStr.size() == 1 && resultStr == "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->page_3);

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

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

    }
}

设计结束,很简单难道游戏,但是要把细节考虑清楚,对初学者有所帮助。 

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值