QT学习之QT小游戏-----猜数字游戏

经过几天的qt视频学习,基本掌握了时间,信号和槽以及qt定时器的使用,还有QT UI设计器的一些布局,自己根据上课流程,写了一个小游戏,基本还算可以。ui布局基本都是使用设计器完成的,下面是部分源代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QTime>
#include<QMessageBox>
#include<qstring.h>
#include<QDebug>
#include<QMovie>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    ui->stackedWidget->setCurrentWidget(ui->page);   //ui设计中使用stacked控件创建多个页面,首页默认index(0),显示首页
     
     /*游戏失败动画初始化*/
    startmovie.setFileName(":/new/prefix1/85ccde71gw1fasliemtifg208c05phdt.gif");    
    ui->label_3->setMovie(&startmovie);
    ui->label_3->setScaledContents(true);

    /*游戏成功动画初始化 */
    winmovie.setFileName(":/new/prefix1/-48482abb2408b8fd.gif");
    ui->label_4->setMovie(&winmovie);
    ui->label_4->setScaledContents(true);



  //  ui->stackedWidget->setCurrentIndex(2);
    connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::on_startbutton_clicked); //开始游戏的信号函数
    connect(ui->pushButton_2,&QPushButton::clicked,this,&MainWindow::on_endbutton_clicked);  //结束槽
  /*button 0~ 9对应的信号*/
    connect(ui->button0,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button1,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button2,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button3,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button4,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button5,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button6,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button7,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button8,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button9,&QPushButton::clicked,this,&MainWindow::delnum);
    connect(ui->button_del,&QPushButton::clicked,this,&MainWindow::on_button_del_clicked);  //删除信号
    connect(ui->button_piont,&QPushButton::clicked,this,&MainWindow::on_button_piont_clicked); //提示信号
    connect(ui->action,&QAction::triggered,this,&MainWindow::on_action_triggered);
    connect(ui->action_2,&QAction::triggered,this,&MainWindow::on_action2_triggered);
    connect(ui->action_3,&QAction::triggered,this,&MainWindow::on_action3_triggered);


}

/*游戏开始槽函数*/
void MainWindow::on_startbutton_clicked()
{
  gametime=ui->comboBox->currentText().toInt();  //首先从combobox读取里面的值,然后转化为int类型(gametime为全局成员)
  qDebug("%d",gametime);  //用于调试看读取成功没
  ui->stackedWidget->setCurrentWidget(ui->page_2); //按钮按下后,显示第二个界面,即游戏界面
  int num; //定义int变量来存放随机数
  qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //
  while((num=qrand()%10000)<999); //显示0~10000内随机数,并且剔除小于四位数的数值
  randStr = QString::number(num); //将生成的随机数转化为字符串 

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

  gametimeid=0; //gametimeid初始化为0(全局成员)
  gametimeid=startTimer(1000);//设置定时器时间间隔为1s,每一秒进入定时器函数一次
  resultStr.clear(); //清除输入结果
  ui->textEdit->clear();//清除文本框

}

/**/
void MainWindow::timerEvent(QTimerEvent *event)
{
   if(event->timerId()==gametimeid) //判断gametimeid=0是否到时
   {
    gametime--;  //每过1s,游戏时间减1
    ui->progressBar->setValue(gametime); //更新进度条显示

     if(gametime==0)   //当游戏时间为0
     {
         overtimeid=0;  
         killTimer(gametimeid);  //清除定时器
         QMessageBox::information(this,"游戏失败!","朋友,时间到了,下把再见!!"); 
         startmovie.start(); //失败动画开始
         ui->stackedWidget->setCurrentWidget(ui->page_3);//显示失败动画界面
         overtimeid=startTimer(2000);  //失败动画持续时间
     }

   }
   else if(event->timerId()==overtimeid)  //失败动画定时器服务函数
   {
     startmovie.stop();         
     killTimer(overtimeid);
     ui->stackedWidget->setCurrentWidget(ui->page); //2s后回到主界面

   }
   else if(event->timerId()==wintimeid)  //胜利动画定时器服务函数
   {
     winmovie.stop();
     killTimer(wintimeid);
     ui->stackedWidget->setCurrentWidget(ui->page); 
   }
}

/*游戏结束按钮槽函数*/
void MainWindow::on_endbutton_clicked()
{
   this->close();

}

/*button 0~9 的 处理槽函数*/
void MainWindow::delnum()
{
  QObject *mysender=sender(); //sender函数判断那个摁下 
  QPushButton *p=(QPushButton *)mysender;  //强制转化
  if (p!=NULL)
  {
     QString numstr = p->text(); //得到按下的值
      resultStr+=numstr; //每次按下后字符串拼接
      if(resultStr.size()==1&&resultStr=="0") //对首个按下的数为0,不作处理
      {
         resultStr.clear();

      }

      if(resultStr.size()<=4)  //当按下数为设定位数时开始判断
      {
       ui->textEdit->setText(resultStr);        
              if(resultStr.size()==4)
               {
                 if(resultStr>randStr)
                 {
                  ui->textEdit->setText("猜的大了点!");
                 }

                 if(resultStr<randStr)
                 {
                  ui->textEdit->setText("猜的小了点!");

                 }
                  if(resultStr==randStr)  //猜中之后开始游戏胜利的动画
                  {
                     wintimeid=0;
                     ui->textEdit->setText("恭喜 ,你猜对了");
                     killTimer(gametimeid);
                     QMessageBox::information(this,"胜利","恭喜 ,你猜对了");
                     ui->stackedWidget->setCurrentIndex(0);
                     winmovie.start();
                     ui->stackedWidget->setCurrentWidget(ui->page_4);
                     wintimeid=startTimer(2000); //持续2s 

                  }

                 resultStr.clear();  //清空结果

               }
      }
  }

}
 
 /*删除按钮槽函数 */
void MainWindow::on_button_del_clicked()  
{
 if(resultStr.size()==1)  //如果为1 ,直接删除
 {
   resultStr.clear();

 }
   else  //否则,截取最后一个
 {
    resultStr.chop(1);
    ui->textEdit->setText(resultStr);

 }

}
 
 /*提示按钮槽函数 */
void MainWindow::on_button_piont_clicked()
{

 ui->textEdit->setText("答案为:"+randStr);//直接显示随机数

}

void MainWindow::on_action_triggered()
{
  ui->stackedWidget->setCurrentWidget(ui->page_5);
  ui->textBrowser->show();

}

void MainWindow::on_action2_triggered()
{
  ui->stackedWidget->setCurrentWidget(ui->page_6);
  ui->textBrowser_2->show();
}

void MainWindow::on_action3_triggered()
{

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

}

MainWindow::~MainWindow()
{
    delete ui;
}


游戏截图:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码已经上传至csdn: 代码注释很详细,边学边注释的,以便于像我一样的初学者学习,源代码传送门:https://download.csdn.net/download/qq_38643642/11238285
另外,编译好的exe文件也将上传到我的资源。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lobmo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值