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++ const的各种用法详解

    C++ const的各种用法详解

    const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。本文主要谈谈const的用法,感兴趣的同学可以参考阅读
    2023-04-04
  • C语言中switch语句基本用法实例

    C语言中switch语句基本用法实例

    switch的中文翻译是开关,顾名思义,开关的作用就是控制连通或者中断,在C语言中switch语句的作用也是大同小异,下面这篇文章主要给大家介绍了关于C语言中switch语句基本用法的相关资料,需要的朋友可以参考下
    2022-07-07
  • 深入理解Qt中各种消息框对话框的使用

    深入理解Qt中各种消息框对话框的使用

    本篇文章主要介绍了Qt中各种消息框的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 超详细的c语言字符串操作函数教程

    超详细的c语言字符串操作函数教程

    字符串是一种重要的数据类型,有零个或多个字符组成的有限串行,下面这篇文章主要给大家介绍了关于c语言字符串操作函数的相关资料,需要的朋友可以参考下
    2021-10-10
  • 利用C语言的Cairo图形库绘制太极图实例教程

    利用C语言的Cairo图形库绘制太极图实例教程

    这几天都在研究Cairo图形库,这是一个开源跨平台的图形库,相对于OpenGL来说更容易上手使用。这篇文章是利用C语言的Cairo图形库绘制了一个太极图,对大家学习Cairo图形库具有一定的参考借鉴价值,下面来一起看看吧。
    2016-12-12
  • C++ 详细讲解对象的构造顺序

    C++ 详细讲解对象的构造顺序

    对象的构造往往和构造函数会牵扯在一起,构造函数的函数可能会由非常复杂的逻辑所组成,不同类的构造函数的程序逻辑很可能是相互依赖的,当这种相互依赖一旦成立,那么对象的构造顺序很可能导致难以调试的Bug出现
    2022-04-04
  • C++类中六个默认的成员函数详解

    C++类中六个默认的成员函数详解

    这篇文章主要给大家介绍了关于C++类中六个默认的成员函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++实现双向链表

    C++实现双向链表

    这篇文章主要为大家详细介绍了C++实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 如何用C++实现A*寻路算法

    如何用C++实现A*寻路算法

    寻路是游戏比较重要的一个组成部分。因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能。本文将介绍一个经常被使用且效率理想的寻路方法-A*寻路算法,并且提供额外的优化思路
    2021-06-06
  • C语言scanf,fscanf和sscanf的区别

    C语言scanf,fscanf和sscanf的区别

    每种语言都对正则表达式有着不同程度的支持,在C语言中,有输入功能的这三个函数对正则表达式的支持并不强大,但是我们还是有必要了解一下
    2021-10-10

最新评论