qt如何打乱数组元素顺序及数字华容道小游戏的实现

一、数组元素内部怎么打乱?

我开始使用vector容器如何想用random_shuffle函数来打乱,然后我发现我不会用这个,vs的c++感觉用上去没什么问题,但我发现qt好像不认random_shuffle,终究还得靠自己,干脆不用vector了,因为画图一维数组真的不好用

怎么实现呢?看看下面的例子

    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            int x=rand()%row;
            int y=rand()%lie;
            QImage img;
            img=mshow[i][j];
            mshow[i][j]=mshow[x][y];
            mshow[x][y]=img;
        }
    }

反正就是每一个位置我都随机生成应该位置与之交换嘛

二、游戏的实现界面

素材

 

这个虽然有点奇怪,因为我不记得了哪个字体是哪个,所以粗细有点尴尬

三、步骤及简要分析

这个和扫雷我觉得都是qt最简单的案例,可以试试,扫雷是用鼠标事件,而这个用的是键盘事件,都是利用画画事件来实现,没有什么特别的,如果学到qt建议可以打打这两个游戏

1.导入素材(略)

2.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QMap>
#include<QPaintEvent>
#include<QPainter>
#include<QPoint>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    QMap<int,QImage>V;

    ~MainWindow();
    void initV();
    void initshow();
   void move(int x,int y);
  bool is_win();
    virtual void keyPressEvent(QKeyEvent *event);
    virtual void paintEvent(QPaintEvent *event);
private:
    Ui::MainWindow *ui;
    int row;int lie;
    QImage mshow[4][4];
    QPainter *mpainter;
    QPoint mpos;
};
#endif // MAINWINDOW_H

3.mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<time.h>
#include<QDebug>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    row=4;
    lie=4;
    this->resize(4*40,4*40);
    srand((unsigned int)time(NULL));
    mpainter=new QPainter;

    initV();
    initshow();
}

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

void MainWindow::initV()
{
    V[0]=QImage("://picture/0.png");
    V[1]=QImage("://picture/1.png");
    V[2]=QImage("://picture/2.png");
    V[3]=QImage("://picture/3.png");
    V[4]=QImage("://picture/4.png");
    V[5]=QImage("://picture/5.png");
    V[6]=QImage("://picture/6.png");
    V[7]=QImage("://picture/7.png");
    V[8]=QImage("://picture/8.png");
    V[9]=QImage("://picture/9.png");
    V[10]=QImage("://picture/10.png");
    V[11]=QImage("://picture/11.png");
    V[12]=QImage("://picture/12.png");
    V[13]=QImage("://picture/13.png");
    V[14]=QImage("://picture/14.png");
    V[15]=QImage("://picture/15.png");
}

void MainWindow::initshow()
{
    int k=1;
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            if(k<=15)
            mshow[i][j]=V[k++];
        }
    }
    mshow[3][3]=V[0];
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            int x=rand()%row;
            int y=rand()%lie;
            QImage img;
            img=mshow[i][j];
            mshow[i][j]=mshow[x][y];
            mshow[x][y]=img;
        }
    }
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            if(mshow[i][j]==V[0])
                mpos=QPoint(i,j);

        }
    }
}

void MainWindow::move(int dx,int dy)
{
    if(mpos.x()+dx>=4||mpos.y()+dy>=4||mpos.x()+dx<0||mpos.y()+dy<0)
    {
        return;
    }
    else
    {
        QImage img;
        qDebug()<<dx<<","<<dy;
        qDebug()<<mpos.x()<<","<<mpos.y();

        img=mshow[mpos.x()][mpos.y()];
        mshow[mpos.x()][mpos.y()]=mshow[mpos.x()+dx][mpos.y()+dy];
        mshow[mpos.x()+dx][mpos.y()+dy]=img;

        qDebug()<<dx<<","<<dy;
        qDebug()<<mpos.x()<<","<<mpos.y();
        mpos.rx()=mpos.x()+dx;
        mpos.ry()=mpos.y()+dy;

        qDebug()<<mpos.x()<<","<<mpos.y();

        repaint();
    }
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    mpainter->begin(this);
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<lie;j++)
        {
            mpainter->drawImage(40*j,40*i,mshow[i][j]);

        }
    }

    mpainter->end();
}

bool MainWindow::is_win()
{
    int k=1;
    for(int i=0;i<row;i++)
        for(int j=0;j<lie;j++)
        {
            if(k<=15)
            {
                if(mshow[i][j]!=V[k++])
                {

                    return false;
                }
            }
        }
    return true;
}


void MainWindow::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
        case Qt::Key_Up:
    {
        move(-1,0);

        break;
    }
    case Qt::Key_Down:
{
    move(1,0);
    break;
}
    case Qt::Key_Left:
{
    move(0,-1);
    break;
}
    case Qt::Key_Right:
{
    move(0,1);
    qDebug()<<"6";
    break;
}
    }
    if(is_win())
    {
        QMessageBox::information(this,"提示","你赢了");
        qDebug()<<"end";
    }

}

5.main.cpp

#include "mainwindow.h"

#include <QApplication>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值