用Matlab怎样做一个拼图游戏,原理和方法是怎样的
Admin 2022-06-10 群英技术资讯 841 次浏览
关于“用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: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文件后选择一张接近方形的图片即可开始游戏

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
浏览器到WSGI Server:浏览器发送的请求会先到WSGI Server;environ:WSGI Server会将HTTP请求中的参数等信息封装到environ(一个字典)中。
这篇文章主要为大家介绍了Python密码学XOR流程及乘法密码教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
可以通过两种方法利用python读取大文件:第一种是利用yield生成器读取;第二种是:利用open()自带方法生成迭代对象,这个是一行一行的读取。
Python数据类型分为值类型和引用类型, 下面我们看下它们的区别:值类型:对象本身不允许修改,数值的修改实际上是让变量指向了一个新的对
用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps,top,free等等。要获取这些系统信息,Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008