function drawmap(A) im=imread('puzzle1.png'); img=uint8(zeros(300,300,3));%预分配,且类型需要为unint8 % 对要显示的图片进行赋值 for row=1:3 for col=1:3 img(1+(row-1)*100:100*row,1+(col-1)*100:100*col,:)=GetImg(im,A(row,col)); %将A矩阵中的数字和图片对应 end end imshow(img)%显示画面 end
function puzzle() %% 主函数 loading()%开场动画 global Tag;%Tag是标记矩阵,定义成全局变量,方便传递参数 Tag=Disrupt();%将标记矩阵的排列顺序打乱Tag_A; global count;%计算步数,也设为全局变量 count=0; set(gcf,'windowButtonDownFcn',@ButttonDownFcn);%点击鼠标时调用ButttonDownFcn函数
function ButttonDownFcn(src,event) pt = get(gca,'CurrentPoint'); y = uint8(ceil(pt(1,1)/100)); x = uint8(ceil(pt(1,2)/100));%获取点击的位置转化为矩阵中的坐标 global Tag global count%声明全局变量
if x>=1&&x<=3&&y>=1&&y<=3%点击位置满足才执行 count=count+1;%计算步数 Tag(x,y)=Tag(x,y)+1; if x<3 %四个if实现规则 Tag(x+1,y)=Tag(x+1,y)+1; end if x>1 Tag(x-1,y)=Tag(x-1,y)+1; end if y<3 Tag(x,y+1)=Tag(x,y+1)+1; end if y>1 Tag(x,y-1)=Tag(x,y-1)+1; end Tag(Tag==10)=1 ; end drawmap(Tag);
%胜利条件 for k=1:9 if Tag==uint8(k*ones(3,3)) msgbox(strcat(num2str(count),' !You win!')); %提示完成信息 pause(5);%延迟 close all %游戏结束,关闭所有图像窗口
function puzzle() %% 主函数 %loading()%开场动画 global Tag;%Tag是标记矩阵,定义成全局变量,方便传递参数 global count;%计算步数,也设为全局变量 count=0; global dim_x; global dim_y; global depth;%维度 [dim_x,dim_y,depth]=setdim(4,4,6); Tag=Disrupt();%将标记矩阵的排列顺序打乱Tag_A; set(gcf,'windowButtonDownFcn',@ButtonDownFcn);%点击鼠标时调用ButttonDownFcn函数
setdim()函数如下:
1 2 3 4 5
function [dim_x,dim_y,depth]=setdim(x,y,d) dim_x=x; dim_y=y; depth=d; end
同时在其他的函数中也需要进行一些修改
绘制画面根据dim_x,dim_y绘制画面,
1 2 3 4 5 6 7 8 9 10 11 12 13
function drawmap(A) im=imread('puzzle1.png'); img=uint8(zeros(100,100,3));%预分配,且类型需要为unint8 global dim_x global dim_y % 对要显示的拼图进行赋值 for row=1:dim_x for col=1:dim_y img(1+(row-1)*100:100*row,1+(col-1)*100:100*col,:)=GetImg(im,A(row,col)); end end imshow(img)%显示 end
标记矩阵的数值变为1到depth,维度为dim_x,dim_y
1 2 3 4 5 6 7
function A=Disrupt() global dim_x; global dim_y; global depth A=unidrnd(depth,dim_x,dim_y); drawmap(A); end
function ButttonDownFcn(src,event) pt = get(gca,'CurrentPoint'); y = uint8(ceil(pt(1,1)/100)); x = uint8(ceil(pt(1,2)/100)); global Tag global count global dim_x global dim_y global depth if x>=1&&x<=dim_x&&y>=1&&y<=dim_y%点击位置满足才执行 count=count+1;%计算步数 Tag(x,y)=Tag(x,y)+1; if x<dim_x %四个if实现规则 Tag(x+1,y)=Tag(x+1,y)+1; end if x>1 Tag(x-1,y)=Tag(x-1,y)+1; end if y<dim_y Tag(x,y+1)=Tag(x,y+1)+1; end if y>1 Tag(x,y-1)=Tag(x,y-1)+1; end Tag(Tag==depth+1)=1 ; end drawmap(Tag);
%胜利条件 for k=1:depth if Tag==uint8(k*ones(dim_x,dim_y)) msgbox(strcat(num2str(count),' !You win!')); %提示完成信息 pause(5);%延迟 close all %游戏结束,关闭所有图像窗口
end end end
只需修改这几个小地方,通过setdim()即可调整设置不同维度
2×2×7
3×3×2
这个换成0和1可能更好一点
更高阶
不等阶
修改规则
经过修改回调函数可以实现别的规则,新规则同样适用于不同的阶数
1.注释掉回调函数的第10行
1
%Tag(x,y)=Tag(x,y)+1;
规则就改为被点击的方块数值不发生变化,相邻方块数值加1。
2.更改为被点击的方块所在的行列+1
代码修改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
if x>=1&&x<=dim_x&&y>=1&&y<=dim_y%点击位置满足才执行 count=count+1;%计算步数 Tag(x,y)=Tag(x,y)+1; if x<dim_x %四个if实现规则 Tag(x+1:dim_x,y)=Tag(x+1:dim_x,y)+1; end if x>1 Tag(1:x-1,y)=Tag(1:x-1,y)+1; end if y<dim_y Tag(x,y+1:dim_y)=Tag(x,y+1:dim_y)+1; end if y>1 Tag(x,1:y-1)=Tag(x,1:y-1)+1; end Tag(Tag==depth+1)=1 ; end