• 大小: 6KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-06
  • 语言: 其他
  • 标签: Qt  拼图游戏  

资源简介

利用Qt实现了简单的拼图游戏。 打开图片后,程序将其缩放到 512*512。

资源截图

代码片段和文件信息

#include “imglbl.h“
#include “qdebug.h“

ImgLbl::ImgLbl(QWidget *parent) :
    QLabel(parent)
{
    setFixedSize(513 513);
    setAlignment(Qt::AlignTop | Qt::AlignLeft);
    setMouseTracking(true);
    fstX = -1;
    fstY = -1;
    sndX = -1;
    sndY = -1;
    Isfst = false;
}

void ImgLbl::changeSLT()
{
    for(int i = 0; i < RN * 3 / 4; i++)
    {
        int x = rand() % RN y = rand() % RN;
        int lt = TmpSLT[x];
        TmpSLT[x] = TmpSLT[y];
        TmpSLT[y] = lt;
    }
}

bool ImgLbl::checkSLT()
{
    bool isSLT = true;
    for(int i = 0; i < RN; i++)
    {
        if(TmpSLT[i] != i)
            isSLT = false;
    }
    return isSLT;   //按顺序排列,返回true
}

void ImgLbl::init_data()
{
    TmpSLT.clear();
    RawRect.clear();
    fstX = -1;
    fstY = -1;
    sndX = -1;
    sndY = -1;
    Isfst = false;
}

void ImgLbl::GetPixmap(QPixmap _pix)
{
    RawPix = _pix.scaled(512 512 Qt::IgnoreAspectRatio Qt::SmoothTransformation);
    TmpPix = RawPix;
    setPixmap(TmpPix);
}

void ImgLbl::GetLevel(int i)
{
    init_data();
    lv = i;

    int dn = i;  //分割次数
    DN = dn;

    int rn = dn * dn;   //子图像数
    RN = rn;

    int d_pix = 512 / dn;   //间隔像素
    DPix = d_pix;

    RawRect.resize(rn);
    TmpSLT.resize(rn);
    for(int i = 0; i < rn ; i++)
    {
        TmpSLT[i] = i;

        int y = i / dn x = i - (y * dn);  //行列
        y = y * d_pix;  x = x * d_pix;
        QPixmap pix;
        pix = RawPix.copy( x y d_pix d_pix );
        RawRect[i] = pix;
    }

    while(checkSLT())
        changeSLT();

    TmpPix.fill(Qt::black);
    QPainter paint(&TmpPix);
    for(int i = 0; i < rn; i++)
    {
        int y = i / dn x = i - (y * dn);  //行列
        y = y * d_pix;  x = x * d_pix;
        paint.drawPixmap(x y d_pix d_pix RawRect[TmpSLT[i]]);
    }
    paint.end();

    setPixmap(TmpPix);

}

void ImgLbl::mousePressEvent(QMouseEvent *e)
{
    if(!Isfst)
    {
        //第一点赋值
        int x = e->pos().x() / DPix y = e->pos().y() / DPix;
        fstX = x; fstY = y;
        QPixmap pix = TmpPix;
        QPainter paint(&pix);
        paint.setPen(QPen(Qt::yellow 2));
        paint.drawRect( x * DPix - 2 y * DPix - 2 DPix + 4 DPix + 4 );
        paint.end();
        setPixmap(pix);
        Isfst = true;
    }
    else
    {
        int x = e->pos().x() / DPix y = e->pos().y() / DPix;
        sndX = x; sndY = y;
        int dst = abs(fstX - sndX) + abs(fstY - sndY);  //距离
        if(dst == 1)    //行相邻或列相邻
        {
            int lt1 = fstY * DN + fstX lt2 = sndY * DN + sndX;
            int lt = TmpSLT[lt1];
            TmpSLT[lt1] = TmpSLT[lt2];
            TmpSLT[lt2] = lt;

            QPainter paint(&TmpPix);
            paint.drawPixmap(fstX * DPix fstY * DPix DPix DPix RawRect[TmpSLT[lt1]]);
            paint.drawPixmap(sndX * DPix sndY * DPix DPix DPix RawRect[TmpSLT[lt2]]);
           

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3470  2016-12-23 11:25  JigSawPuzzle0\imglbl.cpp

     文件        923  2016-12-23 11:12  JigSawPuzzle0\imglbl.h

     文件        420  2016-12-22 21:54  JigSawPuzzle0\JigSawPuzzle0.pro

     文件      18242  2016-12-23 11:29  JigSawPuzzle0\JigSawPuzzle0.pro.user

     文件        183  2016-12-22 21:52  JigSawPuzzle0\main.cpp

     文件        528  2016-12-23 11:16  JigSawPuzzle0\mainwindow.cpp

     文件        436  2016-12-23 11:17  JigSawPuzzle0\mainwindow.h

     文件       1306  2016-12-23 11:18  JigSawPuzzle0\mainwindow.ui

     目录          0  2016-12-23 11:29  JigSawPuzzle0

----------- ---------  ---------- -----  ----

                25508                    9


评论

共有 条评论