天天看點

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


           

遊戲截圖:

QT學習之QT小遊戲-----猜數字遊戲
QT學習之QT小遊戲-----猜數字遊戲
QT學習之QT小遊戲-----猜數字遊戲

源碼已經上傳至csdn: 代碼注釋很詳細,邊學邊注釋的,以便于像我一樣的初學者學習,源代碼傳送門:https://download.csdn.net/download/qq_38643642/11238285

另外,編譯好的exe檔案也将上傳到我的資源。

繼續閱讀