用Matlab制作一款真正意义上的拼图小游戏

阅读: 评论:0

用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;

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:4for j=1:4image(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:4for j=1:4picHdlR(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
endlogsheetR=zeros(1,16);function putPiece(object,~)object.UserDataif logsheetR(object.UserData)==0&&handHdl.UserData~=0object.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==0handHdl.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);endif all(logsheetR==1:16)text1.String='恭喜你,游戏胜利!';endend%==========================================================================for i=1:4for j=1:4tempPiece=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';elsetempMask=jigsawMask;endif j==1tempMask(:,1:101)=0;tempMask(102:404,102:201)=1;endif j==4tempMask(:,405:505)=0;tempMask(102:404,304:404)=1;endif i==1tempMask(1:101,:)=0;tempMask(102:201,102:404)=1;endif i==4tempMask(405:505,:)=0;tempMask(304:404,102:404)=1;endpicHdl(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
endRandNum=rand(1,16);
[~,logSheet]=sort(RandNum);for i=1:4for j=1:4picHdl(logSheet(j+(i-1)*4)).XData=[0,100]+(j-1)*100;picHdl(logSheet(j+(i-1)*4)).YData=[0,100]+(i-1)*100;end
endhandHdl=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];  endfunction selectPiece(object,~)%object.UserDataif length(object.UserData)==1if handHdl.UserData~=0picHdl(handHdl.UserData).Visible='on';  whiteHdl(logSheet==handHdl.UserData).Visible='off';endobject.Visible='off';whiteHdl(logSheet==object.UserData).Visible='on';handHdl.UserData=object.UserData;handHdl.CData=object.CData;handHdl.AlphaData=object.AlphaData;elseif handHdl.UserData==0elseii=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);              endend 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文件后选择一张接近方形的图片即可开始游戏

本文发布于:2024-02-08 19:57:16,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739363268583.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:小游戏   拼图   意义上   Matlab
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23