本文实例为大家分享了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、在修改参数时,注意部分常数是应该与参数同时变化的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/217948/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)