文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Opencv开发实现拼图游戏

2024-04-02 19:55

关注

本文实例为大家分享了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、在修改参数时,注意部分常数是应该与参数同时变化的。

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯