共计 7624 个字符,预计需要花费 20 分钟才能阅读完成。
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];
end
end
留神咱们为每个图片设置一个 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
end
restart()
5 残缺代码
function ddoogg
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;
% 绘制狗狗和获胜标签 ========================================================
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];
end
end
% 获胜标签
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
end
restart()
end