Opencv开发实现拼图游戏

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

一、代码

#include<opencv2/opencv.hpp>#include<iostream>#include<stdlib.h>#include<time.h>#define PL 800#define PW 600#define EAZY 50using 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、在修改参数时,注意部分常数是应该与参数同时变化的。

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

才能做到人在旅途,感悟人生,享受人生。

Opencv开发实现拼图游戏

相关文章:

你感兴趣的文章:

标签云: