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;
}
2.입 출력 설명1.const string SF 를 퍼 즐 그림 경로 로 합 니 다.
2.w/s/d/a 방향 조작 에 사용
3.방향 조작 부 호 를 입력 할 때마다 Enter 키 를 입력 하여 확인 합 니 다.
4,매번 실행 전,3 초 원래 사진 을 보 여 줍 니 다
3.존재 하 는 문제
1.마우스 로 창 을 끌 때 응답 이 없 음 을 알 릴 수 있 습 니 다.조금 만 기다 리 면 계속 작업 할 수 있 습 니 다.
2.매개 변 수 를 수정 할 때 일부 상 수 는 매개 변수 와 동시에 변화 해 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Opencv 학습 노트 (2): Opencv 의 기본 데이터 형식 과 데이터 구조매트릭스 데이터 형식: C 언어 에서 2 차원 데이터 중의 데이터 형식, 예 를 들 어 int, float, char 등 과 같다.Opencv 에서 행렬 의 데이터 형식 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.