0 游戏成果
就是点击一个牌子时,该牌子和四周四个牌子也会相应发生变化,想方法让所有牌子都在同一面即为游戏胜利。

1 fig界面和背景板
这一段比较简单,次要是对界面和背景板的属性设置,咱们采纳编程的形式调用app designer控件:

ddooggFig=uifigure('units','pixels',...    'position',[320 120 360 400],...    'Numbertitle','off',...    'menubar','none',...    'resize','off',...    'name','ddoogg',...    'color',[0.98 0.98 0.98]);bkgLabel=uilabel(ddooggFig);bkgLabel.Position=[10 10 340 340];bkgLabel.Text='';bkgLabel.BackgroundColor=[193 214 232]./255;

2 狗狗牌子与胜利标记
2.1 狗狗牌子绘制
咱们用1代表一种狗狗,2代表另一种狗狗,dogMat一开始全为1示意所有牌子上都是第一种狗狗,imgSource代表两种狗狗图片地位,bkgColor代表狗狗卡牌的背景色彩

dogMat=ones(5,5); %数据矩阵imgSource={'images\doga.png','images\dogb.png'}; %狗狗图片链接bkgColor=[[252 251 238]./255;[222 248 252]./255];%狗狗图背景色彩

应用两层for循环算好地位结构控件:

%绘制5x5个uiimage控件for i=1:5    for j=1:5        dogMatHdl(i,j)=uiimage(ddooggFig);        dogMatHdl(i,j).Position=[20+65*(j-1),280-65*(i-1),60,60];        dogMatHdl(i,j).ImageSource=imgSource{1};        dogMatHdl(i,j).BackgroundColor=bkgColor(1,:);        dogMatHdl(i,j).UserData=[i,j];    endend

留神咱们为每个图片设置一个UserData属性,这能够示意图片的地位,不便咱们之后辨认点击的是哪个图片。
!
2.2 游戏胜利标签
绘制一个标签显示游戏胜利:

%获胜标签win=false; %是否实现游戏winLabel=uilabel(ddooggFig);winLabel.Position=[15 150 330 60];winLabel.Text='祝贺你解出谜题,请点击从新开始';winLabel.BackgroundColor=[238 236 225]./255;winLabel.FontSize=19;winLabel.FontWeight='bold';winLabel.HorizontalAlignment='center';winLabel.FontColor=[113 106 63]./255;


游戏一开始标签式是暗藏的赢了之后才会显示进去,因而咱们先将标签暗藏:

winLabel.Visible='off';

2.3 鼠标点击牌子回调

%创立uiimage回调set(dogMatHdl,'ImageClickedFcn',@clickDog)    function clickDog(~,event)        if ~win %游戏赢了不做任何操作            objNum=event.Source.UserData;            %点击事件的起源图片的UserData属性,与图片地位相干                        crossList=[-1 0;0 1;1 0;0 -1;0 0];            %点击地位上下左右和本身                        for ii=1:5                changePos=crossList(ii,:)+objNum;%要扭转的牌子的地位                    if all(changePos>=1&changePos<=5)%如果该地位在范畴内,扭转图片显示和数据矩阵                    dogMat(changePos(1),changePos(2))=mod(dogMat(changePos(1),changePos(2)),2)+1;                    dogMatHdl(changePos(1),changePos(2)).ImageSource=imgSource{dogMat(changePos(1),changePos(2))};                    dogMatHdl(changePos(1),changePos(2)).BackgroundColor=bkgColor(dogMat(changePos(1),changePos(2)),:);                end            end                        %如果所有卡牌都一样,游戏完结            if all(all(dogMat==1))||all(all(dogMat==2))                win=true;                winLabel.Visible='on';            end        end    end


3 游戏难度按钮组
3.1 按钮绘制
绘制三个按钮,初始 [高级] 按钮为被选中状态,即难度等级为一级,咱们将gameLevel设置为1,并将 [高级] 按钮色彩和其余按钮做辨别,示意被选中状态:

gameLevel=1; %游戏难度级别%高级难度按钮属性levelBtn(1)=uibutton(ddooggFig);levelBtn(1).Position=[10,360,75,30];levelBtn(1).Text='高级';levelBtn(1).FontWeight='bold';levelBtn(1).FontSize=14;levelBtn(1).BackgroundColor=[13 141 209]./255;levelBtn(1).FontColor=[1 1 1];levelBtn(1).UserData=1;%中级难度按钮属性levelBtn(2)=uibutton(ddooggFig);levelBtn(2).Position=[95,360,75,30];levelBtn(2).Text='中级';levelBtn(2).FontWeight='bold';levelBtn(2).FontSize=14;levelBtn(2).BackgroundColor=[2 164 173]./255;levelBtn(2).FontColor=[1 1 1];levelBtn(2).UserData=2;%高级难度按钮属性levelBtn(3)=uibutton(ddooggFig);levelBtn(3).Position=[180,360,75,30];levelBtn(3).Text='高级';levelBtn(3).FontWeight='bold';levelBtn(3).FontSize=14;levelBtn(3).BackgroundColor=[2 164 173]./255;levelBtn(3).FontColor=[1 1 1];levelBtn(3).UserData=3;


3.2 难度抉择回调
扭转gameLevel的数值,而后扭转按钮色彩

%设置难度抉择回调set(levelBtn,'ButtonPushedFcn',@changeLevel)    function changeLevel(~,event)        levelBtn(gameLevel).BackgroundColor=[2 164 173]./255;        objNum=event.Source.UserData;        gameLevel=objNum;        levelBtn(gameLevel).BackgroundColor=[13 141 209]./255;       end


4 游戏刷新模块
4.1 刷新游戏按钮绘制

restartBtn=uibutton(ddooggFig);restartBtn.Position=[265,360,85,30];restartBtn.Text='从新开始';restartBtn.FontWeight='bold';restartBtn.FontSize=14;restartBtn.BackgroundColor=[2 164 173]./255;restartBtn.FontColor=[1 1 1];

4.2 模仿鼠标点击
咱们游戏一开始和点击从新开始要生成未被实现的游戏场面,最简略的生成形式就是模仿鼠标点击随机肯定数量的卡牌,点击次数越多难度越大,咱们之前曾经有鼠标点击的回调函数了:
function clickDog(~,event)
咱们发现咱们须要模仿的次要是第二个参数event,同时咱们发现咱们须要用到的只有event的Source属性下的UserData信息,也就是卡牌地位信息:
objNum=event.Source.UserData;
咱们便能够结构一个含有UserData信息的构造体,例如:
simEvent.Source.UserData=[1,2];
再通过如下形式调用clickDog函数:
clickDog([],simEvent)
就能模仿点击第一行第二列的牌子,模仿点击其余牌子操作相似。

4.2 刷新游戏回调
在程序最初须要调用一次刷新游戏回调,以保障一点开始就产生谜题。

set(restartBtn,'ButtonPushedFcn',@restart)    function restart(~,~)        %相干参数设置:        %是否获胜改为否        %胜利标签暗藏        %数据矩阵全为1        win=false;        winLabel.Visible='off';        dogMat=ones(5,5);                %将狗狗牌子复原至初始状态        for ii=1:5            for jj=1:5                dogMatHdl(ii,jj).ImageSource=imgSource{1};                dogMatHdl(ii,jj).BackgroundColor=bkgColor(1,:);            end        end        %根据游戏难度不同抉择不同模仿点击次数        switch gameLevel            case 1,changeTimes=3;            case 2,changeTimes=5;            case 3,changeTimes=11;        end            %模仿点击        for ii=1:changeTimes            changePos=randi([1,5],[1,2]);            simEvent.Source.UserData=changePos;            clickDog([],simEvent)        end    endrestart()


5 残缺代码

function ddooggddooggFig=uifigure('units','pixels',...    'position',[320 120 360 400],...    'Numbertitle','off',...    'menubar','none',...    'resize','off',...    'name','ddoogg',...    'color',[0.98 0.98 0.98]);bkgLabel=uilabel(ddooggFig);bkgLabel.Position=[10 10 340 340];bkgLabel.Text='';bkgLabel.BackgroundColor=[193 214 232]./255;%绘制狗狗和获胜标签========================================================dogMat=ones(5,5); %数据矩阵imgSource={'images\doga.png','images\dogb.png'}; %狗狗图片链接bkgColor=[[252 251 238]./255;[222 248 252]./255];%狗狗图背景色彩%绘制5x5个uiimage控件for i=1:5    for j=1:5        dogMatHdl(i,j)=uiimage(ddooggFig);        dogMatHdl(i,j).Position=[20+65*(j-1),280-65*(i-1),60,60];        dogMatHdl(i,j).ImageSource=imgSource{1};        dogMatHdl(i,j).BackgroundColor=bkgColor(1,:);        dogMatHdl(i,j).UserData=[i,j];    endend%获胜标签win=false; %是否实现游戏winLabel=uilabel(ddooggFig);winLabel.Position=[15 150 330 60];winLabel.Text='祝贺你解出谜题,请点击从新开始';winLabel.BackgroundColor=[238 236 225]./255;winLabel.FontSize=19;winLabel.FontWeight='bold';winLabel.HorizontalAlignment='center';winLabel.FontColor=[113 106 63]./255;winLabel.Visible='off';%创立uiimage回调set(dogMatHdl,'ImageClickedFcn',@clickDog)    function clickDog(~,event)        if ~win            objNum=event.Source.UserData;            crossList=[-1 0;0 1;1 0;0 -1;0 0];            for ii=1:5                changePos=crossList(ii,:)+objNum;                if all(changePos>=1&changePos<=5)                    dogMat(changePos(1),changePos(2))=mod(dogMat(changePos(1),changePos(2)),2)+1;                    dogMatHdl(changePos(1),changePos(2)).ImageSource=imgSource{dogMat(changePos(1),changePos(2))};                    dogMatHdl(changePos(1),changePos(2)).BackgroundColor=bkgColor(dogMat(changePos(1),changePos(2)),:);                end            end            if all(all(dogMat==1))||all(all(dogMat==2))                win=true;                winLabel.Visible='on';            end        end    end%游戏等级按钮==============================================================gameLevel=1; %游戏难度级别%高级难度按钮属性levelBtn(1)=uibutton(ddooggFig);levelBtn(1).Position=[10,360,75,30];levelBtn(1).Text='高级';levelBtn(1).FontWeight='bold';levelBtn(1).FontSize=14;levelBtn(1).BackgroundColor=[13 141 209]./255;levelBtn(1).FontColor=[1 1 1];levelBtn(1).UserData=1;%中级难度按钮属性levelBtn(2)=uibutton(ddooggFig);levelBtn(2).Position=[95,360,75,30];levelBtn(2).Text='中级';levelBtn(2).FontWeight='bold';levelBtn(2).FontSize=14;levelBtn(2).BackgroundColor=[2 164 173]./255;levelBtn(2).FontColor=[1 1 1];levelBtn(2).UserData=2;%高级难度按钮属性levelBtn(3)=uibutton(ddooggFig);levelBtn(3).Position=[180,360,75,30];levelBtn(3).Text='高级';levelBtn(3).FontWeight='bold';levelBtn(3).FontSize=14;levelBtn(3).BackgroundColor=[2 164 173]./255;levelBtn(3).FontColor=[1 1 1];levelBtn(3).UserData=3;%设置难度抉择回调set(levelBtn,'ButtonPushedFcn',@changeLevel)    function changeLevel(~,event)        levelBtn(gameLevel).BackgroundColor=[2 164 173]./255;        objNum=event.Source.UserData;        gameLevel=objNum;        levelBtn(gameLevel).BackgroundColor=[13 141 209]./255;       end%刷新游戏按钮==============================================================restartBtn=uibutton(ddooggFig);restartBtn.Position=[265,360,85,30];restartBtn.Text='从新开始';restartBtn.FontWeight='bold';restartBtn.FontSize=14;restartBtn.BackgroundColor=[2 164 173]./255;restartBtn.FontColor=[1 1 1];%设置刷新游戏回调set(restartBtn,'ButtonPushedFcn',@restart)    function restart(~,~)        win=false;        winLabel.Visible='off';        dogMat=ones(5,5);        for ii=1:5            for jj=1:5                dogMatHdl(ii,jj).ImageSource=imgSource{1};                dogMatHdl(ii,jj).BackgroundColor=bkgColor(1,:);            end        end        switch gameLevel            case 1,changeTimes=3;            case 2,changeTimes=5;            case 3,changeTimes=11;        end        for ii=1:changeTimes            changePos=randi([1,5],[1,2]);            simEvent.Source.UserData=changePos;            clickDog([],simEvent)        end    endrestart()end