qt实现扫雷

文件源码链接,方便查看

链接:https://pan.baidu.com/s/16He134AuWGjzcYca2TzaNg?pwd=0422 
提取码:0422

一、游戏界面介绍 

1e4addf305a94fe1ab09eda72cbea5ec.png63318307244e4118b8cdd290233c9371.png

 二、制作中用的素材(可以ps直接写几个数字)

图片大小为32*32

3f3536f7cfaf484e9f1a2700572e40cd.pngd486a9ee1fcb4b87bf57dea6b04ef106.png7b9c7193a68e47d39c168bb76933168f.pnga24400db471c43349e162e5b1405f64c.pnga17973f117d641cf8254dc986d6ec300.png0620e9fb736d4e518228f6bef170edc7.png429b016616ad4145bf4c087b43e7288a.pngac70fc416bd744b08fcab32b9c597a1f.png1652cf19e3174832a682892c34a1eae3.png97ca4bc6cf454287bf9745825e8cbb58.png419e8022f84e4f5aa9e09084710a40ae.png

三、将图片加入项目(步骤略)

42dc5c18821949f28c95d23c1b8fda48.png

四、 书写代码

1.mainwindow.h文件(我创建的)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QMap>
#include<QImage>
#include<QPainter>
#include<QPaintEvent>
#include<QMouseEvent>

#define row 10
#define lie 10
#define Wid row*32
#define Hig lie*32
#define count_boom 10


enum s
{
    Zero=0,One,Two,Three,Four,Five,Six,Seven,Eight,Boom,Unknow
};
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    QMap<int,QImage>msin;
    QPainter* mpainter=new QPainter;
    QImage mdata[row][lie];
    QImage mshow[row][lie];
 void setsin();

 void setboom();

 virtual void paintEvent(QPaintEvent *event);

virtual void mousePressEvent(QMouseEvent*event);


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

 2.mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QImage>
#include<QDebug>
#include<QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


}

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

void MainWindow::setsin()
{
    msin[Zero   ]={"://picture/0.png"};
    msin[One    ]={"://picture/1.png"};
    msin[Two    ]={"://picture/2.png"};
    msin[Three  ]={"://picture/3.png"};
    msin[Four   ]={"://picture/4.png"};
    msin[Five   ]={"://picture/5.png"};
    msin[Six    ]={"://picture/6.png"};
    msin[Seven  ]={"://picture/7.png"};
    msin[Eight  ]={"://picture/8.png"};
    msin[Boom   ]={"://picture/boom.png"};
    msin[Unknow ]={"://picture/unkown.png"};

}

int boom_num(QImage mdata[row][lie],int x,int y,QMap<int,QImage>msin)
{
    int num=0;
    if(mdata[x][y]==msin[Boom])
        return -1;
    for(int i=-1;i<=1;i++)
    {
        for(int j=-1;j<=1;j++)
        {
            if((x+i<0||y+j<0)||(x+i>=row||y+j>=lie))
                continue;
            else if((i==0&&j==0))
                continue;
           else if(mdata[x+i][y+j]==msin[Boom])
            {
                num++;
            }
        }
    }
    return num;
}

 void MainWindow::setboom()
 {
     for(int i=0;i<row;i++)
     {
         for(int j=0;j<lie;j++)
         {
             mshow[i][j]=msin[Unknow];
             mdata[i][j]=msin[Unknow];
         }
     }
     for(int i=0;i<count_boom;i++)
     {
         int x=rand()%row;
         int y=rand()%lie;
         mdata[x][y]=msin[Boom];
     }

     for(int i=0;i<row;i++)
     {
         for(int j=0;j<lie;j++)
         {
             if(boom_num(mdata,i,j,msin)!=-1)
             mdata[i][j]=msin[boom_num(mdata,i,j,msin)];
         }
     }

 }

void MainWindow::paintEvent(QPaintEvent *event)
{
    mpainter->begin(this);

    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            mpainter->drawImage(32*i,32*j,mshow[i][j]);
        }
    }
    mpainter->end();
}

void detect_move(QImage mdata[row][lie],QImage mshow[row][lie],int x,int y,QMap<int,QImage>msin)
{
    if(x>=row||y>=lie||x<0||y<0)
        return;
    if(mshow[x][y]!=msin[Unknow])
        return;
    mshow[x][y]=mdata[x][y];
    if(mshow[x][y]==msin[Zero])
    {
        detect_move(mdata,mshow,x+1,y,msin);
        detect_move(mdata,mshow,x-1,y,msin);
        detect_move(mdata,mshow,x,y+1,msin);
        detect_move(mdata,mshow,x,y-1,msin);
        detect_move(mdata,mshow,x-1,y-1,msin);
        detect_move(mdata,mshow,x+1,y-1,msin);
        detect_move(mdata,mshow,x-1,y+1,msin);
        detect_move(mdata,mshow,x+1,y+1,msin);
    }
}


void detect_boom(QImage mdata[row][lie],QImage mshow[row][lie],int x,int y,QMap<int,QImage>msin)
{

    if(mdata[x][y]==msin[Zero])
    {
        detect_move(mdata,mshow,x,y,msin);
    }
    else
    {
        mshow[x][y]=mdata[x][y];
    }


}
bool is_Win(QImage mshow[row][lie],QMap<int,QImage>msin)
{
    int num=0;
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            if(mshow[i][j]==msin[Unknow])
                num++;
        }
    }
    if(num==count_boom)
        return true;
    else return 0;
}

 void MainWindow::mousePressEvent(QMouseEvent*event)
 {
     int x=event->x()/32;
     int y=event->y()/32;
     qDebug()<<x<<" "<<y;
     if(mdata[x][y]==msin[Boom])
     {
         QMessageBox::warning(this,"提示","游戏结束了",QMessageBox::Ok);
            for(int i=0;i<row;i++)
            {
                for(int j=0;j<lie;j++)
                {
                    mshow[i][j]=mdata[i][j];
                }
            }
         repaint();
         return;
     }
     detect_boom(mdata,mshow, x, y,msin);

     repaint();


     if(is_Win(mshow,msin))
         QMessageBox::question(this,"提示","你赢了",QMessageBox::Ok);
 }

3.main.cpp

#include "mainwindow.h"

#include <QApplication>
#include<time.h>
int main(int argc, char *argv[])
{
    srand((unsigned int)time(NULL));
    QApplication a(argc, argv);
    MainWindow w;
    w.setFixedSize(Wid,Hig);
    w.setsin();
    w.setboom();
    w.show();
    return a.exec();
}

93a1c6bcc78d45c5869025a5d2080530.png

完成后的界面图 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值