利用Matlab制作一款狗头翻牌子小游戏

Octavia ·
更新时间:2024-09-20
· 397 次阅读

目录

0游戏效果

1fig界面和背景板

2狗狗牌子与胜利标志

2.1狗狗牌子绘制

2.2游戏胜利标签

2.3鼠标点击牌子回调

3游戏难度按钮组

3.1按钮绘制

3.2难度选择回调

4游戏刷新模块

4.1刷新游戏按钮绘制

4.2模拟鼠标点击

4.3刷新游戏回调

5完整代码

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];%狗狗图背景颜色

图片自取:

doga.png

dogb.png

使用两层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.3 刷新游戏回调

在程序最后需要调用一次刷新游戏回调,以保证一点开始就产生谜题。

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

另:

需要MATLAB版本至少在R2019a及以后,若是以前版本可以尝试用uiaxes和image进行改写。

总代码长度140行左右,快来试试呀

以上就是利用Matlab制作一款狗头翻牌子小游戏的详细内容,更多关于Matlab狗头翻牌子游戏的资料请关注软件开发网其它相关文章!



小游戏 matlab

需要 登录 后方可回复, 如果你还没有账号请 注册新账号