QT實現簡單打地鼠

且-聽風吟.發表於2021-01-01

#編寫一簡單的打地鼠遊戲
設計了一個簡單的打地鼠,有分數顯示和難度設定

簡單點說,原理就是在ui介面上將按鈕當作地鼠,當點選到按鈕後,按鈕隱藏。將老鼠的照片作為按鈕背景。
右擊新增新檔案,選擇Qt,Qt Resource File
在這裡插入圖片描述在資源裡新增背景:
在這裡插入圖片描述先新增字首,再新增檔案
裡面的圖片待會會用到
在這裡插入圖片描述程式碼如下:
直接粘程式碼:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QSpinBox>
#include <QWidget>
#include <QMessageBox>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QTimer *timer1;//定時器
    int score,game_flag,value;//socre為得分,game_flag為1時遊戲開始,為0時遊戲關閉,value為難度


private slots:
    void SetTimer();
    
    void on_gameStart_clicked();//開始按鈕槽函式

    void on_gamePause_clicked();//暫停按鈕槽函式

    void on_gameStop_clicked();//結束按鈕槽函式

    void on_mouse_1_clicked();

    void on_mouse_2_clicked();

    void on_mouse_3_clicked();

    void on_mouse_4_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

.cpp檔案:

ui->setupUi(this);
    //定時器初始化
    QTimer *timer1=new QTimer(this);
    connect(timer1,SIGNAL(timeout()),this,SLOT(SetTimer()));
    timer1->start(1000);
    score=0;
    game_flag=0;//等於0時表示遊戲未開始,等於1時表示遊戲開始
    //將圖片放入到按鈕中,並且圖片隨按鈕大小變化相適應
    ui->mouse_1->setStyleSheet("QPushButton{border-image:url(:/mouse/laoshu.jpeg)5 5 5 5}");
    ui->mouse_2->setStyleSheet("QPushButton{border-image:url(:/mouse/laoshu.jpeg)5 5 5 5}");
    ui->mouse_3->setStyleSheet("QPushButton{border-image:url(:/mouse/laoshu.jpeg)5 5 5 5}");
    ui->mouse_4->setStyleSheet("QPushButton{border-image:url(:/mouse/laoshu.jpeg)5 5 5 5}");
    ui->mouse_1->hide();
    ui->mouse_2->hide();
    ui->mouse_3->hide();
    ui->mouse_4->hide();
    ui->gamePause->setEnabled(false);//遊戲未開始時暫停功能不可以
    int nMin = 1;
    int nMax = 4;
    int nSingleStep = 1;
    ui->pSpinBox->setPrefix("level");
    ui->pSpinBox->setMinimum(nMin);  // 最小值
    ui->pSpinBox->setMaximum(nMax);  // 最大值
    ui->pSpinBox->setSingleStep(nSingleStep);//

定時器槽函式:

void MainWindow::SetTimer()
{
    value=ui->pSpinBox->value();
    if(game_flag==1){
        int xx=qrand()%200;
        int yy=qrand()%200;
        ui->mouse_1->setGeometry(30+xx,30+yy,80,80);
        int aa=qrand()%200;
        int bb=qrand()%200;
        ui->mouse_2->setGeometry(30+aa,30+bb,80,80);
        int cc=qrand()%200;
        int dd=qrand()%200;
        ui->mouse_3->setGeometry(30+cc,30+dd,80,80);
        int ee=qrand()%200;
        int ff=qrand()%200;
        ui->mouse_4->setGeometry(30+ee,30+ff,80,80);
        //不同的難度等級有不同數量的地鼠出現
        if(value==1){
            ui->label_showhard->setText("easy");
            ui->mouse_1->show();
            ui->mouse_2->hide();
            ui->mouse_3->hide();
            ui->mouse_4->hide();
        }else if(value==2){
            ui->label_showhard->setText("normal");
            ui->mouse_1->show();
            ui->mouse_2->show();
            ui->mouse_3->hide();
            ui->mouse_4->hide();
        }else if(value==3){
            ui->label_showhard->setText("hard");
            ui->mouse_1->show();
            ui->mouse_2->show();
            ui->mouse_3->show();
            ui->mouse_4->hide();
        }else if(value==4){
            ui->label_showhard->setText("very hard");
            ui->mouse_1->show();
            ui->mouse_2->show();
            ui->mouse_3->show();
            ui->mouse_4->show();
        }
    }

}

開始按鈕槽函式:

void MainWindow::on_gameStart_clicked()
{
    game_flag=1;
    score=0;
    ui->lcdNumber->display(score);
    ui->gamePause->setEnabled(true);
}

暫停按鈕:

void MainWindow::on_gamePause_clicked()
{
    if(game_flag)
    {
        game_flag=0;
    }
    else
    {
        game_flag=1;
    }
}

停止按鈕

void MainWindow::on_gameStop_clicked()
{
    game_flag=0;//遊戲停止
    if(score>50){//分數大於50時,彈窗good
        QMessageBox::about(this," ","good!");
    }else if(score>100){//分數大於100時,彈窗perfect
        QMessageBox::about(this," ","perfect!");
    }
    this->score=0;//分數置零
    ui->lcdNumber->display(this->score);
    //地鼠隱藏
    ui->mouse_1->hide();
    ui->mouse_2->hide();
    ui->mouse_3->hide();
    ui->mouse_4->hide();
    ui->gamePause->setEnabled(false);
}

每打擊到一個地鼠時,分數加10,只有遊戲開始時才有效
地鼠按鈕槽函式:

void MainWindow::on_mouse_1_clicked()
{
        if(game_flag==1){
            this->score+=10;
            ui->lcdNumber->display(this->score);
            ui->mouse_1->hide();
        }
}

剩餘地鼠槽函式同理

效果如圖:
在這裡插入圖片描述在這裡插入圖片描述

相關文章