利用Matlab制作一款狗頭翻牌子小游戲
0 游戲效果
就是點擊一個牌子時,該牌子和周圍四個牌子也會相應發(fā)生變化,想辦法讓所有牌子都在同一面即為游戲勝利。


1 fig界面和背景板
這一段比較簡單,主要是對界面和背景板的屬性設置,我們采用編程的方式調(diào)用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); %數(shù)據(jù)矩陣
imgSource={'images\doga.png','images\dogb.png'}; %狗狗圖片鏈接
bkgColor=[[252 251 238]./255;[222 248 252]./255];%狗狗圖背景顏色
圖片自取:
doga.png

dogb.png

使用兩層for循環(huán)算好位置構造控件:
%繪制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
注意我們?yōu)槊總€圖片設置一個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 鼠標點擊牌子回調(diào)
%創(chuàng)建uiimage回調(diào)
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)%如果該位置在范圍內(nèi),改變圖片顯示和數(shù)據(jù)矩陣
? ? ? ? ? ? ? ? ? ? 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 按鈕繪制
繪制三個按鈕,初始 [初級] 按鈕為被選中狀態(tài),即難度等級為一級,我們將gameLevel設置為1,并將 [初級] 按鈕顏色和其他按鈕做區(qū)分,表示被選中狀態(tài):
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 難度選擇回調(diào)
改變gameLevel的數(shù)值,然后改變按鈕顏色
%設置難度選擇回調(diào)
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 模擬鼠標點擊
我們游戲一開始和點擊重新開始要生成未被完成的游戲局面,最簡單的生成方式就是模擬鼠標點擊隨機一定數(shù)量的卡牌,點擊次數(shù)越多難度越大,我們之前已經(jīng)有鼠標點擊的回調(diào)函數(shù)了:
function clickDog(~,event)
我們發(fā)現(xiàn)我們需要模擬的主要是第二個參數(shù)event,同時我們發(fā)現(xiàn)我們需要用到的只有event的Source屬性下的UserData信息,也就是卡牌位置信息:
objNum=event.Source.UserData;
我們便可以構造一個含有UserData信息的結構體,例如:
simEvent.Source.UserData=[1,2];
再通過如下方式調(diào)用clickDog函數(shù):
clickDog([],simEvent)
就能模擬點擊第一行第二列的牌子,模擬點擊其他牌子操作類似。
4.3 刷新游戲回調(diào)
在程序最后需要調(diào)用一次刷新游戲回調(diào),以保證一點開始就產(chǎn)生謎題。
set(restartBtn,'ButtonPushedFcn',@restart)
? ? function restart(~,~)
? ? ?? ?%相關參數(shù)設置:
? ? ?? ?%是否獲勝改為否
? ? ?? ?%勝利標簽隱藏
? ? ?? ?%數(shù)據(jù)矩陣全為1
? ? ? ? win=false;
? ? ? ? winLabel.Visible='off';
? ? ? ? dogMat=ones(5,5);
? ? ? ??
? ? ? ? %將狗狗牌子恢復至初始狀態(tài)
? ? ? ? for ii=1:5
? ? ? ? ? ? for jj=1:5
? ? ? ? ? ? ? ? dogMatHdl(ii,jj).ImageSource=imgSource{1};
? ? ? ? ? ? ? ? dogMatHdl(ii,jj).BackgroundColor=bkgColor(1,:);
? ? ? ? ? ? end
? ? ? ? end
?? ??? ?%依據(jù)游戲難度不同選擇不同模擬點擊次數(shù)
? ? ? ? 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); %數(shù)據(jù)矩陣
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';
%創(chuàng)建uiimage回調(diào)
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;
%設置難度選擇回調(diào)
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];
%設置刷新游戲回調(diào)
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制作一款狗頭翻牌子小游戲的詳細內(nèi)容,更多關于Matlab狗頭翻牌子游戲的資料請關注腳本之家其它相關文章!

