如何利用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实现简单EXCEL数据统计的实例
Jan 24 Python
django基础之数据库操作方法(详解)
May 24 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
对numpy中shape的深入理解
Jun 15 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
Python机器学习之逻辑回归
Python Pandas知识点之缺失值处理详解
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
You might like
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
php json_encode奇怪问题说明
2011/09/27 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
JavaScript 调试器简介
2009/02/21 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
javascript 闭包详解
2015/07/02 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
python实现bucket排序算法实例分析
2015/05/04 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
python中的tcp示例详解
2018/12/09 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
如何编写python的daemon程序
2021/01/07 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
简历中自我评价分享
2013/10/09 职场文书
党员公开承诺事项
2014/03/25 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android