如何利用Matlab制作一款真正的拼图小游戏


Posted in Python onMay 11, 2021

效果:

如何利用Matlab制作一款真正的拼图小游戏
如何利用Matlab制作一款真正的拼图小游戏
如何利用Matlab制作一款真正的拼图小游戏

简单原理介绍:

1构造0,1矩阵作为每片拼图的透明度,可以构造出不规则形状的拼图(image函数有alphaData属性可以设置)

jigsawMask=zeros(101*5,101*5);
jigsawMask(102:404,102:404)=1;
[xMesh,yMesh]=meshgrid(1:101*5,1:101*5);
dis1=sqrt((xMesh-51).^2+(yMesh-253).^2);
dis2=sqrt((xMesh-505+50).^2+(yMesh-253).^2);
dis3=sqrt((xMesh-253).^2+(yMesh-152).^2);
dis4=sqrt((xMesh-253).^2+(yMesh-505+151).^2);
bool1=dis1<=50;
bool2=dis2<=50;
bool3=dis3<=50;
bool4=dis4<=50;
jigsawMask(bool1)=1;
jigsawMask(bool2)=1;
jigsawMask(bool3)=0;
jigsawMask(bool4)=0;
jigsawMask(253-25:253+25,51:505-50)=1;
jigsawMask(1:152,253-25:253+25)=0;
jigsawMask(505-151:505,253-25:253+25)=0;

如何利用Matlab制作一款真正的拼图小游戏

2为每片拼图块设置ButtonDownFcn属性,将其改造成按钮

完整代码:

function jigsaw2(path)

if nargin<1||isempty(path)
    [filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.jpeg','All Image Files';...
            '*.*','All Files' });
    path = [pathname,filename];
    
end
oriPic=imread(path);
%imshow(oriPic)

jigsawMask=zeros(101*5,101*5);
jigsawMask(102:404,102:404)=1;
[xMesh,yMesh]=meshgrid(1:101*5,1:101*5);
dis1=sqrt((xMesh-51).^2+(yMesh-253).^2);
dis2=sqrt((xMesh-505+50).^2+(yMesh-253).^2);
dis3=sqrt((xMesh-253).^2+(yMesh-152).^2);
dis4=sqrt((xMesh-253).^2+(yMesh-505+151).^2);
bool1=dis1<=50;
bool2=dis2<=50;
bool3=dis3<=50;
bool4=dis4<=50;
jigsawMask(bool1)=1;
jigsawMask(bool2)=1;
jigsawMask(bool3)=0;
jigsawMask(bool4)=0;
jigsawMask(253-25:253+25,51:505-50)=1;
jigsawMask(1:152,253-25:253+25)=0;
jigsawMask(505-151:505,253-25:253+25)=0;


resizePic=imresize(oriPic,[101*(3*4+2),101*(3*4+2)]);
Mainfig=figure('units','pixels','position',[300 80 720 400],...
                       'Numbertitle','off','menubar','none','resize','off',...
                       'name','jigsaw');
Mainaxes=axes('parent',Mainfig,'position',[0 0 1 1],...
                    'XLim', [0 720],...
                    'YLim', [0 400],...
                    'NextPlot','add',...
                    'layer','bottom',...
                    'YDir','reverse',...
                    'Visible','on',...
                    'XTick',[], ...
                    'YTick',[]);
                
                
image(Mainaxes,[420,420+14*20],[20,20+14*20],resizePic)
whiteMask=150*ones(100,100,3);
whiteMask(2:99,2:99,:)=255;
for i=1:4
    for j=1:4
        image(Mainaxes,440+[0,60]+(j-1)*60,40+[0,60]+(i-1)*60,uint8(whiteMask),...
            'UserData',[i,j]','Visible','on');
    end
end
for i=1:4
    for j=1:4
        picHdlR(j+(i-1)*4)=image(Mainaxes,420+[0,100]+(j-1)*60,20+[0,100]+(i-1)*60,uint8(zeros(100,100,3)),'alphaData',zeros(100,100),...
            'UserData',j+(i-1)*4,'ButtonDownFcn',@putPiece,'Visible','on');
    end
end

logsheetR=zeros(1,16);
    function putPiece(object,~)
        object.UserData
        if logsheetR(object.UserData)==0&&handHdl.UserData~=0
            object.CData=handHdl.CData;
            object.AlphaData=handHdl.AlphaData;
            logsheetR(object.UserData)=handHdl.UserData;
            handHdl.UserData=0;
            handHdl.CData=uint8(zeros(100,100,3));
            handHdl.AlphaData=zeros(100,100);
        elseif logsheetR(object.UserData)~=0&&handHdl.UserData==0
            handHdl.UserData=logsheetR(object.UserData);
            handHdl.CData=object.CData;
            handHdl.AlphaData=object.AlphaData;
            logsheetR(object.UserData)=0;
            object.CData=uint8(zeros(100,100,3));
            object.AlphaData=zeros(100,100);
        end
        if all(logsheetR==1:16)
            text1.String='恭喜你,游戏胜利!';
        end
    end



%==========================================================================
                
for i=1:4
    for j=1:4
        tempPiece=resizePic((i-1)*303+1:(i-1)*303+505,(j-1)*303+1:(j-1)*303+505,:);
        if mod(i+j,2)==0     
            tempMask=jigsawMask';
        else
            tempMask=jigsawMask;
        end
        if j==1
            tempMask(:,1:101)=0;
            tempMask(102:404,102:201)=1;
        end
        if j==4
            tempMask(:,405:505)=0;
            tempMask(102:404,304:404)=1;
        end
        if i==1
            tempMask(1:101,:)=0;
            tempMask(102:201,102:404)=1;
        end
        if i==4
            tempMask(405:505,:)=0;
            tempMask(304:404,102:404)=1;
        end
        picHdl(j+(i-1)*4)=image(Mainaxes,[0,100]+(j-1)*100,[0,100]+(i-1)*100,tempPiece,'alphaData',tempMask,...
            'UserData',j+(i-1)*4,'ButtonDownFcn',@selectPiece);
        
        whiteHdl(j+(i-1)*4)=image(Mainaxes,[0,100]+(j-1)*100,[0,100]+(i-1)*100,uint8(240*ones(100,100,3)),'alphaData',ones(100,100),...
            'UserData',[i,j],'ButtonDownFcn',@selectPiece,'Visible','off');
    end
end

RandNum=rand(1,16);
[~,logSheet]=sort(RandNum);

for i=1:4
    for j=1:4
        picHdl(logSheet(j+(i-1)*4)).XData=[0,100]+(j-1)*100;
        picHdl(logSheet(j+(i-1)*4)).YData=[0,100]+(i-1)*100;
    end
end


handHdl=image(Mainaxes,[0,100],[0,100],uint8(zeros(100,100,3)),...
    'alphaData',zeros(100,100),'UserData',0,'PickableParts','none');

    set(gcf,'WindowButtonMotionFcn',@onhandfunc)
    function onhandfunc(~,~)
        xy=get(gca,'CurrentPoint');
        x=xy(1,1);y=xy(1,2);
        handHdl.XData=[x-50,x+50];
        handHdl.YData=[y-50,y+50];  
    end

    function selectPiece(object,~)
        %object.UserData
        if length(object.UserData)==1
            if handHdl.UserData~=0
                picHdl(handHdl.UserData).Visible='on';  
                whiteHdl(logSheet==handHdl.UserData).Visible='off';
            end
            object.Visible='off';
            whiteHdl(logSheet==object.UserData).Visible='on';
            
            handHdl.UserData=object.UserData;
            handHdl.CData=object.CData;
            handHdl.AlphaData=object.AlphaData;
        else
            if handHdl.UserData==0
            else
                ii=object.UserData(1);
                jj=object.UserData(2);
                object.Visible='off';
                picHdl(handHdl.UserData).XData=[0,100]+(jj-1)*100;
                picHdl(handHdl.UserData).YData=[0,100]+(ii-1)*100;
                picHdl(handHdl.UserData).Visible='on';
                logSheet(jj+(ii-1)*4)=handHdl.UserData;
                
                handHdl.UserData=0;
                handHdl.CData=uint8(zeros(100,100,3));
                handHdl.AlphaData=zeros(100,100);              
            end
        end 
    end
%==========================================================================
fill([420,420+14*20,420+14*20,420],[320,320,380,380],[0.9412    0.9412    0.9412],'LineWidth',5,'EdgeColor',[0.7,0.7,0.7])
text1=text(430,350,'请点击拼图块中心位置移动拼图块','fontSize',12);

end

运行m文件后选择一张接近方形的图片即可开始游戏

如何利用Matlab制作一款真正的拼图小游戏

总结

到此这篇关于如何利用Matlab制作一款真正的拼图小游戏的文章就介绍到这了,更多相关Matlab拼图小游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python文件夹与文件的操作实现代码
Jul 13 Python
python自定义解析简单xml格式文件的方法
May 11 Python
Python实现删除文件但保留指定文件
Jun 21 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
Tensorflow使用支持向量机拟合线性回归
Sep 07 Python
python实现批量注册网站用户的示例
Feb 22 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
对Django url的几种使用方式详解
Aug 06 Python
python库matplotlib绘制坐标图
Oct 18 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
Python机器学习之逻辑回归
Python Pandas知识点之缺失值处理详解
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
You might like
PHP脚本的10个技巧(3)
2006/10/09 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
php中file_exists函数使用详解
2015/05/08 PHP
PHP文件操作实例总结
2016/09/27 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
Python 装饰器使用详解
2017/07/29 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
商务英语毕业生自荐信范文
2013/11/08 职场文书
道德演讲稿
2014/05/21 职场文书
团拜会策划方案
2014/06/07 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python