使用Matlab制作大富翁小游戲的過程詳解
大富翁大家都玩過,走到建筑的位置可以買地,第二圈走到買過的地可以升級,別人經(jīng)過后需要付過路費(fèi),每次經(jīng)過起點(diǎn)都會(huì)獲得一定資金,玩到最后還沒破產(chǎn)的就是勝者,這里我用MATLAB制作了一款MATLAB版的大富翁小游戲:

1.自定義頭像及名稱
點(diǎn)擊方框內(nèi)加號(hào)可換頭像,點(diǎn)擊文本區(qū)域可改昵稱:

當(dāng)然即使不換頭像點(diǎn)擊開始后,也會(huì)自動(dòng)分配頭像和名稱:


2.買地、收費(fèi)、破產(chǎn)
第一次走過地可以買地:
B:收購價(jià),T:過路費(fèi),最后一位數(shù)值是地產(chǎn)等級


再次走過地可以升級:

他人走過已被購買地產(chǎn)需要交過路費(fèi):


當(dāng)有玩家負(fù)債時(shí),會(huì)清空資產(chǎn)并顯示負(fù)債退出游戲:

3.部分代碼展示
主要文件共10個(gè)m文件,其中 monopoly_main.m 是函數(shù)入口,運(yùn)行該程序開始游戲?。?/p>

monopoly.mlappinstall 文件是APP安裝包,點(diǎn)擊如下安裝APP按鈕并選中該文件,可以將其安裝在APP欄:


值得一提的是,本程序的頭像預(yù)設(shè)也是用MATLAB繪制的:

部分代碼展示:
gui_init.m
function [monFig,monAx,diceAx,diceTool,selfTool,monMenuS]=gui_init
monFig=uifigure;
monFig.Position=[10 50 1000 620];
monFig.NumberTitle='off';
monFig.MenuBar='none';
monFig.Resize='off';
monFig.Name='monopoly';
monAx=uiaxes(monFig);
monAx.PlotBoxAspectRatio=[1 1 1];
monAx.Position=[380 10 600 600];
%monAx.Box='on';
monAx.XLim=[0 100];
monAx.YLim=[0 100];
%monAx.Color=[0.9 0.9 0.9];
monAx.XColor=[0.95,0.95,0.95];
monAx.YColor=[0.95,0.95,0.95];
monAx.Toolbar.Visible='off';
selfPl=uipanel(monFig);
selfPl.Title='';
selfPl.Position=[10 10 370 600];
diceAx=uiaxes(selfPl);
diceAx.Position=[0 450 145 145];
diceAx.XLim=[0 10];
diceAx.YLim=[0 10];
diceAx.Color=[0.98 0.98 0.98];
diceAx.XColor=[0.95,0.95,0.95];
diceAx.YColor=[0.95,0.95,0.95];
diceAx.Toolbar.Visible='off';
hold(diceAx,'on')
plot(diceAx,[2,8],[1,1],'k','LineWidth',2)
plot(diceAx,[2,8],[9,9],'k','LineWidth',2)
plot(diceAx,[1,1],[2,8],'k','LineWidth',2)
plot(diceAx,[9,9],[2,8],'k','LineWidth',2)
plot(diceAx,8+cos(0+(0:pi/(2*10):pi/2)),8+sin(0+(0:pi/(2*10):pi/2)),'k','LineWidth',2)
plot(diceAx,2+cos(pi/2+(0:pi/(2*10):pi/2)),8+sin(pi/2+(0:pi/(2*10):pi/2)),'k','LineWidth',2)
plot(diceAx,2+cos(pi+(0:pi/(2*10):pi/2)),2+sin(pi+(0:pi/(2*10):pi/2)),'k','LineWidth',2)
plot(diceAx,8+cos(-pi/2+(0:pi/(2*10):pi/2)),2+sin(-pi/2+(0:pi/(2*10):pi/2)),'k','LineWidth',2)
hold(diceAx,'off')
diceTool.Btn=uibutton(monFig);
diceTool.Btn.Text='搖 骰 子';
diceTool.Btn.BackgroundColor=[0.31 0.58 0.80];
diceTool.Btn.FontColor=[1 1 1];
diceTool.Btn.FontWeight='bold';
diceTool.Btn.Position=[180 480 180 40];
diceTool.Btn.FontSize=18;
diceTool.Lbl1=uilabel(monFig);
diceTool.Lbl1.Text='剩余玩家:';
diceTool.Lbl1.FontSize=18;
diceTool.Lbl1.FontColor=[185 184 150]./500;
diceTool.Lbl1.FontWeight='bold';
diceTool.Lbl1.Position=[180 560 180 40];
diceTool.Lbl2=uilabel(monFig);
diceTool.Lbl2.Text='當(dāng)前輪次:';
diceTool.Lbl2.FontSize=18;
diceTool.Lbl2.FontColor=[185 184 150]./500;
diceTool.Lbl2.FontWeight='bold';
diceTool.Lbl2.Position=[180 530 180 40];
for i=1:4
selfTool.(['player',num2str(i)]).Img=uiimage(monFig);
selfTool.(['player',num2str(i)]).Img.Position=[30 400-(i-1)*110 60 60];
selfTool.(['player',num2str(i)]).Img.ImageSource='圖片\player0.png';
selfTool.(['player',num2str(i)]).Img.UserData=i;
selfTool.(['player',num2str(i)]).Ta=uitextarea(monFig);
selfTool.(['player',num2str(i)]).Ta.Position=[100 402-(i-1)*110 70 23];
selfTool.(['player',num2str(i)]).Ta.Value='請輸入昵稱';
selfTool.(['player',num2str(i)]).Ta.UserData=i;
selfTool.(['player',num2str(i)]).Ta2=uitextarea(monFig);
selfTool.(['player',num2str(i)]).Ta2.Position=[180 433-(i-1)*110 180 25];
selfTool.(['player',num2str(i)]).Ta2.Value='';
selfTool.(['player',num2str(i)]).Ta2.Enable='off';
selfTool.(['player',num2str(i)]).Btn=uibutton(monFig);
selfTool.(['player',num2str(i)]).Btn.Position=[100 435-(i-1)*110 70 23];
selfTool.(['player',num2str(i)]).Btn.Text=' 購買地產(chǎn) ';
selfTool.(['player',num2str(i)]).Btn.BackgroundColor=[0.31 0.58 0.80];
selfTool.(['player',num2str(i)]).Btn.FontColor=[1 1 1];
selfTool.(['player',num2str(i)]).Btn.FontWeight='bold';
selfTool.(['player',num2str(i)]).Btn.UserData=i;
selfTool.(['player',num2str(i)]).Lb=uilistbox(monFig);
selfTool.(['player',num2str(i)]).Lb.Position=[180 355-(i-1)*110 180 78];
selfTool.(['player',num2str(i)]).Lb.Items={'地產(chǎn)一(空)','地產(chǎn)二(空)','地產(chǎn)三(空)','... ...'};
selfTool.(['player',num2str(i)]).Txt=uilabel(monFig);
selfTool.(['player',num2str(i)]).Txt.Position=[30 370-(i-1)*110 140 30];
selfTool.(['player',num2str(i)]).Txt.Text='資金 :0 ';
selfTool.(['player',num2str(i)]).Txt.FontColor=[185 184 150]./500;
selfTool.(['player',num2str(i)]).Txt.FontWeight='bold';
selfTool.(['player',num2str(i)]).Txt.FontSize=14;
end
monMenu=uimenu(monFig);
monMenu.Text='開始游戲';
monMenuS.m2=uimenu(monMenu);
monMenuS.m2.Text='二人游戲';
monMenuS.m3=uimenu(monMenu);
monMenuS.m3.Text='三人游戲';
monMenuS.m4=uimenu(monMenu);
monMenuS.m4.Text='四人游戲';
endself_init.m
function self=self_init(n)
for i=1:4
self.(['player',num2str(i)]).property=5000;
self.(['player',num2str(i)]).pos=0;
self.(['player',num2str(i)]).real_estate={};
self.(['player',num2str(i)]).estateNum=0;
if i>n
self.(['player',num2str(i)]).gameOver=1;
else
self.(['player',num2str(i)]).gameOver=0;
end
self.(['player',num2str(i)]).name=['玩家',num2str(i)];
end
end4.修改記錄
1.關(guān)于已購買多個(gè)地產(chǎn)升級某地產(chǎn)時(shí)左右矩陣大小不匹配問題,
解決方法:將monopoly_main函數(shù)113行附近 owenerPos=owenerList(:,2)==n;
更改為:owenerPos=owenerList(:,1)==self.([‘player’,num2str(n)]).pos;
2.由網(wǎng)友 [不知道叫什么] 指出若版本為2021a,則uiaxes會(huì)自動(dòng)顯示在uipanel下方導(dǎo)致骰子無法顯示,所做更改為將該uiaxes的父類由uifigure更換為uipanel,并更改Position屬性使其顯示在相應(yīng)的位置,詳細(xì)更改如下:
將gui_init.m文件20-25行附近代碼:
selfPl=uipanel(monFig); selfPl.Title=''; selfPl.Position=[10 10 370 600]; diceAx=uiaxes(monFig); diceAx.Position=[15 460 145 145];
改為:
selfPl=uipanel(monFig); selfPl.Title=''; selfPl.Position=[10 10 370 600]; diceAx=uiaxes(selfPl); diceAx.Position=[0 450 145 145];
3.由網(wǎng)友 [m0_57054690] 指出,打包后程序第一次生成隨機(jī)數(shù)問題,為程序增添根據(jù)時(shí)間變化的隨機(jī)數(shù)種子即可,該部分代碼為:
tempTime=clock(); second=round(tempTime(6)+60*tempTime(5)+24*60*tempTime(4)); rng(second) diceNum=randi(6);
5.下載地址
到此這篇關(guān)于使用Matlab制作大富翁小游戲的過程詳解的文章就介紹到這了,更多相關(guān)Matlab制作大富翁游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實(shí)現(xiàn)圖像轉(zhuǎn)換為漫畫效果
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像轉(zhuǎn)換為漫畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
C++深入分析講解函數(shù)與重載知識(shí)點(diǎn)
C++?允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function?Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途2022-06-06
C語言深入刨析數(shù)據(jù)結(jié)構(gòu)之棧與鏈棧的設(shè)計(jì)與應(yīng)用
棧是限定僅在表尾進(jìn)行插入或刪除操作的線性表,表尾稱為棧頂(top),表頭稱為棧底(bottom)。棧的最主要特點(diǎn)就是“先進(jìn)后出”(FILO),或“后進(jìn)先出”(LIFO)。用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示的棧稱為“鏈?!?,鏈棧對應(yīng)于鏈表2022-05-05
Qt編寫地圖實(shí)現(xiàn)海量點(diǎn)位標(biāo)注
海量點(diǎn)位標(biāo)注的出現(xiàn),是為了解決普通設(shè)備點(diǎn)超過幾百個(gè)性能極速降低的問題。本文將介紹如何通過Qt實(shí)現(xiàn)海量點(diǎn)位標(biāo)注功能,感興趣的可以了解一下2022-01-01

