clear;clc;close all;
N=3;%The order of the puzzle
eval(['pic=imread("M',num2str(N),'.png");']);%Read the pictures
S=size(pic);
SL=min(S(1:2));
SL=SL-mod(SL,N);
partS=SL/N;
Arr0=zeros(N,N);%Record the original position of each block of the picture
%Cut the picture into N*N blocks
for i=1:N
for j=1:N;
id=i*10+j;
eval(['pic',num2str(id),'=pic(',num2str((i-1)*partS+1),':',num2str(i*partS),...
',',num2str((j-1)*partS+1),':',num2str(j*partS),',:);']);
Arr0(i,j)=id;
end
end
Arr=Arr0;%record
eval(['pic',num2str(11*N),'=ones(size(pic11));']);%The last block is set to white
p=[N,N];%Record the position of the white square
%Jigsaw random shuffle
for i=1 : 5 * N^3
aa=rand();
if aa<0.25 && p(1)>1
ARR=Arr(p(1)-1,p(2));
Arr(p(1)-1,p(2))=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(1)=p(1)-1;
end
if aa>=0.25&& aa<0.5&& p(1)<N
ARR=Arr(p(1)+1,p(2));
Arr(p(1)+1,p(2))=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(1)=p(1)+1;
end
if aa>=0.5&&aa<0.75&&p(2)>1
ARR=Arr(p(1),p(2)-1);
Arr(p(1),p(2)-1)=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(2)=p(2)-1;
end
if aa>=0.75&&p(2)<N
ARR=Arr(p(1),p(2)+1);
Arr(p(1),p(2)+1)=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(2)=p(2)+1;
end
end
%Finally, adjust the white block to the lower right corner
P=p;
if p(1)<N
for i=1:N-P(1)
ARR=Arr(p(1)+1,p(2));
Arr(p(1)+1,p(2)) = Arr(p(1),p(2));
Arr(p(1),p(2)) = ARR;
p(1)=p(1)+1;
end
end
if p(2)<N
for j=1:N-P(2)
ARR=Arr(p(1),p(2)+1);
Arr(p(1),p(2)+1) = Arr(p(1),p(2));
Arr(p(1),p(2)) = ARR;
p(2)=p(2)+1;
end
end
%Displays the scrambled image
figure;
FP=0.8;
set(gcf,'position',[200,100,min(SL,500),min(SL,500)]);
for i=1 : N
for j=1 : N
axes('Position',[(1-FP)/2+(j-1)*FP/N,1-(1-FP)/2-i*FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(i,j)),')']);
end
end
kk=0;
save Date SL N p Arr* FP pic*kk
%Keyboard control
set(gcf,'KeyPressFcn',@key)
function key(~,event)
load('Data');
%FS=32768
%t=0:1/FS:0.1;
switch event.Key
case'downarrow'
if p(1)>1
ARR=Arr(p(1)-1,p(2));
Arr(p(1)-1,p(2))=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(1)=p(1)-1;
%kk=kk+1
%f=HYLQP(kk);
%y=sin(2*pi*f*t)
%sound(y,Fs)
axes('Position',[(1-FP)/2+(p(2)-1)*FP/N,1-(1-FP)/2-p(1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1),p(2))),')']);
axes('Position',[(1-FP)/2+(p(2)-1)*FP/N,1-(1-FP)/2-(p(1)+1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1)+1,p(2))),')']);
end
case 'uparrow'
if p(1)<N
ARR=Arr(p(1)+1,p(2));
Arr(p(1)+1,p(2))=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(1)=p(1)+1;
%kk=kk+1
%f=HYLQP(kk);
%y=sin(2*pi*f*t)
%sound(y,Fs)
axes('Position',[(1-FP)/2+(p(2)-1)*FP/N,1-(1-FP)/2-p(1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1),p(2))),')']);
axes('Position',[(1-FP)/2+(p(2)-1)*FP/N,1-(1-FP)/2-(p(1)-1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1)-1,p(2))),')']);
end
case 'rightarrow'
if p(2)>1
ARR=Arr(p(1),p(2)-1);
Arr(p(1),p(2)-1)=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(2)=p(2)-1;
%kk=kk+1
%f=HYLQP(kk);
%y=sin(2*pi*f*t)
%sound(y,Fs)
axes('Position',[(1-FP)/2+(p(2)-1)*FP/N,1-(1-FP)/2-p(1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1),p(2))),')']);
axes('Position',[(1-FP)/2+p(2)*FP/N,1-(1-FP)/2-p(1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1),p(2)+1)),')']);
end
case'leftarrow'
if p(2)<N
ARR=Arr(p(1),p(2)+1);
Arr(p(1),p(2)+1)=Arr(p(1),p(2));
Arr(p(1),p(2))=ARR;
p(2)=p(2)+1;
%kk=kk+1
%f=HYLQP(kk);
%y=sin(2*pi*f*t)
%sound(y,Fs)
axes('Position',[(1-FP)/2+(p(2)-1)*FP/N,1-(1-FP)/2-p(1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1),p(2))),')']);
axes('Position',[(1-FP)/2+(p(2)-2)*FP/N,1-(1-FP)/2-p(1)*FP/N,FP/N,FP/N,FP/N]);
eval(['imshow(pic',num2str(Arr(p(1),p(2)-1)),')']);
end
end
%To judge whether it was successful
if isequal (Arr,Arr0)
axes('Position',[(1-FP)/2,(1-FP)/2,FP,FP]);
imshow(pic(1:SL,1:SL,:));
title('Love!');
end
save Data N p Arr FP kk -append
end
一运行就出现这种,图片显示也不全,键盘也无法操作,请问怎么解决?
不应该出现pic0 Arr的矩阵因该全部在11以上不知道怎么改
第一个问题已经解决,现在键盘无法使用如何解决