利用Matlab制作一款狗頭翻牌子小游戲
0 游戲效果
就是點(diǎn)擊一個(gè)牌子時(shí),該牌子和周圍四個(gè)牌子也會(huì)相應(yīng)發(fā)生變化,想辦法讓所有牌子都在同一面即為游戲勝利。
1 fig界面和背景板
這一段比較簡(jiǎn)單,主要是對(duì)界面和背景板的屬性設(shè)置,我們采用編程的方式調(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 狗狗牌子與勝利標(biāo)志
2.1 狗狗牌子繪制
我們用1代表一種狗狗,2代表另一種狗狗,dogMat一開(kāi)始全為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];%狗狗圖背景顏色
圖片自?。?/p>
doga.png
dogb.png
使用兩層for循環(huán)算好位置構(gòu)造控件:
%繪制5x5個(gè)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)槊總€(gè)圖片設(shè)置一個(gè)UserData屬性,這可以表示圖片的位置,方便我們之后識(shí)別點(diǎn)擊的是哪個(gè)圖片。
2.2 游戲勝利標(biāo)簽
繪制一個(gè)標(biāo)簽顯示游戲勝利:
%獲勝標(biāo)簽 win=false; %是否完成游戲 winLabel=uilabel(ddooggFig); winLabel.Position=[15 150 330 60]; winLabel.Text='恭喜你解出謎題,請(qǐng)點(diǎn)擊重新開(kāi)始'; winLabel.BackgroundColor=[238 236 225]./255; winLabel.FontSize=19; winLabel.FontWeight='bold'; winLabel.HorizontalAlignment='center'; winLabel.FontColor=[113 106 63]./255;
游戲一開(kāi)始標(biāo)簽式是隱藏的贏了之后才會(huì)顯示出來(lái),因此我們先將標(biāo)簽隱藏:
winLabel.Visible='off';
2.3 鼠標(biāo)點(diǎn)擊牌子回調(diào)
%創(chuàng)建uiimage回調(diào) set(dogMatHdl,'ImageClickedFcn',@clickDog) ? ? function clickDog(~,event) ? ? ? ? if ~win %游戲贏了不做任何操作 ? ? ? ? ? ? objNum=event.Source.UserData; ? ? ? ? ? ? %點(diǎn)擊事件的來(lái)源圖片的UserData屬性,與圖片位置相關(guān) ? ? ? ? ? ?? ? ? ? ? ? ? crossList=[-1 0;0 1;1 0;0 -1;0 0]; ? ? ? ? ? ? %點(diǎn)擊位置上下左右和自身 ? ? ? ? ? ?? ? ? ? ? ? ? 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 ? ? ? ? ? ?? ?? ??? ??? ?%如果所有卡牌都一樣,游戲結(jié)束 ? ? ? ? ? ? if all(all(dogMat==1))||all(all(dogMat==2)) ? ? ? ? ? ? ? ? win=true; ? ? ? ? ? ? ? ? winLabel.Visible='on'; ? ? ? ? ? ? end ? ? ? ? end ? ? end
3 游戲難度按鈕組
3.1 按鈕繪制
繪制三個(gè)按鈕,初始 [初級(jí)] 按鈕為被選中狀態(tài),即難度等級(jí)為一級(jí),我們將gameLevel設(shè)置為1,并將 [初級(jí)] 按鈕顏色和其他按鈕做區(qū)分,表示被選中狀態(tài):
gameLevel=1; %游戲難度級(jí)別 %初級(jí)難度按鈕屬性 levelBtn(1)=uibutton(ddooggFig); levelBtn(1).Position=[10,360,75,30]; levelBtn(1).Text='初級(jí)'; 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; %中級(jí)難度按鈕屬性 levelBtn(2)=uibutton(ddooggFig); levelBtn(2).Position=[95,360,75,30]; levelBtn(2).Text='中級(jí)'; 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; %高級(jí)難度按鈕屬性 levelBtn(3)=uibutton(ddooggFig); levelBtn(3).Position=[180,360,75,30]; levelBtn(3).Text='高級(jí)'; 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ù)值,然后改變按鈕顏色
%設(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='重新開(kāi)始'; restartBtn.FontWeight='bold'; restartBtn.FontSize=14; restartBtn.BackgroundColor=[2 164 173]./255; restartBtn.FontColor=[1 1 1];
4.2 模擬鼠標(biāo)點(diǎn)擊
我們游戲一開(kāi)始和點(diǎn)擊重新開(kāi)始要生成未被完成的游戲局面,最簡(jiǎn)單的生成方式就是模擬鼠標(biāo)點(diǎn)擊隨機(jī)一定數(shù)量的卡牌,點(diǎn)擊次數(shù)越多難度越大,我們之前已經(jīng)有鼠標(biāo)點(diǎn)擊的回調(diào)函數(shù)了:
function clickDog(~,event)
我們發(fā)現(xiàn)我們需要模擬的主要是第二個(gè)參數(shù)event,同時(shí)我們發(fā)現(xiàn)我們需要用到的只有event的Source屬性下的UserData信息,也就是卡牌位置信息:
objNum=event.Source.UserData;
我們便可以構(gòu)造一個(gè)含有UserData信息的結(jié)構(gòu)體,例如:
simEvent.Source.UserData=[1,2];
再通過(guò)如下方式調(diào)用clickDog函數(shù):
clickDog([],simEvent)
就能模擬點(diǎn)擊第一行第二列的牌子,模擬點(diǎn)擊其他牌子操作類似。
4.3 刷新游戲回調(diào)
在程序最后需要調(diào)用一次刷新游戲回調(diào),以保證一點(diǎn)開(kāi)始就產(chǎn)生謎題。
set(restartBtn,'ButtonPushedFcn',@restart) ? ? function restart(~,~) ? ? ?? ?%相關(guān)參數(shù)設(shè)置: ? ? ?? ?%是否獲勝改為否 ? ? ?? ?%勝利標(biāo)簽隱藏 ? ? ?? ?%數(shù)據(jù)矩陣全為1 ? ? ? ? win=false; ? ? ? ? winLabel.Visible='off'; ? ? ? ? dogMat=ones(5,5); ? ? ? ?? ? ? ? ? %將狗狗牌子恢復(fù)至初始狀態(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ù)游戲難度不同選擇不同模擬點(diǎn)擊次數(shù) ? ? ? ? switch gameLevel ? ? ? ? ? ? case 1,changeTimes=3; ? ? ? ? ? ? case 2,changeTimes=5; ? ? ? ? ? ? case 3,changeTimes=11; ? ? ? ? end ?? ? ?? ??? ?%模擬點(diǎn)擊 ? ? ? ? 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; %繪制狗狗和獲勝標(biāo)簽======================================================== dogMat=ones(5,5); %數(shù)據(jù)矩陣 imgSource={'images\doga.png','images\dogb.png'}; %狗狗圖片鏈接 bkgColor=[[252 251 238]./255;[222 248 252]./255];%狗狗圖背景顏色 %繪制5x5個(gè)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 %獲勝標(biāo)簽 win=false; %是否完成游戲 winLabel=uilabel(ddooggFig); winLabel.Position=[15 150 330 60]; winLabel.Text='恭喜你解出謎題,請(qǐng)點(diǎn)擊重新開(kāi)始'; 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 %游戲等級(jí)按鈕============================================================== gameLevel=1; %游戲難度級(jí)別 %初級(jí)難度按鈕屬性 levelBtn(1)=uibutton(ddooggFig); levelBtn(1).Position=[10,360,75,30]; levelBtn(1).Text='初級(jí)'; 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; %中級(jí)難度按鈕屬性 levelBtn(2)=uibutton(ddooggFig); levelBtn(2).Position=[95,360,75,30]; levelBtn(2).Text='中級(jí)'; 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; %高級(jí)難度按鈕屬性 levelBtn(3)=uibutton(ddooggFig); levelBtn(3).Position=[180,360,75,30]; levelBtn(3).Text='高級(jí)'; 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; %設(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 %刷新游戲按鈕============================================================== restartBtn=uibutton(ddooggFig); restartBtn.Position=[265,360,85,30]; restartBtn.Text='重新開(kāi)始'; restartBtn.FontWeight='bold'; restartBtn.FontSize=14; restartBtn.BackgroundColor=[2 164 173]./255; restartBtn.FontColor=[1 1 1]; %設(shè)置刷新游戲回調(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進(jìn)行改寫。
總代碼長(zhǎng)度140行左右,快來(lái)試試呀
以上就是利用Matlab制作一款狗頭翻牌子小游戲的詳細(xì)內(nèi)容,更多關(guān)于Matlab狗頭翻牌子游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++簡(jiǎn)單QQ程序服務(wù)器端的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C++簡(jiǎn)單QQ程序服務(wù)器端的實(shí)現(xiàn)代碼,感興趣的朋友可以參考一下2016-05-05C語(yǔ)言合并兩個(gè)帶頭節(jié)點(diǎn)升序排列鏈表
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言合并兩個(gè)帶頭節(jié)點(diǎn)升序排列鏈表的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03vscode終端中打不開(kāi)conda虛擬包管理的解決
本文主要介紹了vscode終端中打不開(kāi)conda虛擬包管理的解決,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09C語(yǔ)言實(shí)現(xiàn)投票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07C++標(biāo)準(zhǔn)模板庫(kù)函數(shù)sort的那些事兒
sort函數(shù)是標(biāo)準(zhǔn)模板庫(kù)的函數(shù),已知開(kāi)始和結(jié)束的地址即可進(jìn)行排序,可以用于比較任何容器(必須滿足隨機(jī)迭代器),任何元素,任何條件,執(zhí)行速度一般比qsort要快2013-09-09C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例
這篇文章主要介紹了C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02