本文共 4557 字,大约阅读时间需要 15 分钟。
matlab 版的汉诺塔
游戏效果如下function hano(level)if nargin < 1 level = 5;endhold on,axis equalaxis(0.5+[0,60,0,30])set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w')set(gca,'color','k')ground=[60.5,1.5;60.5,0.5;0.5,0.5;0.5,1.5];column_1=[10.5,1.5;10.5,20;9.5,20;9.5,1.5];column_2=[30.5,1.5;30.5,20;29.5,20;29.5,1.5];column_3=[50.5,1.5;50.5,20;49.5,20;49.5,1.5];step=0;arrow=[1];A=[];B=[];C=[];A=level:-1:1;block_1=@(l,h)[10+2*l,3*h-1;10+2*l,3*h+1;10-2*l,3*h+1;10-2*l,3*h-1];block_2=@(l,h)[30+2*l,3*h-1;30+2*l,3*h+1;30-2*l,3*h+1;30-2*l,3*h-1];block_3=@(l,h)[50+2*l,3*h-1;50+2*l,3*h+1;50-2*l,3*h+1;50-2*l,3*h-1];block__=@(l,p)[p+2*l,25-1;p+2*l,25+1;p-2*l,25+1;p-2*l,25-1];set(gcf, 'KeyPressFcn', @key);
function draw(~,~) delete(findobj(gcf,'type','text')) delete(findobj(gcf,'type','patch')) text(5,-2,'step=') text(12,-2,num2str(step)) text(5,-6,'level=') text(12,-6,num2str(level)) text(20,-2,'use the key(\leftarrow \rightarrow) to move the claw') text(20,-6,'use the key(\uparrow \downarrow) to pick or land the block') fill(ground(:,1),ground(:,2),'w','EdgeColor','none') fill(column_1(:,1),column_1(:,2),'w','EdgeColor','none') fill(column_2(:,1),column_2(:,2),'w','EdgeColor','none') fill(column_3(:,1),column_3(:,2),'w','EdgeColor','none') text(20*arrow(1)-10-1,30,'\downarrow','Color','w','Fontsize',25) if length(arrow)==2 p=20*arrow(1)-10; block=block__(arrow(2),p); fill(block(:,1),block(:,2),'w','EdgeColor','none') end for i=1:length(A) block=block_1(A(i),i); fill(block(:,1),block(:,2),'w','EdgeColor','none') end for i=1:length(B) block=block_2(B(i),i); fill(block(:,1),block(:,2),'w','EdgeColor','none') end for i=1:length(C) block=block_3(C(i),i); fill(block(:,1),block(:,2),'w','EdgeColor','none') end if length(C)==level buttonName1=questdlg('Congratulations! You win','you win','close','restart','next level','close'); if isempty(buttonName1) buttonName1='end'; end if strcmp(buttonName1,'restart') hano(level) end if strcmp(buttonName1,'close') close; end if strcmp(buttonName1,'next level') if level<5 hano(level+1) end if level==5 msgbox('it is already the highest level') end end end end
function key(~,event) switch event.Key case 'leftarrow' if arrow(1)-1~=0 arrow(1)=arrow(1)-1;step=step+1; end case 'rightarrow' if arrow(1)-3~=0 arrow(1)=arrow(1)+1;step=step+1; end case 'uparrow' if length(arrow)==1 if (arrow(1)==1)&&(~isempty(A)) arrow=[arrow(1),A(end)]; A(end)=[]; end if (arrow(1)==2)&&(~isempty(B)) arrow=[arrow(1),B(end)]; B(end)=[]; end if (arrow(1)==3)&&(~isempty(C)) arrow=[arrow(1),C(end)]; C(end)=[]; end end case 'downarrow' if length(arrow)==2 if (arrow(1)==1) if isempty(A) A=[A,arrow(2)]; arrow(2)=[]; else if A(end)>arrow(2) A=[A,arrow(2)]; arrow(2)=[]; end end end if (arrow(1)==2) if isempty(B) B=[B,arrow(2)]; arrow(2)=[]; else if B(end)>arrow(2) B=[B,arrow(2)]; arrow(2)=[]; end end end if (arrow(1)==3) if isempty(C) C=[C,arrow(2)]; arrow(2)=[]; else if C(end)>arrow(2) C=[C,arrow(2)]; arrow(2)=[]; end end end end end draw() enddraw()end
把这三段都复制下来放在同一个m文件里即可 。
转载地址:http://fjls.baihongyu.com/