亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Matlab GUI掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)

        2008-04-12 00:00:00陳子為
        現(xiàn)代電子技術(shù) 2008年24期

        摘 要:Matlab是國(guó)際上使用最為廣泛的科學(xué)與工程計(jì)算軟件工具。與VC等其他編程語(yǔ)言相比,Matlab 的GUI(Graphics User Interface,圖形用戶接口)設(shè)計(jì)同樣采用了面向?qū)ο蟮募夹g(shù),但Matlab具有強(qiáng)大、豐富的內(nèi)置函數(shù)和工具箱,界面設(shè)計(jì)時(shí)更加簡(jiǎn)潔、快捷與直觀。在簡(jiǎn)要介紹掃雷游戲核心算法的基礎(chǔ)上,給出一種基于Matlab GUI的能安裝且能獨(dú)立運(yùn)行的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)方法,并在Matlab 7.1和Windows XP SP2操作系統(tǒng)下成功實(shí)現(xiàn),經(jīng)過(guò)實(shí)驗(yàn)測(cè)試,結(jié)果正確,各項(xiàng)功能達(dá)到游戲要求。該實(shí)現(xiàn)方法對(duì)其他基于Matlab的游戲開發(fā)起到拋磚引玉的作用,同時(shí)對(duì)各專業(yè)人員借助Matlab語(yǔ)言快速開發(fā)出具備強(qiáng)大計(jì)算功能的專業(yè)應(yīng)用軟件具有重要的意義。

        關(guān)鍵詞:Matlab;掃雷;游戲開發(fā);圖形用戶接口;Stand-Alone

        中圖分類號(hào):TP18文獻(xiàn)標(biāo)識(shí)碼:B

        文章編號(hào):1004-373X(2008)24-085-04

        Design and Realization of a Game of Mine-sweeping Based on Matlab GUI

        CHEN Ziwei

        (Chengdu University of Information Technology,Chengdu,610225,China)

        Abstract:Matlab is the most popular scientific and engineering computation tool.Comparing to other programming language,Matlab GUI is also object-oriented,but it has powerful built-in functions and toolbox.It is more simple,faster and intuitive when interface design using Matlab GUI.Core algorithm of mine-sweeping games,design and realization method of installable and stand-alone mine-sweeping games based on Matlab GUI is presented.This game is realized on the Matlab 7.1 and Windows XP SP2.It proves that results are correct and all functions satisfy game requirements.This realization method contributes to other game developing based on Matlab,and it is valuable to help the professionals develop applications software possessing high-performance for computing based on Matlab quickly.

        Keywords:Matlab;mine-sweeping;game developing;graphics user interface;Stand-Alone

        1 引 言

        最初以訓(xùn)練鼠標(biāo)操作為目的而設(shè)計(jì)的掃雷游戲是一款經(jīng)久不衰的Windows平臺(tái)休閑益智游戲。盡管Windows操作系統(tǒng)歷經(jīng)數(shù)次換代,變得越來(lái)越龐大、復(fù)雜,但這個(gè)可愛的小游戲在任何版本的Windows操作系統(tǒng)里卻依然保持著原貌,幾乎每個(gè)電腦使用者都接觸過(guò)它。

        Matlab是美國(guó)MathWorks公司研制開發(fā)的軟件產(chǎn)品,它是當(dāng)今世界上使用最為廣泛的科學(xué)計(jì)算軟件之一,Matlab具有強(qiáng)大、豐富的內(nèi)置函數(shù)和工具箱,以及高度靈活的可編程性,Matlab特別適用于科學(xué)計(jì)算、圖形圖像處理、數(shù)據(jù)的擬合和可視化等,還具有動(dòng)畫處理、Fourier變換、有限差分和有限元的處理等高級(jí)功能[1]。由于采用了面向?qū)ο蟮募夹g(shù)并且以矩陣運(yùn)算為基礎(chǔ),它的數(shù)據(jù)處理效率是其他軟件很難相比的。與VC相比,兩者在圖形界面之間有很大的相似性,但Matlab實(shí)現(xiàn)更簡(jiǎn)單,特別是對(duì)于有大量數(shù)值運(yùn)算和圖形圖像處理的程序,Matlab具有很大優(yōu)勢(shì)。

        本文將經(jīng)典的掃雷游戲和Matlab相結(jié)合,研究利用Matlab的GUI工具開發(fā)類似Windows 掃雷游戲的方法。

        2 掃雷游戲的算法分析

        2.1 隨機(jī)布雷

        掃雷游戲要求在X行、Y列的游戲區(qū)內(nèi)隨機(jī)地布上nummines個(gè)雷(要求nummines

        掃雷游戲還要求在沒有雷的地方被點(diǎn)擊后就會(huì)顯示一個(gè)數(shù)字表示它周圍有幾個(gè)雷,這里可以分析實(shí)現(xiàn)這個(gè)功能的算法。把整個(gè)游戲區(qū)看成一個(gè)二維數(shù)組minefield[i,j]:

        要知道m(xù)inefield [2,6]周圍有幾個(gè)雷,只需要去檢測(cè)如下8個(gè)網(wǎng)格是否布置了雷即可。

        minefield[1,5],minefield[1,6],minefield[1,7]

        minefield[2,5],minefield[2,7]

        minefield[3,5],minefield[3,6],minefield[3,7]

        將上面的8個(gè)網(wǎng)格的位置關(guān)系與minefield [2,6]進(jìn)行比較,不難發(fā)現(xiàn)它們之間存在一定的數(shù)學(xué)關(guān)系,抽象出來(lái)就是:minefield[i,j]周圍雷的個(gè)數(shù)是由如下8個(gè)位置處的雷的總和決定的。

        minefield[i-1,j-1],minefield[i-1,j],minefield[i-1,j+1]

        minefield[i,j-1],minefield[i,j+1]

        minefield[i+1,j-1],minefield[i+1,j],minefield[i+1,j+1]

        上面幾個(gè)位置可能超出了邊界,因此需要根據(jù)實(shí)際情況給變量i與j設(shè)置范圍。

        2.2 自動(dòng)展開非雷區(qū)

        掃雷程序還要求自動(dòng)展開已確定沒有雷的網(wǎng)格(即非雷區(qū))。如果minefield [2,6]周圍雷數(shù)為1,且minefield[3,7]已被標(biāo)示為地雷,則minefield[1,5],minefield[1,6],minefield[1,7],minefield[2,5],minefield[2,7],minefield[3,5],minefield[3,6]將被展開。同理,minefield[1,5]周圍的非雷區(qū)網(wǎng)格也將被展開,以此類推,一直波及到有雷的網(wǎng)格(即雷區(qū))為止。這也是實(shí)現(xiàn)本游戲的關(guān)鍵[2]。事實(shí)上這就是一種遞歸過(guò)程,通過(guò)遞歸算法可以實(shí)現(xiàn)。把數(shù)組的元素設(shè)定為一個(gè)類對(duì)象,它們所屬的類設(shè)定這樣的一個(gè)事件:在被展開時(shí),檢查周圍的雷數(shù)是否與周圍標(biāo)示出來(lái)的雷數(shù)相等, 如果相等則展開周圍未標(biāo)示的網(wǎng)格。這樣新的網(wǎng)格展開又觸發(fā)這個(gè)事件,就這樣遞歸下去,一直蔓延到不可展開的網(wǎng)格為止。

        3 系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)

        3.1 游戲主界面設(shè)計(jì)

        游戲主界面由菜單、游戲區(qū)、按鈕區(qū)、信息顯示區(qū)等幾部分構(gòu)成,如圖1所示。Matlab提供了一套完整的GUI庫(kù),能夠完成基本的Windows窗體應(yīng)用程序,因此可以簡(jiǎn)單地為掃雷程序制作出界面。圖1主要通過(guò)Matlab 的GUI控件,建立Figure對(duì)象、Axes對(duì)象、Uimenu對(duì)象、Uicontrol對(duì)象的Text類型、Uicontrol對(duì)象的Pushbutton類型等。Matlab還提供了定時(shí)器,能夠完成游戲的計(jì)時(shí)。

        3.2 初始化

        3.2.1 雷區(qū)/非雷區(qū)的產(chǎn)生

        底圖的大小為N=X×Y,其中X表示底圖的行數(shù),Y表示底圖的列數(shù),因此申請(qǐng)一個(gè)X×Y的矩陣空間minefield存儲(chǔ)雷區(qū)與非雷區(qū)。為了隨機(jī)的產(chǎn)生地雷,需要產(chǎn)生N個(gè)隨機(jī)數(shù)并對(duì)這N個(gè)隨機(jī)數(shù)按照增序排列。這對(duì)Matlab來(lái)說(shuō)很容易實(shí)現(xiàn)。由于需要產(chǎn)生nummines個(gè)地雷(可由玩家根據(jù)不同難度級(jí)別選取或自定義不同的行數(shù)、列數(shù)以及雷數(shù),并事先賦給rows,cols,nummines等變量),所以只要找出最小的nummines個(gè)隨機(jī)數(shù)所在位置即可??梢砸运饕禐閚ummines的隨機(jī)數(shù)為設(shè)定值,并用該設(shè)定值與所有隨機(jī)數(shù)比較,小于或等于設(shè)定值的地方為邏輯1,即為雷區(qū);大于設(shè)定值的地方為邏輯0,即為非雷區(qū)。

        %隨機(jī)產(chǎn)生雷區(qū)和非雷區(qū)

        minefield = rand(rows,cols);

        [temp,index] = sort(minefield(:));

        minefield = (minefield <= minefield(index(nummines)));

        3.2.2 鄰接雷數(shù)的計(jì)算

        掃描整個(gè)底圖,按照左、右、上、下、左上、右上、左下、右下的順序檢測(cè)每個(gè)網(wǎng)格周圍8格的地雷數(shù),并把這些數(shù)字累加后賦給minefield矩陣的相應(yīng)位置。

        east = (2:cols); west = (1:cols-1); north = (1:rows-1); south = (2:rows);

        cntmines = zeros(rows,cols);

        cntmines(:,west) = cntmines(:,west) + minefield(:,east);

        cntmines(:,east) = cntmines(:,east) + minefield(:,west);

        cntmines(north,:) = cntmines(north,:) + minefield(south,:);

        cntmines(south,:) = cntmines(south,:) + minefield(north,:);

        cntmines(north,west) = cntmines(north,west) + minefield(south,east);

        cntmines(north,east) = cntmines(north,east) + minefield(south,west);

        cntmines(south,west) = cntmines(south,west) + minefield(north,east);

        cntmines(south,east) = cntmines(south,east) + minefield(north,west);

        3.3 對(duì)鼠標(biāo)事件的處理

        3.3.1 鼠標(biāo)右鍵標(biāo)記的實(shí)現(xiàn)

        單擊鼠標(biāo)右鍵標(biāo)記為雷的功能是先通過(guò)判斷Figure對(duì)象中的SelectionType屬性是否為Alt,從而判斷右鍵是否按下。再確定到底哪一個(gè)網(wǎng)格被點(diǎn)擊,若點(diǎn)擊的網(wǎng)格已被標(biāo)記為雷,則去掉標(biāo)記,否則調(diào)用Matlab函數(shù)image來(lái)標(biāo)記為雷。鼠標(biāo)右鍵操作是在窗口點(diǎn)擊事件里處理的。

        %如果計(jì)時(shí)器沒有啟動(dòng),則啟動(dòng)

        if strcmp(get(handle,′Running′),′off′)

        start(handle);

        end

        axes(findobj(gcf,′Tag′,′MainAxes′));

        %如果點(diǎn)擊了鼠標(biāo)右鍵,那么Figure的SelectionType會(huì)被設(shè)置為alt

        if strcmp(get(gcf,′SelectionType′),′alt′)

        pt = get(gca,′CurrentPoint′);%獲取點(diǎn)擊的網(wǎng)格坐標(biāo)

        m = rows - (floor(pt(1,2) / HEIGHT) + 1) + 1;

        n = floor(pt(1,1) / WIDTH) + 1;

        if 1 <= m m <= rows 1 <= n n <= cols%如果點(diǎn)擊的是網(wǎng)格

        if hflag(m,n) ~= 0%如果點(diǎn)擊的網(wǎng)格已被標(biāo)記為雷,則去掉標(biāo)記

        set(h(m,n),′Visible′,′on′);

        delete(hflag(m,n));

        hflag(m,n) = 0;

        remaining = remaining + 1;

        set(textHndl,′String′,num2str(remaining));

        else%如果點(diǎn)擊的網(wǎng)格未做操作,則標(biāo)記為雷

        hflag(m,n) = image([(n-1)*WIDTH+4,(n-1)*WIDTH+2+BWIDTH-5],…[(rows-m)*HEIGHT+4,(rows-m)*HEIGHT+2+BHEIGHT-5],flag);

        set(h(m,n),′Visible′,′off′);

        remaining = remaining - 1;

        set(textHndl,′String′,num2str(remaining));

        end

        end

        CheckWin();%檢查游戲是否勝利

        drawnow;

        end

        3.3.2 蔓延處理

        如果點(diǎn)了一個(gè)網(wǎng)格,則查看周圍的7個(gè),那7個(gè)繼續(xù)計(jì)算周圍鄰接的網(wǎng)格,只要有1個(gè)不是空白(有雷),此次遞歸結(jié)束。根據(jù)這個(gè)原理可編寫一個(gè)遞歸函數(shù)xpbombs(′uncover′,m,n),該函數(shù)先對(duì)網(wǎng)格(m,n)周圍的地雷總數(shù)c進(jìn)行判斷,如果c不大于1,則根據(jù)遞歸算法進(jìn)行蔓延處理;如果c大于1(即周圍有地雷),則此次遞歸結(jié)束,在該網(wǎng)格處用不同顏色標(biāo)明c的數(shù)值大小。

        if m>1

        if n>1

        xpbombs(′uncover′,m-1,n-1),

        end;

        xpbombs(′uncover′,m-1,n);

        if n < cols,

        xpbombs(′uncover′,m-1,n+1),

        end;

        end

        if n>1,

        xpbombs(′uncover′,m,n-1),

        end;

        if n

        xpbombs(′uncover′,m,n+1),

        end;

        if m

        if n > 1,

        xpbombs(′uncover′,m+1,n-1),

        end;

        xpbombs(′uncover′,m+1,n);

        if n < cols,

        xpbombs(′uncover′,m+1,n+1),

        end;

        end

        3.4 Matlab內(nèi)置式GUI對(duì)話框設(shè)置

        Matlab提供了多種內(nèi)置的GUI對(duì)話框,用戶可以借助該對(duì)話框進(jìn)行GUI的設(shè)置、輸入等動(dòng)作,使GUI的設(shè)計(jì)更為方便,同時(shí)也可以使開發(fā)的GUI界面更富有人性化,在操作上更富有彈性。

        在游戲的過(guò)程中,需要使用信息對(duì)話框給用戶反饋提示信息,這可以通過(guò)Matlab的msgbox函數(shù)來(lái)實(shí)現(xiàn)。由于Matlab內(nèi)置式GUI對(duì)話框也是GUI的一部分,因而也可以通過(guò)set與get函數(shù)進(jìn)行屬性的存取。如果無(wú)法預(yù)知有哪些屬性可以使用時(shí),也可以由get(hm)去查看msgbox有哪些屬性可以設(shè)置,其中hm是msgbox對(duì)話框的句柄。下面的函數(shù)給出了如圖2所示的“關(guān)于”對(duì)話框的實(shí)現(xiàn)方法:

        function aboutbox_Callback(src,evnt)

        [IconData,IconCmap]=imread(′cuit.gif′);

        tips=[{′Version: 2.0′},{sprintf([′\\\Copyright 2008-2010 dsplab.cuit \\\Author: Chen Ziwei \\\ email:czw@cuit.edu.cn′])}];

        hm=msgbox(tips,′About XPbombs′,′custom′,IconData,IconCmap);

        set(hm,′color′,′w′);

        th=findall(hm,′type′,′text′);

        set(th,′color′,′r′,′fontsize′,11);

        4 將GUI制作成可安裝程序

        4.1 Matlab Compiler文件編譯

        Matlab可以使用C或C++編譯器進(jìn)行文件編譯的操作[3],從而可以將Matlab中function格式的M文件編譯成獨(dú)立運(yùn)行的可執(zhí)行文件(即*.exe文件)。在編譯前,需要執(zhí)行mbuild-setup進(jìn)行一次編譯器安裝操作,其中setup除了可以設(shè)置當(dāng)前的編譯器外,還可以用以更改setup系統(tǒng)信息選項(xiàng)文件。若僅需要使用當(dāng)前Matlab Compiler所默認(rèn)的Lcc編譯器,則無(wú)需執(zhí)行mbuild-setup這個(gè)步驟。編譯是由“mcc-m M文件名”語(yǔ)句實(shí)現(xiàn)的。編譯成功后所產(chǎn)生的獨(dú)立執(zhí)行文件可以直接在MS-DOS下執(zhí)行。

        4.2 DOS窗口的消去

        在Windows平臺(tái)下如果直接運(yùn)行編譯生成的可執(zhí)行文件,則在運(yùn)行的過(guò)程中會(huì)產(chǎn)生一個(gè)黑色背景的DOS窗口。這個(gè)DOS窗口是一個(gè)控制臺(tái)界面,主要用來(lái)顯示一些有用的信息,例如程序運(yùn)行時(shí)產(chǎn)生的一些錯(cuò)誤信息,或者程序運(yùn)行過(guò)程中的輸出信息 (用disp( )函數(shù)輸出的信息)。如果程序不會(huì)產(chǎn)生這些信息或者用戶不關(guān)心這些信息,則可以直接將該DOS窗口消去。消去DOS窗口的方法有很多[4],可以采用MathWorks公司網(wǎng)站提供的免費(fèi)工具NSIS[5]來(lái)實(shí)現(xiàn)。該方法首先用文本編輯工具(例如寫字板)編寫suppress.ini文件,其內(nèi)容只有2行,即為:

        [LoadProgram]

        Name=XPbombs.exe

        其中\(zhòng)"XPbombs.exe\"就是Matlab Compiler編譯所產(chǎn)生的可執(zhí)行文件的名稱。接著直接運(yùn)行所提供的工具軟件\"suppress.exe\"即可。并且\"suppress.exe\"的文件名是可以更改的,但要求\"suppress.exe\",\"suppress.ini\"和所要執(zhí)行的EXE文件必須處于同一文件夾下。

        4.3 可安裝程序的制作

        由Matlab生成的代碼不能脫離Matlab環(huán)境獨(dú)立運(yùn)行,但通過(guò)安裝Matlab自帶的MCRInstaller.exe文件就可以在沒有安裝Matlab的系統(tǒng)上,獨(dú)立運(yùn)行由Matlab編譯后所生成的可執(zhí)行文件(XPbombs.exe)[6]。因此可以利用安裝制作軟件(例如 Inno Setup),將GUI程序與MCRInstaller.exe文件一起打包。安裝制作軟件能快速制作出標(biāo)準(zhǔn)Windows風(fēng)格的安裝界面,并且能將全部文件打包成一個(gè)EXE文件。執(zhí)行該EXE文件程序即會(huì)解包并安裝,程序安裝后會(huì)在桌面和程序組生成程序運(yùn)行的快捷方式。運(yùn)行該快捷方式即可啟動(dòng)程序,而不必由用戶手動(dòng)啟動(dòng)Matlab然后運(yùn)行M文件。

        5 結(jié) 語(yǔ)

        該掃雷游戲在Matlab 7.1 和Windows XP SP2操作系統(tǒng)上成功實(shí)現(xiàn),能在Windows平臺(tái)下安裝和獨(dú)立運(yùn)行。除能實(shí)現(xiàn)基本的左鍵打開、右鍵標(biāo)記的掃雷功能以外,還能實(shí)現(xiàn)計(jì)時(shí)、剩余雷數(shù)顯示、自定義游戲難度、快捷鍵操作、點(diǎn)擊空白網(wǎng)格打開一大片、作弊、語(yǔ)音提示等擴(kuò)展功能。經(jīng)過(guò)實(shí)驗(yàn)測(cè)試,界面美觀,結(jié)果正確,各項(xiàng)功能達(dá)到游戲要求。該實(shí)現(xiàn)方法可對(duì)其他基于Matlab的游戲開發(fā)起到拋磚引玉的作用,其中的鍵盤、鼠標(biāo)等功能的實(shí)現(xiàn)方法可用于其他Matlab編程,同時(shí)對(duì)各專業(yè)人員借助Matlab語(yǔ)言快速開發(fā)出具備強(qiáng)大計(jì)算功能的專業(yè)應(yīng)用軟件具有重要的意義。

        參考文獻(xiàn)

        [1]何大維.Matlab循序漸進(jìn)[M].北京:科學(xué)出版社,2002.

        [2]薇蘋.掃雷思想解析[J].電腦知識(shí)與技術(shù),2003(34):45.

        [3]李顯宏.Matlab 7.x界面設(shè)計(jì)與編譯技巧[M].北京:電子工業(yè)出版社,2006.

        [4]Vihang.Hiding the DOS Window in a Stand-alone Application[EB/OL].http://groups.google.com/group/comp.soft-sys.matlab/browse-thread/thread/0527d566c3b72873,2007.

        [5]The MathWorks,Inc.Suppress Command Window[CP/OL].http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=3909,2006.

        [6]施曉紅,周佳.精通GUI圖形界面編程[M].北京:北京大學(xué)出版社,2003.

        [7]蘇金明,王永利.Matlab圖形圖像[M].北京:電子工業(yè)出版社,2005.

        [8]徐勇.利用VB開發(fā)掃雷游戲[J].電腦編程技巧與維護(hù),2006(3):75-77.

        [9]詹國(guó)梁.用C語(yǔ)言進(jìn)行游戲編程掃雷游戲簡(jiǎn)介[J].廣東商學(xué)院學(xué)報(bào),2002(S2):103-106.

        [10]薛年喜.Matlab在數(shù)字信號(hào)處理中的應(yīng)用[M].北京:清華大學(xué)出版社,2003.

        [11]張建強(qiáng),張秀梅.掃雷游戲策略初探[J].數(shù)學(xué)教學(xué),2004(6):32-33.

        作者簡(jiǎn)介

        陳子為 男,1978年出生,湖北漢川人,講師,碩士。主要研究方向?yàn)槔走_(dá)信號(hào)處理、高速DSP系統(tǒng)、Matlab應(yīng)用。

        无码av免费永久免费永久专区 | 国产毛片黄片一区二区三区| 亚洲精品无码久久久久av老牛| 精品国产制服丝袜高跟| 久久亚洲av成人无码软件| 中文字幕文字幕一区二区| 亚洲2022国产成人精品无码区| 99香蕉国产精品偷在线观看| 欧美刺激午夜性久久久久久久| 亚洲综合偷拍一区二区| 超碰国产精品久久国产精品99| 四虎国产精品免费久久| 久久综合亚洲色社区| 少妇人妻在线伊人春色| 中国免费看的片| 国产av电影区二区三区曰曰骚网| 亚洲欧美日韩中文v在线| 99久久精品人妻一区二区三区| 国产免费久久精品99久久| 国产成人麻豆精品午夜福利在线 | 国产av一区二区亚洲精品| 亚洲中字慕日产2020| 亚洲夜夜骑| 久久精品一区二区三区夜夜| 无码爽视频| 把插八插露脸对白内射| 日韩精品欧美激情国产一区| 亚洲高清国产成人精品久久| 国产精品久久久久9999小说| 日韩乱码视频| 国产成人自拍视频视频| 18禁裸体动漫美女无遮挡网站| 狠狠色丁香久久婷婷综合蜜芽五月 | 国产婷婷成人久久av免费| 无码精品人妻一区二区三区av| 久久综合成人网| 麻豆av在线免费观看精品| 久久久久成人精品免费播放动漫 | 色偷偷色噜噜狠狠网站30根 | 亚洲国产大胸一区二区三区| 午夜精品久久久久久久99老熟妇|