QT翻金币

QT翻金币

在B站跟着视频进行QT学习,现把代码全部贴上来,备忘
整体解决方案文件结构如下:
在这里插入图片描述
chooselevelscene.h

#ifndef CHOOSELEVELSCENE_H
#define CHOOSELEVELSCENE_H

#include <QMainWindow>
#include"playscene.h"

class ChooseLevelScene : public QMainWindow
{
    Q_OBJECT
public:
    explicit ChooseLevelScene(QWidget *parent = nullptr);

    void  paintEvent(QPaintEvent *event);
    playscene *play = NULL;

signals:
    void chooseSceneBack();
};

#endif // CHOOSELEVELSCENE_H

dataconfig.h

#ifndef DATACONFIG_H
#define DATACONFIG_H

#include <QObject>
#include<QMap>
#include<QVector>

class DataConfig : public QObject
{
    Q_OBJECT
public:
    explicit DataConfig(QObject *parent = nullptr);

public:
    QMap<int, QVector <QVector<int>>>mData;
signals:
};

#endif // DATACONFIG_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void paintEvent(QPaintEvent *event);

private slots:
    void on_actiontuichu_triggered();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mycoin.h.h

#ifndef MYCOIN_H
#define MYCOIN_H

#include <QPushButton>>
#include<QTimer>
class MyCoin : public QPushButton
{
    Q_OBJECT
public:
    //explicit MyCoin(QWidget *parent = nullptr);
    MyCoin(QString btnImage);
    void  mousePressEvent(QMouseEvent * e);
    int posX;
    int posY;
    bool flag;

    void changeFlag();
    QTimer *time1;
    QTimer *time2;
    int min;
    int max;
    bool isAnimation = false;
    bool iswin = false;



signals:
};

#endif // MYCOIN_H

mypushbutton.h

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QWidget>
#include<QPushButton>

class MyPushButton : public QPushButton
{
    Q_OBJECT
public:
    MyPushButton(QString p_naormalimage , QString p_pressimage="");
    void zoom1();
    void zoom2();

    QString m_NormalImagePath;
    QString m_PressImagePath;

    void mousePressEvent(QMouseEvent *e) ;
    void mouseReleaseEvent(QMouseEvent *e) ;
signals:
};

#endif // MYPUSHBUTTON_H

playscene.h

#ifndef PLAYSCENE_H
#define PLAYSCENE_H

#include <QMainWindow>
#include"mycoin.h"

class playscene : public QMainWindow
{
    Q_OBJECT
public:
    void  paintEvent(QPaintEvent *event);
    playscene(int levelnumber);
    int levelindex;//记住所选的关卡
    bool isWin();
    bool  SetWin();

    int gameArray[4][4];
    MyCoin *coinBtn[4][4];
    bool iswin;
signals:
    void playSceneBack();
};

#endif // PLAYSCENE_H

chooselevelscene.cpp

#include "chooselevelscene.h"
#include<QMenuBar>
#include<QPainter>
#include"mypushbutton.h"
#include<QDebug>
#include<qtimer.h>
#include<QLabel>
#include<playscene.h>
ChooseLevelScene::ChooseLevelScene(QWidget *parent)
    : QMainWindow{parent}
{
    setWindowIcon(QPixmap(":/res/Coin0001.png"));
    this->setFixedSize(320 , 588);
    setWindowTitle("选择关卡");


    QMenuBar *bar = menuBar();
    setMenuBar(bar);
    QMenu *startbar = bar->addMenu("开始");
    QAction * quitAction = startbar->addAction("退出");

    connect(quitAction , &QAction::triggered,[=](){
        this->close();
    });

    MyPushButton *backBtn = new MyPushButton(":/res/BackButton.png",":/res/BackButtonSelected.png");
    backBtn->setParent(this);
    backBtn->move(this->width()-backBtn->width() , this->height()-backBtn->height());

    connect(backBtn , &QPushButton::clicked,[=](){
        QTimer::singleShot(200,this,[=](){
            emit this->chooseSceneBack();
        });
    });




    //选择关卡按钮

    for(int i=0;i<20;++i)
    {
        MyPushButton *menubtn = new MyPushButton(":/res/LevelIcon.png");
        menubtn->setParent(this);
        menubtn->move(25+i%4*70 , 130+i/4*70);

        connect(menubtn , &QPushButton::clicked,[=](){
            qDebug()<<"kaishiguanqia";
            play = new playscene(i+1);
            connect(play , &playscene::playSceneBack,[=](){
                this->show();
                play->hide();
            });

            this->hide();
            play->show();
        });

        QLabel *label = new QLabel;
        label->setParent(this);
        label->setFixedSize(menubtn->width() , menubtn->height());
        label->setText(QString::number(i+1));
        label->move(25+i%4*70 , 130+i/4*70);

        label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        label->setAttribute(Qt::WA_TransparentForMouseEvents);

    }

}


void ChooseLevelScene:: paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/OtherSceneBg.png");
    painter.drawPixmap(0 ,0 , this->width() , this->height(),pix);

    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width()/2 , pix.height()/2);
    painter.drawPixmap(10 ,30 , pix);

}

dataconfig.cpp

//dataconfig.cpp
#include "dataconfig.h"
#include <QDebug>
DataConfig::DataConfig(QObject *parent) : QObject(parent)//构造函数
{
    //二维数组
    int array1[4][4] = {{1, 1, 1, 1},
                        {1, 1, 0, 1},
                        {1, 0, 0, 0},
                        {1, 1, 0, 1} } ;

    QVector< QVector<int>> v;  //一个动态数组的 二维数组
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;//一个一维数组的动态数组
        for(int j = 0 ; j < 4;j++)
        {

            v1.push_back(array1[i][j]);//把数据写入到动态数组
        }
        v.push_back(v1);//把一维数组计入到二维数组
    }

    mData.insert(1,v);//把二维数组 计入到之前的 map  地图中  key =1  value = v


    int array2[4][4] = { {1, 0, 1, 1},
                        {0, 0, 1, 1},
                        {1, 1, 0, 0},
                        {1, 1, 0, 1}} ;

    v.clear();//清除二维数组。
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array2[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(2,v);



    int array3[4][4] = {  {0, 0, 0, 0},
                        {0, 1, 1, 0},
                        {0, 1, 1, 0},
                        {0, 0, 0, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array3[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(3,v);


    int array4[4][4] = {   {0, 1, 1, 1},
                        {1, 0, 0, 1},
                        {1, 0, 1, 1},
                        {1, 1, 1, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array4[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(4,v);


    int array5[4][4] = {  {1, 0, 0, 1},
                        {0, 0, 0, 0},
                        {0, 0, 0, 0},
                        {1, 0, 0, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array5[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(5,v);


    int array6[4][4] = {   {1, 0, 0, 1},
                        {0, 1, 1, 0},
                        {0, 1, 1, 0},
                        {1, 0, 0, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array6[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(6,v);


    int array7[4][4] = {   {0, 1, 1, 1},
                        {1, 0, 1, 1},
                        {1, 1, 0, 1},
                        {1, 1, 1, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array7[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(7,v);

    int array8[4][4] = {  {0, 1, 0, 1},
                        {1, 0, 0, 0},
                        {0, 0, 0, 1},
                        {1, 0, 1, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array8[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(8,v);

    int array9[4][4] = {   {1, 0, 1, 0},
                        {1, 0, 1, 0},
                        {0, 0, 1, 0},
                        {1, 0, 0, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array9[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(9,v);



    int array10[4][4] = {  {1, 0, 1, 1},
                         {1, 1, 0, 0},
                         {0, 0, 1, 1},
                         {1, 1, 0, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array10[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(10,v);


    int array11[4][4] = {  {0, 1, 1, 0},
                         {1, 0, 0, 1},
                         {1, 0, 0, 1},
                         {0, 1, 1, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array11[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(11,v);

    int array12[4][4] = {  {0, 1, 1, 0},
                         {0, 0, 0, 0},
                         {1, 1, 1, 1},
                         {0, 0, 0, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array12[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(12,v);


    int array13[4][4] = {    {0, 1, 1, 0},
                         {0, 0, 0, 0},
                         {0, 0, 0, 0},
                         {0, 1, 1, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array13[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(13,v);

    int array14[4][4] = {    {1, 0, 1, 1},
                         {0, 1, 0, 1},
                         {1, 0, 1, 0},
                         {1, 1, 0, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array14[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(14,v);


    int array15[4][4] = {   {0, 1, 0, 1},
                         {1, 0, 0, 0},
                         {1, 0, 0, 0},
                         {0, 1, 0, 1}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array15[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(15,v);


    int array16[4][4] = {   {0, 1, 1, 0},
                         {1, 1, 1, 1},
                         {1, 1, 1, 1},
                         {0, 1, 1, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array16[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(16,v);

    int array17[4][4] = {  {0, 1, 1, 1},
                         {0, 1, 0, 0},
                         {0, 0, 1, 0},
                         {1, 1, 1, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array17[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(17,v);


    int array18[4][4] = { {0, 0, 0, 1},
                         {0, 0, 1, 0},
                         {0, 1, 0, 0},
                         {1, 0, 0, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array18[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(18,v);

    int array19[4][4] = {   {0, 1, 0, 0},
                         {0, 1, 1, 0},
                         {0, 0, 1, 1},
                         {0, 0, 0, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array19[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(19,v);

    int array20[4][4] = {  {0, 0, 0, 0},
                         {0, 0, 0, 0},
                         {0, 0, 0, 0},
                         {0, 0, 0, 0}} ;
    v.clear();
    for(int i = 0 ; i < 4;i++)
    {
        QVector<int>v1;
        for(int j = 0 ; j < 4;j++)
        {
            v1.push_back(array20[i][j]);
        }
        v.push_back(v1);
    }

    mData.insert(20,v);
}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QPainter>
#include"mypushbutton.h"
#include<qthread.h>
#include<qtimer.h>
#include<chooselevelscene.h>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //配置主场景

    setFixedSize(320 , 588);
    setWindowIcon(QIcon(":/res/Coin0001.png"));
    setWindowTitle("翻金币主场景");
    //退出
    // connect(ui->actiontuichu , &QAction::triggered , [=](){
    //     this->close();
    // });

    MyPushButton *startbutton = new MyPushButton(":/res/MenuSceneStartButton.png");
    startbutton->setParent(this);
    startbutton->move(this->width()/2-startbutton->width()/2 , this->height()*0.7);

    ChooseLevelScene *choosesceen = new ChooseLevelScene;

    connect(choosesceen , &ChooseLevelScene::chooseSceneBack,[=](){
        this->show();
        choosesceen->hide();
    });

    connect(startbutton , &QPushButton::clicked , [=](){
        startbutton->zoom1();
        startbutton->zoom2();
        QTimer::singleShot(200 , this , [=](){
            this->hide();
            choosesceen->show();
        });

    });



}

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

void MainWindow:: paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/PlayLevelSceneBg.png");
    painter.drawPixmap(0 ,0 , this->width() , this->height(),pix);

    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width()/2 , pix.height()/2);
    painter.drawPixmap(10 ,30 , pix);

}

void MainWindow::on_actiontuichu_triggered()
{
    qDebug()<<"退出程序";
    this->close();
}


mycoin.cpp

#include "mycoin.h"
#include<QPixmap>

MyCoin::MyCoin(QString btnImage)
{

    QPixmap pix;
    bool ret = pix.load(btnImage);
    if(ret!=true)
    {
        qDebug()<<"图片加载失败";
    }

    this->setFixedSize(QSize(pix.width() , pix.height()));

    //设置不规则样式
    this->setStyleSheet("QPushButton{border:0px;}");

    this->setIcon(pix);

    this->setIconSize(QSize(pix.width() , pix.height()));

    time1 = new QTimer();
    time2 = new QTimer();
    max = 8;
    min = 1;

    connect(time1 , &QTimer::timeout,[=](){
        QPixmap pix;
        QString str = QString(":/res/Coin000%1").arg(min++);
        pix.load(str);


        this->setFixedSize(QSize(pix.width() , pix.height()));

        //设置不规则样式
        this->setStyleSheet("QPushButton{border:0px;}");

        this->setIcon(pix);

        this->setIconSize(QSize(pix.width() , pix.height()));

        if(min>max)
        {
            min=1;
            this->isAnimation = false;
            time1->stop();
        }
    });

        connect(time2 , &QTimer::timeout,[=](){
            QPixmap pix;
            QString str = QString(":/res/Coin000%1").arg(max--);
            pix.load(str);


            this->setFixedSize(QSize(pix.width() , pix.height()));

            //设置不规则样式
            this->setStyleSheet("QPushButton{border:0px;}");

            this->setIcon(pix);

            this->setIconSize(QSize(pix.width() , pix.height()));

            if(max<min)
            {
                max=8;
                this->isAnimation = false;
                time2->stop();
            }
    });
}
void MyCoin:: mousePressEvent(QMouseEvent * e)
{
    if((this->isAnimation==true) || (this->iswin==true)  )
    {
        return;
    }
    else
    {
        QPushButton::mousePressEvent(e);
    }

 }

void MyCoin::changeFlag()
{
    if(this->flag==1)
    {
        isAnimation = true;
        time1->start(30);
        this->flag = 0;
    }
    else
    {
        isAnimation = true;
        time2->start(30);
        this->flag = 1;
    }

}

mypushbutton.cpp

#include "mypushbutton.h"
#include<QDebug>
#include<qpropertyanimation.h>

MyPushButton::MyPushButton(QString p_naormalimage , QString p_pressimage)
{

    this-> m_NormalImagePath = p_naormalimage;
    this-> m_PressImagePath = p_pressimage;

    QPixmap pix;
    bool ret = pix.load(p_naormalimage);
    if(ret!=true)
    {
        qDebug()<<"图片加载失败";
    }

    this->setFixedSize(QSize(pix.width() , pix.height()));

    //设置不规则样式
    this->setStyleSheet("QPushButton{border:0px;}");

    this->setIcon(pix);

    this->setIconSize(QSize(pix.width() , pix.height()));

}

void MyPushButton::zoom1()
{
    QPropertyAnimation *animationl = new QPropertyAnimation(this , "geometry");
    animationl->setDuration(200);
    animationl->setStartValue(QRect(this->x() , this->y() , this->width() , this->height()));
    animationl->setEndValue(QRect(this->x() , this->y()+10 , this->width() , this->height()));
    animationl->setEasingCurve(QEasingCurve::OutBounce);
    animationl->start();

}
void MyPushButton::zoom2()
{
    QPropertyAnimation *animationl = new QPropertyAnimation(this , "geometry");
    animationl->setDuration(200);
    animationl->setStartValue(QRect(this->x() , this->y()+10 , this->width() , this->height()));
    animationl->setEndValue(QRect(this->x() , this->y() , this->width() , this->height()));
    animationl->setEasingCurve(QEasingCurve::OutBounce);
    animationl->start();
}
void MyPushButton:: mousePressEvent(QMouseEvent *e)
{
    if(this->m_PressImagePath.length()!=0)
    {
        QPixmap pix;
        bool ret = pix.load(m_PressImagePath);
        if(ret!=true)
        {
            qDebug()<<"图片加载失败";
        }

        this->setFixedSize(QSize(pix.width() , pix.height()));

        //设置不规则样式
        this->setStyleSheet("QPushButton{border:0px;}");

        this->setIcon(pix);

        this->setIconSize(QSize(pix.width() , pix.height()));

    }
    return QPushButton::mousePressEvent(e);
}
void MyPushButton:: mouseReleaseEvent(QMouseEvent *e)
{

    if(this->m_PressImagePath.length()!=0)
    {
        QPixmap pix;
        bool ret = pix.load(m_NormalImagePath);
        if(ret!=true)
        {
            qDebug()<<"图片加载失败";
        }

        this->setFixedSize(QSize(pix.width() , pix.height()));

        //设置不规则样式
        this->setStyleSheet("QPushButton{border:0px;}");

        this->setIcon(pix);

        this->setIconSize(QSize(pix.width() , pix.height()));

    }
    return QPushButton::mouseReleaseEvent(e);
}

playscene.cpp

#include "playscene.h"
#include<QDebug>
#include<QMenuBar>
#include<QPainter>
#include"mypushbutton.h"
#include<QTimer>
#include<QLabel>
#include"mycoin.h"
#include<QDebug>
#include<QRect>
#include"dataconfig.h"
#include<QPropertyAnimation>
playscene::playscene(int levelnumber)
{
    QString str = QString("进入了第 %1 关").arg(levelnumber);
    qDebug()<<str;
    this->levelindex = levelnumber;

    //初始化场景
    QMenuBar *bar = menuBar();
    setMenuBar(bar);
    QMenu *startbar = bar->addMenu("开始");
    QAction * quitAction = startbar->addAction("退出");
    connect(quitAction , &QAction::triggered,[=](){
        this->close();
    });

    setWindowIcon(QPixmap(":/res/Coin0001.png"));
    this->setFixedSize(320 , 588);
    setWindowTitle("选择关卡");

    MyPushButton *backBtn = new MyPushButton(":/res/BackButton.png",":/res/BackButtonSelected.png");
    backBtn->setParent(this);
    backBtn->move(this->width()-backBtn->width() , this->height()-backBtn->height());

    connect(backBtn , &QPushButton::clicked,[=](){
        QTimer::singleShot(200,this,[=](){
            emit this->playSceneBack();
        });
    });

    QFont font;
    font.setFamily("微软雅黑");
    font.setPointSize(20);
    QLabel *lable = new QLabel;
    lable->setParent(this);
    lable->setText("Level "+QString::number(this->levelindex));
    lable->setGeometry(30 , this->height()-50 , 120 ,50);
    lable->setFont(font);

    DataConfig config;
    //初始化关卡数组
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<4;++j)
        {
            this->gameArray[i][j] = config.mData[this->levelindex][i][j];
        }
    }


    QLabel *winLabel = new QLabel;
    QPixmap tmpPix;
    tmpPix.load(":/res/LevelCompletedDialogBg.png");
    winLabel->setGeometry(0,0,tmpPix.width() , tmpPix.height());
    winLabel->setPixmap(tmpPix);
    winLabel->setParent(this);
    winLabel->move((this->width()-tmpPix.width())/2, -tmpPix.height());


    //显示金币背景图案
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<4;++j)
        {
            QLabel *lable = new QLabel;
            lable->setGeometry(0,0,50,50);
            lable->setPixmap(QPixmap(":/res/BoardNode.png"));
            lable->setParent(this);
            lable->move(57+i*50 , 200+j*50);

            QString str_tep;
            if(this->gameArray[i][j]==1)
            {
                str_tep = ":/res/Coin0001.png";

            }
            else
            {
                str_tep = ":/res/Coin0008.png";
            }
            MyCoin *btn = new MyCoin(str_tep);
            btn->setGeometry(0,0,50,50);
            btn->setParent(this);
            btn->move(59+i*50 , 204+j*50);

            btn->posX = i;
            btn->posY = j;
            btn->flag = this->gameArray[i][j];
            coinBtn[i][j] = btn;


            connect(btn , &QPushButton::clicked,[=](){
                btn->changeFlag();
                this->gameArray[i][j] = this->gameArray[i][j]==0 ? 1:0;

                //开始翻转周围
                QTimer::singleShot(100,this , [=](){
                    //右侧
                    if(btn->posX+1<=3)
                    {
                        this->coinBtn[btn->posX+1][j]->changeFlag();
                        this->gameArray[btn->posX+1][j] = this->gameArray[btn->posX+1][j]==0 ? 1:0;
                    }
                    //左侧
                    if(btn->posX-1>=0)
                    {
                        this->coinBtn[btn->posX-1][j]->changeFlag();
                        this->gameArray[btn->posX-1][j] = this->gameArray[btn->posX-1][j]==0 ? 1:0;
                    }
                    //下
                    if(btn->posY+1<=3)
                    {
                        this->coinBtn[btn->posX][btn->posY+1]->changeFlag();
                        this->gameArray[btn->posX][btn->posY+1] = this->gameArray[btn->posX][btn->posY+1]==0 ? 1:0;
                    }
                    //上
                    if(btn->posY-1>=0)
                    {
                        this->coinBtn[btn->posX][btn->posY-1]->changeFlag();
                        this->gameArray[btn->posX][btn->posY-1] = this->gameArray[btn->posX][btn->posY-1]==0 ? 1:0;
                    }
                    //开始判断是否胜利
                    if(true == isWin())
                    {
                        qDebug()<<"shengli";
                        SetWin();
                        //开始显示胜利图片
                        QPropertyAnimation *animation1 = new QPropertyAnimation(winLabel , "geometry");
                        animation1->setDuration(500);
                        animation1->setStartValue(QRect(winLabel->x() , winLabel->y() ,
                                                        winLabel->width() , winLabel->height()));
                        animation1->setEndValue(QRect(winLabel->x() , winLabel->y()+114 ,
                                                      winLabel->width() , winLabel->height()));
                        animation1->setEasingCurve(QEasingCurve::OutBounce);
                        animation1->start();
                    }


                });

            });
        }
    }
}

bool playscene:: isWin()
{
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<4;++j)
        {
            if(coinBtn[i][j]->flag == 0)
            {
                return false;
            }
        }
    }
    return true;

}

bool playscene:: SetWin()
{
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<4;++j)
        {
            coinBtn[i][j]->iswin = true;
        }
    }
    return true;

}


void playscene:: paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/PlayLevelSceneBg.png");
    painter.drawPixmap(0 ,0 , this->width() , this->height(),pix);

    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width()/2 , pix.height()/2);
    painter.drawPixmap(10 ,30 , pix);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/295903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress个人博客/杂志主题Pin Premium

Pin Premium WordPress主题是针对博主的时尚且自适应的Pinterest风格主题。使用HTML5和CSS3技术创建&#xff0c;带有有效代码(两个演示)&#xff0c;完全响应&#xff0c;在所有移动设备上看起来完美&#xff0c;可在任何设备和 PC 上轻松使用。 响应式设计针对平板电脑和智能…

YOLOv8改进 | 损失篇 | VarifocalLoss密集目标检测专用损失函数 (VFLoss,原论文一比一复现)

一、本文介绍 本文给大家带来的是损失函数改进VFLoss损失函数,VFL是一种为密集目标检测器训练预测IoU-aware Classification Scores(IACS)的损失函数,我经过官方的版本将其集成在我们的YOLOv8的损失函数使用上,其中有很多使用的小细节(否则按照官方的版本使用根本拟合不了…

【算法】链表-20240105

这里写目录标题 一、LCR 023. 相交链表二、142. 环形链表 II 一、LCR 023. 相交链表 给定两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 提示&#xff1a; listA 中节点数目为 m list…

48种国内外的PCB设计工具-你知道的有哪几种呢?

针对强迫症&#xff0c;非要使用最好最全的工具&#xff1b;针对死较真&#xff0c;认为自己的工具最好用&#xff1b; 工具只是工具&#xff0c;思想最重要&#xff01; 自记录&#xff1a; 无论我们设计什么样的项目&#xff0c;电子工程师都必须知道电路应该如何布局以及…

windows通过ssh连接Liunx服务器并实现上传下载文件

连接ssh 输入&#xff1a;ssh空格用户名ip地址&#xff0c;然后按Enter 有可能出现下图提示&#xff0c;输入yes 回车即可 输入 password &#xff0c;注意密码是不显示的&#xff0c;输入完&#xff0c;再按回车就行了 以上是端口默认22情况下ssh连接&#xff0c;有些公司它…

C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

归并排序 归并算法采用非常经典的分治策略&#xff0c;每次把序列分成n/2的长度&#xff0c;将问题分解成小问题&#xff0c;由复杂变简单。 因为使用了递归算法&#xff0c;不能用于大数据的排序。 核心代码&#xff1a; using System; using System.Text; using System.Co…

nginx下日志配置和排查错误

目录 一&#xff1a;配置 二&#xff1a;排查日志 一&#xff1a;配置 在Nginx中&#xff0c;日志配置是记录服务器活动和排查问题的重要环节。以下是一些常见的Nginx日志配置选项&#xff1a; 日志级别&#xff1a;通过设置日志级别&#xff0c;可以控制日志的详细程度。常…

Java学习笔记(四)——正则表达式

文章目录 正则表达式基本规则字符类(只匹配一个字符)预定义字符(只匹配一个字符)数量词练习正则表达式插件 爬虫利用正则表达式获取想要的内容爬取网络信息练习有条件的爬取贪婪爬取非贪婪爬取正则表达式在字符串中的使用 分组捕获分组正则表达式外部使用非捕获分组正则表达式忽…

fmincon函数求解非线性超越方程的学习记录

最近的算法中用到了fmincon函数&#xff0c;寻找多变量非线性方程最小值的函数&#xff1b;因此学习一下&#xff1b; fmincon函数的基础语法如下所示&#xff1a; fmincon函数是为了求解下列方程的最小值&#xff1b; b 和 beq 是向量&#xff0c;A 和 Aeq 是矩阵&#xff0c…

CentOS 7.6下的HTTP隧道代理配置详解

在CentOS 7.6操作系统中&#xff0c;配置HTTP隧道代理需要一定的技术知识和经验。下面我们将详细介绍如何配置HTTP隧道代理&#xff0c;以确保网络通信的安全性和稳定性。 首先&#xff0c;我们需要了解HTTP隧道代理的基本原理。HTTP隧道代理是一种通过HTTP协议传输其他协议数…

STM32F103C8T6制作简易示波器

1设计需求 通过stm32f103c8t6实现一个简易示波器功能&#xff0c;该示波器可以检测0-3.6khz频率范围内的波形。 也可以输出波形&#xff0c;输出方波、三角波、正弦波。 2技术方案 通过stm32的ADC功能&#xff0c;采集输入信号&#xff0c;最后由oled屏进行显示。 采样频率…

test mutation-00-变异测试概览

拓展阅读 test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍 test 系统学习-05-test jacoco 测试覆盖率与 idea 插件 test 系统学习-06-test jacoco SonarQube Docker learn-29-docker 安装 sonarQube with mysql Ubuntu Sonar 突变测试是什么&#xff1f; …

Harbor配置同步规则删除不掉

【问题原因】 harbor上主从两个仓库&#xff0c;配置同步规则时&#xff0c;定时任务配置太频繁&#xff0c;导致规则修改&#xff0c;删除都失败。 【问题现象】 点击修改后保存&#xff0c;页面报internal server error的错。 【问题排查】 docker ps | grep harbor 查看…

格密码基础:对偶格(超全面)

目录 一. 对偶格的格点 1.1 基本定义 1.2 对偶格的例子 1.3 对偶格的图形理解 二. 对偶格的格基 2.1 基本定义 2.2 对偶格的格基证明 三. 对偶格的行列式 3.1 满秩格 3.2 非满秩格 四. 重复对偶格 五. 对偶格的转移定理&#xff08;transference theorem&#xff…

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…

【论文阅读笔记】医学多模态新数据集-Large-scale Long-tailed Disease Diagnosis on Radiology Images

这是复旦大学2023.12.28开放出来的数据集和论文&#xff0c;感觉很宝藏&#xff0c;稍微将阅读过程记录一下。 Zheng Q, Zhao W, Wu C, et al. Large-scale Long-tailed Disease Diagnosis on Radiology Images[J]. arXiv preprint arXiv:2312.16151, 2023. 项目主页&#xf…

防火安全球阀,到2027年市场增长至68亿美元

防火安全球阀是一种在火灾、爆炸等危险环境下仍能正常使用的阀门。它被广泛用于石化、化工、船舶、电力等领域&#xff0c;以保障生产和人员安全。下面我们将从全球市场和中国市场两个方面对其发展趋势进行分析。全球市场分析&#xff1a; 从全球市场的角度来看&#xff0c;防火…

Springboot和Spring有什么区别

SpringBoot和Spring的关系 不是&#xff1a;从马车到汽车那种交通出行的颠覆&#xff0c;从燃油车到纯电动车那种能源利用的变革&#xff0c;从人工驾驶到AI智能那种驾驶方式的升级。总之&#xff0c;不是产品的升级换代&#xff0c;不是谁要替换谁。而是&#xff1a;汽车从手…

Qt/C++摄像头采集/二维码解析/同时采集多路/图片传输/分辨率帧率可调/自动重连

一、前言 本地摄像头的采集可以有多种方式&#xff0c;一般本地摄像头会通过USB的方式连接&#xff0c;在嵌入式上可能大部分是CMOS之类的软带的接口&#xff0c;这些都统称本地摄像头&#xff0c;和网络摄像头最大区别就是一个是通过网络来通信&#xff0c;一个是直接本地通信…

操作系统期末复习大题---经典进程的同步问题

目录 一、经典进程的同步问题 1. 利用记录型信号量解决生产者—消费者问题 执行流程&#xff1a; ”生产者-消费者”问题模型代码框架如下&#xff1a; 注意&#xff1a; 小结&#xff1a; 复习典型例题&#xff1a; 解答&#xff1a; 2. 利用AND信号量解决生产者——…