本文实例为大家分享了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、在修改参数时,注意部分常数是应该与参数同时变化的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。