java掃雷游戲課程設(shè)計(jì)報(bào)告-帶有詳細(xì)注釋.doc_第1頁(yè)
java掃雷游戲課程設(shè)計(jì)報(bào)告-帶有詳細(xì)注釋.doc_第2頁(yè)
java掃雷游戲課程設(shè)計(jì)報(bào)告-帶有詳細(xì)注釋.doc_第3頁(yè)
java掃雷游戲課程設(shè)計(jì)報(bào)告-帶有詳細(xì)注釋.doc_第4頁(yè)
java掃雷游戲課程設(shè)計(jì)報(bào)告-帶有詳細(xì)注釋.doc_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

高級(jí)語(yǔ)言程序設(shè)計(jì)(2)課程設(shè)計(jì)任務(wù)書題 目掃雷游戲程序?qū)W生姓名王大偉學(xué)號(hào)201001010117專業(yè)班級(jí)計(jì)算1001設(shè)計(jì)內(nèi)容與要求【問(wèn)題描述】整個(gè)掃雷游戲程序的整體布局為:CardLayout布局, 采用了菜單、按鈕、面板等組件,菜單主要包括開(kāi)始,選擇級(jí)別,按鈕的功能是重新開(kāi)始新的游戲。【軟件功能】1, 用戶可以玩掃雷游戲并能自定義級(jí)別(初等,中等,高等)2, 具有計(jì)時(shí)功能,即顯示用戶完成移動(dòng)盤子所花費(fèi)的時(shí)間?!净疽蟆?1,掃雷游戲分為初級(jí)、中級(jí)和高級(jí)三個(gè)級(jí)別。單擊游戲菜單可以選擇“初級(jí)”、“中級(jí)”和“高級(jí)”。2,選擇級(jí)別后將出現(xiàn)相應(yīng)級(jí)別的掃雷區(qū)域,這時(shí)用戶使用鼠標(biāo)左鍵單擊“開(kāi)始”便啟動(dòng)計(jì)時(shí)器。3,用戶要揭開(kāi)某個(gè)方塊,可左鍵單擊它。若所揭方塊下有雷,用戶便輸了這一局,若所揭方塊下無(wú)雷,則顯示一個(gè)數(shù)字,該數(shù)字代表方塊的周圍的8個(gè)方塊中共有多少顆雷。4,如果用戶認(rèn)為某個(gè)方塊下埋著雷,單擊右鍵可以在方塊上標(biāo)識(shí)一個(gè)用戶認(rèn)為是雷的圖標(biāo),即給出一個(gè)掃雷標(biāo)記。用戶每標(biāo)記出一個(gè)掃雷標(biāo)記(無(wú)論用戶的標(biāo)記是否正確),程序?qū)@示的剩余雷數(shù)減少一個(gè)。5,當(dāng)用戶點(diǎn)中雷時(shí),將有“你輸了”的提示出現(xiàn),勝利時(shí),將有“你贏了”的提示出現(xiàn)。6,源程序中要有充分的注釋,報(bào)告中要有詳細(xì)的流程圖和文字材料。7,運(yùn)行的結(jié)果以及圖形用戶界面要進(jìn)行屏幕拷貝,插入報(bào)告中?!咎峤怀晒?1“高級(jí)語(yǔ)言程序設(shè)計(jì)(2)課程設(shè)計(jì)任務(wù)書”和“高級(jí)語(yǔ)言程序設(shè)計(jì)(2)課程設(shè)計(jì)報(bào)告”打印件各一份; 2 先將上面兩項(xiàng)內(nèi)容的word文檔,通過(guò)電子郵件交到指導(dǎo)教師,待許可后,打印裝袋。起止時(shí)間指導(dǎo)教師簽名系(教研室)主任簽名學(xué)生簽名任務(wù)書限定一頁(yè)附:課程設(shè)計(jì)報(bào)告格式高級(jí)語(yǔ)言程序設(shè)計(jì)(2)課程設(shè)計(jì)報(bào)告專業(yè) 班級(jí) 學(xué)號(hào) 姓名(簽名) 完成日期 指導(dǎo)教師(簽名)1、 程序設(shè)計(jì)說(shuō)明書【設(shè)計(jì)題目】 掃雷游戲程序【問(wèn)題描述】 整個(gè)掃雷游戲程序的整體布局為:CardLayout布局, 采用了菜單、按鈕、面板等組件,菜單主要包括開(kāi)始,選擇級(jí)別,按鈕的功能是重新開(kāi)始新的游戲?!拒浖δ堋?用戶可以玩掃雷游戲并能自定義級(jí)別(初等,中等,高等);具有計(jì)時(shí)功能,即顯示用戶完成移動(dòng)盤子所花費(fèi)的時(shí)間?!舅惴ㄋ枷搿?1,計(jì)算按鈕周圍雷數(shù)。2,隨機(jī)分布。掃雷游戲要求在M行N列的網(wǎng)格游戲區(qū)隨即的不上bon個(gè)雷,且bon的取值應(yīng)小于M和N的乘積。這可以在一張M*N的網(wǎng)格上通過(guò)均勻分布的隨即算法視線。其中bon的網(wǎng)格是雷區(qū),剩下的網(wǎng)格是非雷區(qū)。游戲的目標(biāo)是盡可能快地找到所有的雷區(qū),而不踩到地雷。Java提供了視線隨即算法的類Math,通過(guò)Math類的random()方法這可以很方便的實(shí)現(xiàn)隨即布雷的功能?!绢惖脑O(shè)計(jì)】 (1)initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設(shè)置雷區(qū)的寬度、高度以及雷區(qū)的級(jí)別。(2)actionPerformed(ActionEvent)是MineArea類實(shí)現(xiàn)的ActionListener接口中的方法。當(dāng)用戶單擊blockView中的某個(gè)方塊時(shí),actionPerformed(ActionEvent)方法負(fù)責(zé)執(zhí)行有關(guān)算法,例如,當(dāng)用鼠標(biāo)左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪?,若該方塊下無(wú)雷,actionPerformed(ActionEvent)方法將顯示blockView對(duì)象中的標(biāo)簽,該標(biāo)簽上是一個(gè)數(shù)字,該數(shù)字代表當(dāng)前方塊的周圍的8個(gè)方塊中共有多少顆雷。(3)show()方法是一個(gè)遞歸方法。actionPerformed(ActionEvent)方法執(zhí)行時(shí)將調(diào)用show方法進(jìn)行掃雷。(4)mousePressed(MouseEvent)方法是MineArea類實(shí)現(xiàn)的MouseListener接口中的方法,當(dāng)用戶按下鼠標(biāo)有件事mousePressed(MouseEvent)方法負(fù)責(zé)讓方塊上顯示一個(gè)探雷標(biāo)記。(5)inquireWin()方法用來(lái)判斷用戶是否掃雷成功,如果成功該方法負(fù)責(zé)讓record對(duì)話框可見(jiàn)。所謂掃雷成功是指不僅找到了全部的累而且用時(shí)最少?!居脩艚缑妗俊境绦蚣记伞窟\(yùn)用二維數(shù)組來(lái)判斷雷區(qū)的每一個(gè)按鈕是否有雷。當(dāng)單擊blockView中的某個(gè)方塊時(shí),actionPerformed(ActionEvent)方法負(fù)責(zé)執(zhí)行有關(guān)算法。當(dāng)按下鼠標(biāo)有件事mousePressed(MouseEvent)方法負(fù)責(zé)讓方塊上顯示一個(gè)探雷標(biāo)記。inquireWin()方法用來(lái)判斷用戶是否掃雷成功,如果成功該方法負(fù)責(zé)讓record對(duì)話框可見(jiàn)?!灸K劃分及調(diào)用關(guān)系】開(kāi)始 【模塊流程圖】 定義并初始化MineGrid類獲取相應(yīng)的設(shè)置,并為方塊產(chǎn)生隨即數(shù)字賦值 鼠標(biāo)是否點(diǎn)擊計(jì)數(shù)器數(shù)小于等級(jí)雷數(shù) 存放賦值雷區(qū),計(jì)數(shù)器加1處理周圍信息,并顯示相應(yīng)效果開(kāi)始【運(yùn)行說(shuō)明】運(yùn)用JDK環(huán)境下或eclipse運(yùn)行。2、 程序上機(jī)調(diào)試報(bào)告【語(yǔ)法錯(cuò)誤及其排除】1,不止一次忘記行程序后面的分號(hào)(;)導(dǎo)致程序運(yùn)行時(shí)出現(xiàn)大量錯(cuò)誤。2,程序后面的注釋要加/,而多次忘記雙斜杠或者直接寫成單斜杠。3,if,else語(yǔ)句不是很熟悉導(dǎo)致了許多不該犯的錯(cuò)誤。4,將=和=混淆,導(dǎo)致了不少語(yǔ)法錯(cuò)誤?!舅惴ㄥe(cuò)誤及其排除】在設(shè)計(jì)排雷的過(guò)程中,一個(gè)雷區(qū)中的一個(gè)按鈕的周圍通常是八個(gè)相鄰的按鈕而不是四個(gè),致使在程序算法設(shè)計(jì)的過(guò)程中沒(méi)有充分考慮到,最后才加上。還有actionPerformed是MineArea類實(shí)現(xiàn)的ActionListener接口中的方法。當(dāng)用戶單擊blockView中的某個(gè)方塊時(shí),actionPerformed(ActionEvent)方法負(fù)責(zé)執(zhí)行有關(guān)算法,例如,當(dāng)用鼠標(biāo)左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪郑粼摲綁K下無(wú)雷,actionPerformed(ActionEvent)方法將顯示blockView對(duì)象中的標(biāo)簽,該標(biāo)簽上是一個(gè)數(shù)字,該數(shù)字代表當(dāng)前方塊的周圍的8個(gè)方塊中共有多少顆雷。此方法開(kāi)始運(yùn)用不恰當(dāng),導(dǎo)致若方塊下有雷,依然顯示標(biāo)簽上的數(shù)字,最后運(yùn)行檢查的時(shí)候才發(fā)現(xiàn)錯(cuò)誤,得以改正。3、 程序測(cè)試結(jié)果【輸出結(jié)果】【收獲及體會(huì)】這個(gè)掃雷游戲是完全模擬微軟系統(tǒng)自帶的掃雷游戲,所以難度是很大,必然在編程過(guò)程中也遇到很多問(wèn)題,有些問(wèn)題比較簡(jiǎn)單但就不知道錯(cuò)在哪里,有些大問(wèn)題之道在哪就是不知道怎么辦才好,后來(lái)經(jīng)過(guò)自己的不斷調(diào)試,這個(gè)掃雷游戲終于大功告成。經(jīng)過(guò)編寫這個(gè)掃雷游戲,我認(rèn)識(shí)到應(yīng)該注意細(xì)節(jié)問(wèn)題,雖然是很小的問(wèn)題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴(yán)謹(jǐn)性,同時(shí)還可以為以后的編程積累經(jīng)驗(yàn)。編寫完這個(gè)掃雷游戲,我發(fā)現(xiàn)自己有很多的不足,我想如果讓我來(lái)單獨(dú)來(lái)編寫這個(gè)游戲,我感覺(jué)能編出來(lái)的可能性很小,因?yàn)檫@個(gè)游戲涉及到好多算法。感觸最深的就是我們真的要扎扎實(shí)實(shí)的打基礎(chǔ)!并且我感覺(jué)到只要我們自己肯下功夫?qū)W習(xí),我們也可以做出很好的東西,不需要每次都抄襲別人的,只有自己的才是最珍貴的!4、 源程序代碼(注釋)import java.awt.BorderLayout; /導(dǎo)入邊框布局import java.awt.Container; /導(dǎo)入一個(gè)容器,也是一個(gè)組件,在這個(gè)容器里你可以添加其他awt的組件import java.awt.Font; /導(dǎo)入字形,字體import java.awt.GridLayout; /導(dǎo)入網(wǎng)格式布局import java.awt.Insets; / Insets 對(duì)象描述容器的邊界區(qū)域。它指定一個(gè)容器在它的各個(gè)邊界上應(yīng)留出的空白區(qū)間。這個(gè)空白可以是一個(gè)邊界,一個(gè)不顯示區(qū)域或一個(gè)標(biāo)題。import java.awt.event.ActionEvent; / ActionEvent是一個(gè)類,指示發(fā)生了組件定義的動(dòng)作的語(yǔ)義事件。 import java.awt.event.ActionListener; / ActionListener用于接收操作事件的偵聽(tīng)器接口。繼承自EventListener。import java.awt.event.MouseAdapter; /導(dǎo)入鼠標(biāo)監(jiān)聽(tīng)適配器,負(fù)責(zé)對(duì)鼠標(biāo)事件進(jìn)行監(jiān)聽(tīng)import java.awt.event.MouseEvent; /接口import javax.swing.JButton;/導(dǎo)入按鈕類import javax.swing.JFrame;/導(dǎo)入面板類import javax.swing.JLabel;/導(dǎo)入標(biāo)簽類import javax.swing.JMenu; /菜單import javax.swing.JMenuBar; /用來(lái)創(chuàng)建水平菜單欄import javax.swing.JMenuItem; /創(chuàng)建帶有設(shè)置文本或圖標(biāo)的 JMenuItem 菜單項(xiàng)import javax.swing.JPanel; /面板import javax.swing.Timer; / 定時(shí)器,功能是在指定的時(shí)間間隔內(nèi)反復(fù)觸發(fā)指定窗口的定時(shí)器事件。 public class ScanLei1 extends JFrame implements ActionListener/掃雷類繼承了JFrame實(shí)現(xiàn)了ActionListener接口private static final long serialVersionUID = 1L; / serialVersionUID 用來(lái)表明類的不同版本間的兼容性private Container contentPane; /內(nèi)容面板,每一個(gè)JFrame對(duì)應(yīng)一個(gè)內(nèi)容面板,所有的組件應(yīng)該置于內(nèi)容面板之上private JButton btn; /聲明一個(gè)按鈕對(duì)象,開(kāi)始按鈕,對(duì)象名為btn,private的意思是把變量或方法聲明成私有的,只有在本類中或本類實(shí)例可以訪問(wèn),其他類不可以private JButton btns;/聲明一個(gè)按鈕數(shù)組 雷區(qū)的每一個(gè)雷都是一個(gè)按鈕,所有按鈕放置到該數(shù)組中private JLabel b1;/聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置剩余的雷的個(gè)數(shù)private JLabel b2; /聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置已經(jīng)游戲的時(shí)間private JLabel b3; /聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置游戲的結(jié)果private Timer timer;/聲明一個(gè)定時(shí)器對(duì)象private int row=9; /行,用于指定雷區(qū)的行private int col=9; /列 用于指定雷區(qū)的列private int bon=10; /布雷的個(gè)數(shù)private int a;/聲明一個(gè)int型的二維數(shù)組,二維數(shù)組的中元素,有以下含義,值為0說(shuō)明該元素所對(duì)應(yīng)的坐標(biāo)所在的按鈕既不是雷又不是周圍有雷的按鈕,如果是100,則說(shuō)明該元素所對(duì)應(yīng)的坐標(biāo)所在的按鈕時(shí)雷,如果該元素是10,在說(shuō)明對(duì)應(yīng)的坐標(biāo)所在的按鈕已經(jīng)被單擊過(guò),如果不是以上幾個(gè)值,則這個(gè)元素的值代表了該按鈕附近可能有幾顆雷。private int b;/聲明int型的變量b 剩余雷的個(gè)數(shù)private int a1;/聲明int型數(shù)組a1,放置隨機(jī)數(shù),用于確定雷應(yīng)該布到雷區(qū)的位置private JPanel p,p1,p2,p3;/聲明面板public ScanLei1(String title)/定義掃雷的構(gòu)造方法,該構(gòu)造方法有個(gè)String類型的參數(shù),參數(shù)名為titlesuper(title);/調(diào)用JFrame的構(gòu)造方法,將title字符串傳入該構(gòu)造方法,這樣的話窗體顯示時(shí),標(biāo)題欄會(huì)顯示傳入的title值contentPane=getContentPane();/獲取當(dāng)前JFrame對(duì)象的內(nèi)容面板,注意因?yàn)镾canLei1類繼承了JFrame對(duì)象,所以ScanLei1的對(duì)象也是JFrame對(duì)象setSize(300,400);/設(shè)置掃雷窗體的大小事300*400像素this.setBounds(400, 100, 400, 500); / setBounds(x,y,width,height); x:組件在容器X軸上的起點(diǎn) y:組件在容器Y軸上的起點(diǎn) width:組件的長(zhǎng)度 height:組件的高度,在這里的意思就是該窗體打開(kāi)時(shí),會(huì)以屏幕的左上角為原點(diǎn)的水平方向是400像素,垂直方向是100像素的位置顯示,后面設(shè)置的400*500像素指的是窗體的大小,所以最終窗體的大小是400*500像素,覆蓋掉了上面setSize(300,400)的值setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /設(shè)置當(dāng)點(diǎn)擊窗體右上角的X按鈕時(shí)的窗體的行為,這里設(shè)置的是當(dāng)點(diǎn)擊這個(gè)按鈕時(shí)關(guān)閉并退出程序,沒(méi)有設(shè)置的話,默認(rèn)點(diǎn)關(guān)閉時(shí)只是隱藏窗體,在后臺(tái)進(jìn)程中還可以看到timer =new Timer(1000,(ActionListener) this);/每隔1000毫秒觸發(fā)一次動(dòng)作事件的監(jiān)聽(tīng)a = new introw+2col+2;/創(chuàng)建數(shù)組a,a是一個(gè)二維數(shù)組,數(shù)組時(shí)11列,11行initGUI();/調(diào)用初始化圖形界面方法public void initGUI()/聲明初始化圖形界面方法 p3=new JPanel();/創(chuàng)建一個(gè)面板b=bon;/將bon的值賦值給變量bJMenuBar menuBar=new JMenuBar();/創(chuàng)建一個(gè)菜單欄對(duì)象JMenu menu1=new JMenu(游戲);/創(chuàng)建游戲菜單JMenu menu2=new JMenu(幫助);/創(chuàng)建幫助菜單JMenuItem mi1=new JMenuItem(初級(jí));/創(chuàng)建初級(jí)菜單項(xiàng)JMenuItem mi2 = new JMenuItem(中級(jí));/創(chuàng)建中級(jí)菜單項(xiàng)JMenuItem mi3 =new JMenuItem(高級(jí));/創(chuàng)建高級(jí)菜單項(xiàng)mi1.addActionListener(this);/為初級(jí)菜單項(xiàng)加入動(dòng)作事件監(jiān)聽(tīng)器,當(dāng)你單擊鼠標(biāo)左鍵點(diǎn)初級(jí)菜單項(xiàng)時(shí)會(huì)執(zhí)行actionPerformed(ActionEvent e)方法menu1.add(mi1); mi2.addActionListener(this);menu1.add(mi2);mi3.addActionListener(this);menu1.add(mi3);/以上幾個(gè)操作類似menuBar.add(menu1);/將游戲菜單加入到菜單欄menuBar.add(menu2);/將幫助菜單加入到菜單欄p3.add(menuBar); /將菜單欄加入到p3面板上去b1=new JLabel(bon+);/創(chuàng)建一個(gè)標(biāo)簽,標(biāo)簽的內(nèi)容是bon的值10a1=new intbon;/創(chuàng)建a1數(shù)組,數(shù)組的長(zhǎng)度為10btn =new JButton(開(kāi)始);/創(chuàng)建開(kāi)始按鈕btn.addActionListener(this);/為開(kāi)始按鈕加入動(dòng)作事件監(jiān)聽(tīng)器b2=new JLabel(0);/創(chuàng)建標(biāo)簽b2,b2的內(nèi)容是0b3=new JLabel();/創(chuàng)建標(biāo)簽b3,b3暫時(shí)內(nèi)容為空btns=new JButtonrow*col;/創(chuàng)建一個(gè)按鈕數(shù)組,數(shù)組的個(gè)數(shù)為row*col,這個(gè)程序中就是9*9個(gè),每一個(gè)雷的位置就是一個(gè)按鈕 p=new JPanel();/創(chuàng)建一個(gè)面板p.setLayout(new BorderLayout(); /設(shè)置容器的邊框布局,邊框布局的樣式大致是這樣北東中西南這樣的話這個(gè)panl中就可以放置五個(gè)組件了contentPane.add(p); / 將panl放置到內(nèi)容面板上去,為什么將一個(gè)面板放到內(nèi)容面板,而不是將組件放到內(nèi)容面板上去呢,你可以看到panl上最多可以直接放置五個(gè)組件或者容器,但如果將組件或者容器直接放置到內(nèi)容面板上去的話,就只能放一個(gè)組件或者容器了。p.add(p3,BorderLayout.NORTH);/p3添加到面板的北邊,也就是在北邊放上了菜單欄,結(jié)果就如圖了游戲 幫助東中西南/combo=new JComboBox(new Object初級(jí),中級(jí),高級(jí) );/加監(jiān)聽(tīng)/*combo.addItemListener(new ItemListener();*/ p1=new JPanel();/創(chuàng)建一個(gè)面板/在那個(gè)位置/(FlowLayout)p1.getLayout().setAlignment(FlowLayout.RIGHT); /Alignment列隊(duì)p1.add(b1);/將標(biāo)簽b1添加到面板上p1.add(btn);/將開(kāi)始按鈕添加到面板上p1.add(b2);/將標(biāo)簽b2添加到面板上p1.add(b3);/將標(biāo)簽b3添加到面板上p.add(p3,BorderLayout.NORTH);/這行代碼重復(fù) 還是將菜單欄加入到窗體的北邊p.add(p1,BorderLayout.CENTER);/將帶有一個(gè)開(kāi)始按鈕,三個(gè)標(biāo)簽的按鈕加入到窗體的中間位置游戲 幫助東10開(kāi)始0西南 p2=new JPanel();/創(chuàng)建面板p2p2.setLayout(new GridLayout(row,col,0,0); / GridLayout網(wǎng)格布局,p2設(shè)置為網(wǎng)格布局,該布局的最多可以9行9列,正好可以放置81個(gè)雷按鈕,按鈕和按鈕之間的水平間隔,垂直間隔都為0pxfor(int i=0;irow*col;i+)/為按鈕數(shù)組賦值,此處的作用是創(chuàng)建81個(gè)雷按鈕對(duì)象btnsi=new JButton();/創(chuàng)建雷按鈕btnsi.setMargin(new Insets(0,0,0,0);/設(shè)置雷按鈕與其他組件的間距btnsi.setFont(new Font(null,Font.BOLD,25); /設(shè)置字體字形。黑體25pxbtnsi.addActionListener(this);/為雷按鈕添加監(jiān)聽(tīng)器,監(jiān)聽(tīng)動(dòng)作事件btnsi.addMouseListener(new NormoreMouseEvent();/添加鼠標(biāo)監(jiān)聽(tīng)器,監(jiān)聽(tīng)普通鼠標(biāo)事件p2.add(btnsi);/將雷按鈕添加到面板p2上contentPane.add(p,BorderLayout.NORTH);contentPane.add(p2,BorderLayout.CENTER);/將p2添加到窗體的中間游戲 幫助東10開(kāi)始0西南public void go()/創(chuàng)建go方法setVisible(true);/設(shè)置是否顯示窗體,設(shè)置為true就是顯示當(dāng)前窗體public static void main(String args)/主方法,作用是實(shí)例化窗體對(duì)象,調(diào)用go方法將窗體顯示到屏幕上來(lái)new ScanLei1(掃雷By信息1001樊康).go();/實(shí)例化窗體對(duì)象,調(diào)用go方法將窗體顯示到屏幕上來(lái)public void out(int a,JButton btns,ActionEvent e,int i,int x,int y) int p=1; if(axy=0)/如果一個(gè)按鈕既不是雷周圍又沒(méi)有雷 axy=10;/將該按鈕對(duì)應(yīng)的值設(shè)置為10 btnsi.setEnabled(false);/且這個(gè)按鈕不可用狀態(tài) for(int l=y-1;l-1&n-1&mrow) /如果n值和m值在雷區(qū)的范圍之內(nèi) for(int q=0;qrow; if(n+col*q)=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)(m+1)*col)/如果該按鈕同一行右側(cè)的按鈕相應(yīng)位置的值既不是雷又沒(méi)雷且又不是已經(jīng)點(diǎn)擊過(guò)的按鈕,則說(shuō)明該按鈕周圍有雷 if(axy+1!=0&axy+1!=10) btnsn+col*q.setText(axy+1+); axy+1=10; btnsn+col*q.setEnabled(false); else if(axy+1=0)/如果該按鈕同一行右側(cè)的按鈕相應(yīng)位置的值既不是雷又沒(méi)雷,那么遞歸判斷這個(gè)按鈕周圍的其他按鈕是什么情況 out(a,btns,e,n+col*q,x,y+1); axy+1=10; btnsn+col*q.setEnabled(false); p=0; public void actionPerformed(ActionEvent e) if(e.getActionCommand()=初級(jí))/如果你單擊的是游戲菜單中初級(jí)菜單項(xiàng)row=9;/設(shè)置雷的行數(shù)是9col=9;/列數(shù)是9bon=10;a1=new intbon;b=bon;/setSize(297,377);a = new introw+2col+2;this.remove(p2);/從窗體中央移除雷區(qū)面板timer.stop();/計(jì)時(shí)器停止b1.setText(10);/設(shè)置標(biāo)簽b1的內(nèi)容為10b2.setText(0);/b2的標(biāo)簽內(nèi)容為0b3.setText();/b3的標(biāo)簽內(nèi)容為空btns=new JButtonrow*col;/創(chuàng)建雷區(qū)雷按鈕數(shù)組 p2=new JPanel();/重新創(chuàng)建面板p2p2.setLayout(new GridLayout(row,col,0,0);/設(shè)置p2為網(wǎng)格布局,同樣還是9行9列,每一個(gè)單元格放一個(gè)雷for(int i=0;irow*col;i+)btnsi=new JButton( );/為每一個(gè)雷按鈕實(shí)例化一個(gè)按鈕對(duì)象btnsi.setMargin(new Insets(0,0,0,0);/設(shè)置雷按鈕的間距btnsi.setFont(new Font(null,Font.BOLD,25);/設(shè)置雷按鈕上文字的字體為黑體 25pxbtnsi.addActionListener(this);/添加動(dòng)作事件監(jiān)聽(tīng)器btnsi.addMouseListener(new NormoreMouseEvent();/添加普通按鈕事件監(jiān)聽(tīng)器p2.add(btnsi);/將雷按鈕放置到p2面板上contentPane.add(p2,BorderLayout.CENTER);將雷區(qū)面板放置到窗體中間/setSize(297,377);this.pack();/設(shè)置窗體的大小為緊緊包容著所有組件for(int i=0;irow*col;i+)btnsi.setText( );/設(shè)置所有雷按鈕的內(nèi)容為空格btnsi.setEnabled(true);/設(shè)置所有雷按鈕為可用狀態(tài)for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/將二維數(shù)組a的所有元素初始化為0else if(e.getActionCommand()=中級(jí))如果選了游戲菜單中的中級(jí)菜單項(xiàng)row=16;/設(shè)置雷區(qū)有16*16個(gè)雷 以下代碼作用和選初級(jí)時(shí)相同,不再注釋了col=16;bon=40;/setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2; b=bon;this.remove(p2);timer.stop();b1.setText(40);b2.setText(0);b3.setText();btns=new JButtonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new JButton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);this.pack();/setSize(33*col,33*row+80);for(int i=0;irow*col;i+)btnsi.setText();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;else if(e.getActionCommand()=高級(jí))/如果選擇的是高級(jí)菜單項(xiàng)row=16;/設(shè)置雷區(qū)是16*32 以下代碼和初級(jí)游戲代碼作用相同,不在注釋了col=32;bon=99;setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2;b=bon;this.remove(p2);timer.stop();b1.setText(99);b2.setText(0);b3.setText();btns=new JButtonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new JButton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);/setSize(33*col,33*row+80);this.pack();for(int i=0;irow*col;i+)btnsi.setText();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;if(e.getSource()=btn)/如果點(diǎn)擊了開(kāi)始按鈕timer.start();/計(jì)時(shí)器開(kāi)始計(jì)時(shí)b=bon;b3.setText();/設(shè)置標(biāo)簽b3的內(nèi)容為空/System.out.println(bon);/清空f(shuō)or(int i=0;irow*col;i+)btnsi.setText();/設(shè)置所有的雷區(qū)的雷按鈕的內(nèi)容為空btnsi.setEnabled(true);/設(shè)置所有雷按鈕可用,也就是可以單擊的狀態(tài)for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/初始化數(shù)組a所有元素為0值/產(chǎn)生隨機(jī)數(shù),隨機(jī)數(shù)的作用用于布雷時(shí)隨機(jī)的指定雷所在的位置,for(int i=0;ibon;i+) int p=1;int m=(int)(Math.random()*row*col);/產(chǎn)生一個(gè)0-雷按鈕數(shù)的整數(shù)while(p=1) int l=1; int j;for( j=0;ji&l=1;j+)/遍歷數(shù)組,查看m值是否已經(jīng)產(chǎn)生過(guò)了,如果數(shù)組a1中已經(jīng)有m值,重新產(chǎn)生m值,如果沒(méi)有產(chǎn)生m值,那么將m值賦值給a1的第i+1個(gè)元素,這樣就可以保證bon個(gè)雷在雷區(qū)的不同位置 if(a1j=m) m=(int)(Math.random()*row*col); l=0; if(j=i)a1i=m;p=0;b1.setText(bon+);b2.setText(0);/布雷 for(int i=0;ibon;i+)在雷區(qū)中布bon個(gè)雷,雷對(duì)應(yīng)位置的元素指定為100 int x=(a1i/col+1); int y=(a1i%col+1);axy=100;/布雷的位置的值為100 for(int i=0;irow+2;i+) for(int j=0;jcol+2;j+) if(i=0|j=0|i=row+1|j=col+1) aij=0; /指定雷區(qū)四周位置的值為0 for(int i=1;i=row;i+) for(int j=1;j=col;j+) if(aij!=100)/如果aij不等與100,就說(shuō)明這個(gè)位置的雷按鈕不是地雷,是安全的,但是安全的按鈕上通常是要顯示該按鈕附近有幾個(gè)雷的,下面的代碼就是判斷該按鈕周圍有幾個(gè)雷的,那么這個(gè)aij就用來(lái)表示對(duì)應(yīng)的雷區(qū)按鈕周圍雷的個(gè)數(shù) for(int l=j-1;l=600)/如果該值大于600,則定時(shí)器停止timer.stop();elset+;/如果t小

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論