Qt小游戏-猜数字游戏(使用设计器完成界面设计)

目录

1.需要的知识点:

2.工程创建好后,先在设计器中实现界面 

3.代码实现部分

​编辑 


使用QtCreator 完成简单小游戏-猜数字游戏实现效果如下:

 

 

1.需要的知识点:

  • QLabel显示图片,动图
  • 常见控件的使用
  • 信号与槽
  • QStackedWidget 实现页面切换
  • 定时器的使用

2.工程创建好后,先在设计器中实现界面 

界面主要需要4个页面 :(使用QStackedWidget实现页面切换)

 

  • 首页

 

  • 游戏页(在界面可以添加widget进行小布局,再进行大布局)
  •  
  • 游戏胜利界面(使用Label添加动画) 

 

  •  游戏失败界面

 

3.代码实现部分

 

  • .h文件 
  • #ifndef MYWIDGET_H
    #define MYWIDGET_H
    #include <QString>
    #include <QWidget>
    #include <QMovie>
    #include <QPushButton>
    
    namespace Ui {
    class MyWidget;
    }
    
    class MyWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit MyWidget(QWidget *parent = 0);
        ~MyWidget();
    
        //自定义槽函数
        void dealNum();
        void boxAddItem();
    
    
    private slots:
        void on_pushButtonStart_clicked();
        void on_pushButtonEnd_clicked();
        void on_pushButtonDel_clicked();
        void on_pushButtonEnter_clicked();
    protected:
      //定时器事件,为虚函数
       void timerEvent(QTimerEvent *e);
    
    private:
        Ui::MyWidget *ui;
        int gameTime;
        QString randStr;//随机数
        int gameTimeId;//游戏时间定时器ID
        int overTimeId;//失败动画定时器ID
        int winTimeId;//胜利动画定时器ID
        QString resultStr;//结果数
    
    
    
    
        QMovie overMovie;//失败动画
        QMovie winMovie;//胜利动画
    };
    
    #endif // MYWIDGET_H
    
  • .cpp文件 
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QMessageBox>
#include <QTime>
#include <QString>
#include <QDebug>
#include <QPushButton>
#include <QTimer>
#include <QObject>
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    //显示第一个页面(设置页面)
    //设置固定大小
    setFixedSize(600,600);
    //设置图标
    setWindowIcon(QIcon(":/images/guess.jpg"));
    //设置标题
    setWindowTitle("猜数字游戏");
//    ui->title->setStyleSheet("QLabel{font-size:40px;"
//                             "font-family:yahei;}");

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

   // this->boxadditem();

    //初始化数据
    //失败动画
    overMovie.setFileName(":/images/fighting.gif");
    ui->labelOver->setMovie(&overMovie);//给标签设置动画
    ui->labelOver->setScaledContents("true");//让标签自适应动画大小

    //胜利动画
    winMovie.setFileName(":/images/praise.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);
}
//定时器
 void MyWidget::timerEvent(QTimerEvent *e)
 {
     if(e->timerId()==this->gameTimeId)
     {
         qDebug()<<"定时中";
         gameTime--;
         ui->progressBar->setValue(gameTime);//更新时间
         //判断时间是否没有
         if(gameTime==0)
         {
             killTimer(gameTimeId);//关闭游戏定时
           //失败提醒
             QMessageBox::warning(this,"挑战失败","时间已经到了");
           //开启失败动画
             overMovie.start();
             ui->stackedWidget->setCurrentWidget(ui->pageover);
           //开启失败动画播放定时
             overTimeId=startTimer(5000);

         }
     }
else if(e->timerId()==overTimeId)
     {
         //关闭失败动画,关闭失败定时,切换至主页面
         overMovie.stop();
         killTimer(overTimeId);
         ui->stackedWidget->setCurrentWidget(ui->pageSet);
     }
     else if(e->timerId()==winTimeId)
     {
         //关闭成功动画,关闭成功定时,切换至主页面
         winMovie.stop();
         killTimer(winTimeId);
         ui->stackedWidget->setCurrentWidget(ui->pageSet);
     }

 }
 //处理数据函数
 void MyWidget::dealNum()
 {
     //选择接收者
     QObject *Mysender = sender();//多个信号连接到同一个槽时,使用sender
     //将接收者转化为按钮类型
     QPushButton *p = (QPushButton *)Mysender;
     if(p!=NULL)//判断是否有按钮摁下
     {
         //获取按下按钮的文本信息
         QString numstr = p->text();
         qDebug()<<p->text();
         //更新结果
         resultStr+=numstr;
         qDebug()<<resultStr;
         //当没有数时使其不能输入0
         if(resultStr.size()==1&&resultStr=="0")
         {
             resultStr.clear();
         }
 //如果输入位数大于4
         if(resultStr.size()>4)
         {
             resultStr.clear();
         }
         //输入数字小于4位时
         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(gameTimeId);//关闭游戏定时
                 //开启成功动画
                 winMovie.start();
                 ui->stackedWidget->setCurrentWidget(ui->pagewin);
                 winTimeId=startTimer(5000);//开启成功动画定时
                 resultStr.clear();//清空当前结果

            }
            }
         }

     }
 }
//删除输入函数
void MyWidget::on_pushButtonDel_clicked()
{
    //如果为一位直接清空
    if(resultStr.size()==1)
    {
        resultStr.clear();
        ui->textEdit->clear();
    }
    else
    {
        resultStr.chop(1);//截掉最后一位字符
        // resultStr[resultStr.size() -1] = '\0';
        ui->textEdit->setText(resultStr);
    }
}
//进入游戏界面
void MyWidget::on_pushButtonStart_clicked()
{
  //获取下拉框的时间 .toInt(): 字符串转换为 int
    gameTime = ui->comboBox->currentText().toInt();
    qDebug()<<gameTime <<"s";
    ui->stackedWidget->setCurrentWidget(ui->gaming);//切换到游戏界面
    //生成随机数
    int num;
    //以从0时0分0秒到现在的秒数为种子
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    while((num = qrand()%10000)<999);//保证随机数为四位
    randStr = QString::number(num);//QString::number(),将数字转换为QString类型,num 为待转换数字,默认十进制方式显示
    qDebug()<<num;
//设置最大、最小和当前值
    ui->progressBar->setMaximum(gameTime);
    ui->progressBar->setMinimum(0);
    ui->progressBar->setValue(gameTime);

    //启动定时器
    gameTimeId = 0;
    gameTimeId = startTimer(1000);//以1000毫秒(1秒)作为时间间隔
    qDebug()<<"定时开始";

    //清空结果
    resultStr.clear();
    ui->textEdit->clear();
}
//确认是否退出游戏
 void MyWidget::on_pushButtonEnd_clicked()
{
 int ret = QMessageBox::question(this,"question","请确认是否退出游戏?");
 if(ret==QMessageBox::Yes)
 {
     close();
 }
}
//设置提示文本
 void MyWidget::on_pushButtonEnter_clicked()
 {
     resultStr.clear();
     QString str ="随机数为:"+randStr;
     ui->textEdit->setText(str);
 }

 //设置时间选项
 void MyWidget::boxAddItem()
 {
     ui->comboBox->addItem("20");
     ui->comboBox->addItem("30");
     ui->comboBox->addItem("40");
     ui->comboBox->addItem("50");
     ui->comboBox->addItem("60");
     ui->comboBox->addItem("70");
     ui->comboBox->addItem("80");
     ui->comboBox->addItem("90");
     ui->comboBox->addItem("100");
 }
MyWidget::~MyWidget()
{
    delete ui;
}

 

 

 

 

 

 

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值