Opencv开发实现拼图游戏

 更新时间:2021年07月23日 14:59:16   作者:HansBrent  
这篇文章主要为大家详细介绍了Opencv开发实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Opencv开发实现拼图游戏的具体代码,供大家参考,具体内容如下

一、代码

#include<opencv2/opencv.hpp>
#include<iostream>
#include<stdlib.h>
#include<time.h>

#define PL 800
#define PW 600
#define EAZY 50


using namespace std;
using namespace cv;

const Size Dsize = Size (PL,PW);
const Size dsize = Size (PL+9,PW+6);
const string SF="D:\\code\\c\\opencv\\opencv_face_detection_database\\sample\\1.jpg";
int  readimg(Mat &img);
void department(Mat img,int imgmap[4][4],Mat gameimg[16]);
void radom(int imgmap[4][4]);
void showimg(Mat img[16],int imgmap[4][4]);
void moveimg(int imgmap[4][4]);
int gameover(int imgmap[4][4]);
int judge(char ch);
int fx,fy;

int  readimg(Mat &img)
{
    Mat gameimg=imread(SF,1);
    if(gameimg.empty())
    {
        cout<<SF<<endl<<"Fail to open the file!"<<endl;
        return 0;
    }
    resize(gameimg,img,Dsize);

    return 1;
}

void department(Mat img,int imgmap[4][4],Mat gameimg[16])
{
    Mat whiteimg=Mat(150,200,CV_8UC3,Scalar(255,255,255));
    Mat new_img;
    Rect rec;
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            rec.width=200;
            rec.height=150;
            rec.x=i*200;
            rec.y=j*150;
            if(i*j!=9)
                new_img=img(rec);
            else
                new_img=whiteimg;
            gameimg[i*4+j]=new_img;
            waitKey(100);
            imgmap[i][j]=i*4+j;
        }
    }

    fx=3,fy=3;
    return ;
}

int judge(char ch)
{
    if(ch!='w'&&ch!='W')
        if(ch!='S'&&ch!='s')
            if(ch!='a'&&ch!='A')
                if(ch!='d'&&ch!='D')
                    return 0;
    return 1;
}

void moveimg(int imgmap[4][4],char ch)
{
    int x,y,mid;
    switch(ch)
    {
    case 'w':
    case 'W':
        x=fx;
        y=fy-1;
        if(y<0)
            return ;
        break;

    case 'a':
    case 'A':
        x=fx-1;
        y=fy;
        if(x<0)
            return ;
        break;

    case 'S':
    case 's':
        x=fx;
        y=fy+1;
        if(y>3)
            return ;
        break;

    case 'd':
    case 'D':
        x=fx+1;
        y=fy;
        if(x>3)
            return ;
        break;

    }
    mid=imgmap[fx][fy];
    imgmap[fx][fy]=imgmap[x][y];
    imgmap[x][y]=mid;
    fx=x,fy=y;
    return ;
}

void radom(int imgmap[4][4])
{
    int x=99307,y=77431;
    int t;
    srand((unsigned)time(NULL));
    t=rand();
    char ch;
    for(int i=1; i<EAZY; i++)
    {

        t=(t+x)%4;
        switch(t)
        {
        case 0:
            ch='a';
            break;
        case 1:
            ch='s';
            break;
        case 2:
            ch='w';
            break;
        case 3:
            ch='d';
            break;
        }
        moveimg(imgmap,ch);
        x=x*x%y;
    }

}

void showimg(Mat *img,int imgmap[4][4])
{
    Mat gameimg=Mat(dsize,CV_8UC3,Scalar(0,0,0));
    Rect rec;

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            rec.width=200;
            rec.height=150;
            rec.x=i*203;
            rec.y=j*152;
            img[imgmap[i][j]].copyTo(gameimg(rec));
        }
    }
    imshow("game",gameimg);
    waitKey(1000);
    return ;
}

int gameover(int imgmap[4][4])
{
    int s=0;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        if(imgmap[i][j]==i*4+j)
        s++;
    if(s==16)
        return 1;
    return 0;
}
int main()
{
    Mat img;
    Mat gameimg[16];
    int imgmap[4][4]= {};
    char ch;
    if(!readimg(img))
        return 0;
    imshow("img",img);
    waitKey(2000);
    destroyWindow("img");

    department(img,imgmap,gameimg);
    radom(imgmap);

    while(1)
    {
        showimg(gameimg,imgmap);
        if(gameover(imgmap))
            {
                destroyWindow("game");
                imshow("img",img);
                waitKey(1000);
                break;
            }
        ch=getchar();
        while(!judge(ch))
            ch=getchar();
        moveimg(imgmap,ch);
    }
    return 0;

}

二、输入输出说明

1、const string SF 为拼图图片路径
2、w/s/d/a 用于方向操作
3、每次输入方向操作符,都要输入回车键作为确认
4、在每次运行前,都会展示3秒原图片

三、存在的问题

1、在用鼠标进行拖拽窗口时,可能会提示无响应,等待一段时间就可以继续操作了。
2、在修改参数时,注意部分常数是应该与参数同时变化的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言深入探究水仙花数与变种水仙花数代码

    C语言深入探究水仙花数与变种水仙花数代码

    求水仙花数和变种水仙花数是非常适合初学者学习的代码,其中包含的循环和逻辑方式等知识点。这既能起到对以往知识的复习,也可以学习到一种不同的逻辑思考方式
    2022-05-05
  • 深入了解C++智能指针的使用

    深入了解C++智能指针的使用

    智能指针的本质就是使用一个对象来接管一段开辟的空间,在该对象在销毁的时候,自动调用析构函数来释放这段内存。本文就来和大家详细聊聊智能指针的使用,需要的可以参考一下
    2022-10-10
  • C语言编程中函数的基本学习教程

    C语言编程中函数的基本学习教程

    这篇文章主要介绍了C语言编程中函数的基本学习教程,其中着重讲到了传值调用与参数,需要的朋友可以参考下
    2015-12-12
  • C语言实现与电脑玩剪刀石头布游戏

    C语言实现与电脑玩剪刀石头布游戏

    这篇文章主要为大家详细介绍了如何通过C语言实现和电脑玩剪刀石头布游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-11-11
  • QT实现简单音乐播放器

    QT实现简单音乐播放器

    这篇文章主要为大家详细介绍了QT实现简单的音乐播放器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C++对象的浅复制和深复制详解及简单实例

    C++对象的浅复制和深复制详解及简单实例

    这篇文章主要介绍了C++对象的浅复制和深复制详解及简单实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • C++取得当前时间的方法

    C++取得当前时间的方法

    这篇文章主要介绍了C++取得当前时间的方法,实例展示了通过系统函数获取当前时间的实现方法,非常简单易懂,需要的朋友可以参考下
    2014-10-10
  • Qt正则表达式使用举例

    Qt正则表达式使用举例

    这篇文章主要给大家介绍了关于Qt正则表达式使用的相关资料,Qt中的正则表达式模式匹配功能由QRegExp类实现,它完全支持Unicode,并可以应用于字符串验证、搜索、查找替换和分割等场景,需要的朋友可以参考下
    2024-02-02
  • C++异常处理入门(try和catch)

    C++异常处理入门(try和catch)

    C++ 提供了异常机制,让我们能够捕获运行时错误,本文就详细的介绍了C++异常处理入门,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 如何在C++中建立一个顺序表

    如何在C++中建立一个顺序表

    在使用顺序表之前,首先创建一个空的顺序表,也就是初始化顺序表。这里,在程序中只需设置顺序表的结点数量ListLen为0即可。这样,后面需要添加的数据元素将从顺序表的第一个位置存储
    2013-10-10

最新评论