




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、PAGE 面向對象程序設計課程設計報告題 目: 掃雷游戲設計 院 (系): 計算機與電子系 專業班級: 計算機科學與技術0903班 學生姓名: = 學 號: = 指導教師: = 20 12 年 6 月 4 日至20 12 年 6 月 15 日華中科技大學武昌分校制 面向對象程序設計 課程設計任務書一、設計(調查報告/論文)題目掃雷游戲設計二、設計(調查報告/論文)主要內容內容:Windows系統提供的掃雷游戲是一個很有趣的游戲。這里使用Java語言編寫一個與其類似的掃雷游戲。 基本功能與要求:1掃雷游戲分為初級,中級和高級三個級別,掃雷英雄榜存儲每個級別的最好成績,即挖出全部的地雷且用時最少者
2、。游戲菜單可以選擇“初級”,“中級”和“高級”或“查看英雄榜”。2選擇級別后將出現相應級別的掃雷區域,這時用戶使用鼠標左鍵單擊雷區中的任何一個方塊啟動計時器。3用戶要揭開某個方塊,可單擊它。若所揭方塊下有雷,用戶便輸了這一局,若所揭方塊下無雷,則顯示數字,該數字代表方塊周圍的八個方塊中共有多少顆雷。4如果用戶認為某個方塊下埋有地雷,單擊右鍵可以在方塊上標識一個用戶認為是雷的圖標,即給出一個掃雷標記。用戶每標記出一個掃雷標記(無論用戶標記是否正確),程序將顯示剩余雷數減少一個。5. 掃雷勝利后(用時最少者),程序彈出保存成績對話框。三、原始資料1.面向對象程序設計課程設計指導書2. 耿祥義JAV
3、A大學實用教程北京:清華大學出版社,2009四、要求的設計(調查/論文)成果1.課程設計報告2.課程設計軟件五、進程安排布置任務,查找資料、需求分析1天總體設計1天詳細設計1.5天編制源程序實現3.5天測試與修改1天撰寫課設報告2天六、主要參考資料1 張廣彬. Java課程設計案例精編(第二版).北京:清華大學出版社, 2011. 2 耿祥義. Java課程設計(第二版).北京:清華大學出版社, 2008.3 耿祥義JAVA大學實用教程北京:清華大學出版社,20094 鄒林達陳國君 Java2程序設計基礎北京:清華大學出版社,20105 鄒林達Java2程序設計基礎實驗指導北京:清華大學,20
4、10指導教師(簽名): 20 年 月 日目 錄1需求與總體設計11.1需求分析11.2總體設計12詳細設計42.1 MineGame類42.2 MineArea類52.3 Block類62.4 BlockView類72.5 LayMines類82.6 Record類82.7 ShowRecord類92.8 userDifine類93編碼實現113.1 MineGame類113.2 MineArea類143.3 Block類173.4 BlockView類183.5 LayMines類193.6 Record類203.7 ShowRecord類213.8 userDifine類244系統測試26
5、總結30PAGE - 31 -1需求與總體設計1.1需求分析1.11掃雷游戲概述掃雷是一種具有迷惑性的對記憶和推理能力的簡單測試,它是長久以來最受歡迎的 Windows 游戲之一。游戲目標:找出空方塊,同時避免觸雷。1.1.2掃雷的操作方法游戲主區域由很多個方格組成。使用鼠標隨機點擊一個方格,方格即被打開并顯示出方格中的數字;方格中數字則表示其周圍的8個方格隱藏了幾顆雷;如果點開的格子為空白格,即其周圍有0顆雷,則其周圍格子自動打開。例如,方格中出現1,說明上下左右及斜角合計有一顆雷,依次類推,2則有2顆,3則有3顆。1.1.3游戲具有的功能 = 1 * ROMAN I.能夠顯示主菜單和界面游
6、戲需要提供主菜單讓玩家進行游戲設置,同時能夠顯示當前剩余的地雷數量及當前花費時間等相關信息到界面上。 = 2 * ROMAN II.能夠接收鼠標輸入功能能夠接收玩家的鼠標輸入功能,左鍵和右鍵輸入。 = 3 * ROMAN III. 能夠根據規則翻轉相應的格子翻動指定位置的格子。 = 4 * ROMAN IV. 能夠標示指定格子的功能即能夠對確定或者懷疑是地雷的格子進行旗子和?符號的標示。 = 5 * ROMAN V.游戲勝負判斷功能當玩家單擊的格子中有地雷時,判定玩家失敗,游戲結束。當掃雷游戲中全部格子被打開時,判定玩家成功。 = 6 * ROMAN VI英雄榜記錄更新當有玩家把當前等級的地雷
7、全部掃出來后,并且時間比記錄中的時間短時,在結束游戲時,要求玩家把名字保存下來。游戲初始時時間為999秒。例如,當第一個玩家把全部地雷掃出來的時間為120秒,這時玩家的記錄時間將被保存下來并作為記錄時間線。直到有玩家的時間少于120秒,才能更新當前記錄時間線并保存玩家的名字。1.2總體設計在設計掃雷游戲時,需要編寫8個Java源文件:MineGame.java、MineArea.java、Block.java、BlockView.java、userDefine.java、LayMines.java、Record.java和ShowRecord.java.掃雷游戲除了需要編寫上述8個Java源文
8、件所給出的類外,還需要Java系統提供的一些重要的類,例如File、JButton和JLabel等類。掃雷游戲所用到的一些重要的類以及之間的組合關系如圖1-1所示,系統功能圖如圖1-2所示。Block圖1-1 類之間的組合關系MineGameFileShowRecordMineAreaRecordBlockViewLayMinesJButtonJLabeluserDefine幫助圖1-2 功能圖掃雷游戲主界面重新開始關于掃雷游戲低級中級高級英雄榜開始退出自定義1.2.1 MineGame.java(主類)MineGame類負責創建掃雷游戲主窗口,該文件含有main方法。掃雷游戲從該類開始執行。
9、1.2.2 MineArea.javaMineArea類創建的對象是MineArea類最重要的成員之一,代表“掃雷區域”。1.2.3 Block.javaBlock類是雷區中“方塊”的類封裝,含有關于“方塊”的屬性以及操作,即負責為雷區創建代表“方塊”的Block對象。1.2.4 BlockView.javaBlockView是JPanel容器的子類,BlockView創建的對象負責為Block對象提供視圖,以方便用戶通過該視圖與Block對象交互。1.2.5 LayMines.javaLayMine類對象不需要視圖,在游戲中不需要看見該類。LayMine對象使用隨機算法指定MineArea對
10、象中的哪些Block對象是雷,哪些Block對象不是雷。1.2.6 Record.javaRecord類是JDialog對話框的子類,對用戶掃雷成功時,Record對象負責保存用戶的成績到文件。1.2.7 ShowRecord.javaShowRecord類是JDialog對話框的子類,當用戶查看掃雷的最好成績時,ShowRecord對象負責提供讀取文件數據的界面。1.2.8 userDefine 類userDefine 類是JDialog對話框的子類,當用戶想自定義掃雷難度時,ShowRecord對象負責設置用戶想要的難度設置。2詳細設計2.1 MineGame類MineGame類是java
11、x.swing包中JFrame的一個子類,并實現了ActionListener接口。標明該類的只要成員變量和方法的UML圖如圖2-1所示。JFrameActionListenerMineGamebar: JMenuBar;fileMenu, heipMenu: JMenu開始,初級,中級,高級,英雄榜,自定義,退出,關于:JMenuItemmineArea: MineArea英雄榜: FileshowHeroRecord: ShowRecordMineGame(): 無類型actionPerformed(ActionEvent)main(String): void圖2-1 MineGame類的
12、UML圖以下是UML圖中有關數據和方法的詳細說明。成員變量bar和fileMenu提供菜單操作,單擊游戲菜單項為“開始”、“初級”、“中級”、“高級”、“掃雷英雄榜”、“自定義”和“退出”。單擊幫助菜單項為“關于”。mineArea是掃雷區域,提供有關掃雷的主要功能。“英雄榜”負責存放三個級別的掃雷最好成績。showHeroRecord負責顯示英雄榜中的數據。方法MineGame()是構造方法,負責完成窗口的初始化。ActionPerformed(ActionEven)方法是MineGame類實現的ActionListener接口中的方法,該方法負責執行菜單發出的有關命令。用戶選擇菜單中的菜單
13、項可觸發ActionEvent事件,導致actionPerformed(ActionEvent)方法執行相應的操作,例如將mineArea創建的雷區設置為初級、中級、高級。main(String)方法是程序運行的入口方法。2.2 MineArea類MineArea類是javax.swing包中JPanel容器的子類,實現了ActionListener和MouseListener接口,所創建的對象:mineArea是MineGame類中最重要的成員之一,作為一個容器添加到MineGame窗口的中心。標明MineArea類的主要成員變量、方法以及和MineGame類之間組合關系的UML圖如圖2-2
14、所示。MineArearow,colum,mineCount,markMount: int lay: LayMinesblock:Block record: RecordblockView:BlockViewresStart: JButtonshowTime: JTextFieldtime: TimershowMarkedMineCount: JTextFieldinitMineArea(int,int,int,int): void show(int m,int n):voidactionPerformed(ActionEvent ): void inquireWin(): voidmouse
15、Pressed(MouseEvent): voidJPanelActionListenerMouseListenerMineGamemineArea:MineArea圖2-2 MineArea類的UML圖以下是UML圖中有關數據和方法的詳細說明。成員變量a. Block是Block類型的數組,用來確定雷區有多少需進行掃雷的方塊。b. blockView是Blockview類型的數組,負責為block數組中的Block對象提供視圖。c. Lay是LayMines類型的對象,負責設置block數組中的哪些方塊是雷或不是雷。d. Record負責提供保存成績的界面,是一個對話框,默認不可見。用戶只有
16、掃雷成功后(用時最少),才能看見該對話框。e. reStart是一個按鈕對象,用戶單擊它重新開始游戲。f. time是計時器對象,負責計算用戶的用時。2)方法A. initMineArea(int,int,int,int)方法可根據參數提供的數據設置雷區的寬度,高度,雷的數目以及雷區的級別。B. actionPerformed(ActionEvent)是MIneArea類實現ActionListener接口中的方法。當用戶單擊blockView中的某個方塊時,actionPerformed(ActionEvent)方法負責執行有關算法,例如,當用鼠標左鍵單擊方塊上的按鈕后,若該方塊下有雷,ac
17、tionPerformed(ActionEvent)方法將使用戶輸掉本局,若該方塊下又雷,actionPerformed(ActionEvent)方法將顯示BlockView對象中的標簽,該標簽上是一個數字,該數字代表當前方塊的周圍的8個方塊中總共有多少顆雷。C. show()方法是一個遞歸方法。actionPerformed(ActionEvent)方法執行時將調用show方法進行掃雷。D. mousePress(MouseEvent)方法是MineArea類實現的MouseListener接口中的方法,當用戶按下鼠標右鍵時,mousePress(MouseEvent)方法負責讓方塊上顯示一
18、個探雷標記。E. inquireWin()方法用來判斷用戶是否掃雷成功,如果成功該方法負責讓record對話框可見。所謂掃雷成功是指不僅找到了全部的雷而且用時最少。2.3 Block類 Block對象負責封裝雷區中方塊中的數據以及對這些數據的操作,外觀效果由Blockview負責提供(見后面的BlockView)。Block類創建的對象是數組block的單元的對象。Block型數組block是MineArea類的重要成員之一。標明Block類的主要成員變量和方法以及和MineArea類之間的組合關系的UML圖如下圖2-3所示。圖2-3 Block類的UML圖以下是UML圖中有關數據的方法的詳細
19、說明。1)成員變量a. name是方塊上的名字。b. aroundMineNumber是方塊周圍雷的數目。c. mineIcon是方塊上雷的圖標。d. sMine用來表示方塊是否是雷。e. isMark用來表示方塊是否被標記。f. isOpen用來表示方塊是否被挖開。2)方法A. setAroundMineNumber(int)方法用來設置aroundMineNumber的值。B. getAroundMineNumber()方法用來獲取aroundMineNumber的值。2.4 BlockView類BlockView創建的對象負責為Block對象提供視圖,以便用戶通過該視圖與Block對象交
20、互。BlockView對象使用一個標簽和按鈕為Block對象提供視圖,標簽和按鈕按著卡片布局層疊在一起,默認狀態按鈕遮擋住標簽。當用戶單擊按鈕后,如果Block對象時雷,BlockView對象中的標簽顯示的事雷的圖標;如果Block對象不是雷,標簽顯示的是周圍雷的總數。BlockView類是javax。swing包中JPanel類的一個子類,創建的對象是數組blockView的單元中的對象。BlockView型數組BlockView是MineArea類的重要成員之一。標明BlockView類的主要成員變量和方法以及和MineArea類之間的組合關系的UML圖如圖2-4所示。圖2-4 Block
21、View類的UML圖以下是UML圖中有關數據的方法的詳細說明。1)成員變量a. blockNameOrIcon用來顯示Block對象的name,number和mineIcon屬性。b. blockCover用來遮擋blockNameOrIcon。c. card卡片布局。2)方法A. giveView(Block block)方法給參數指定的Block對象提供視圖,如果Block對象的isMine屬性為true,即方塊是雷,那么blockNameOrIcon標簽上設置的文本就是Block對象的name屬性的值,同時blockNameOrIcon標簽上設置的圖標就是Block對象的mineIcon
22、指定的圖標。如果Block對象的isMine屬性為false,blockNameOrIcon標簽上設置的圖標就是Block對象的aroundMineNumber屬性的值,及周圍雷的數目B. seeblockNameOrIcon()方法讓用戶看見視圖中的標簽,無法看見按鈕。C. seeblockNameOrIcon(0方法讓用戶看見視圖中的按鈕,無法看見標簽。2.5 LayMines類 LayMines對象使用隨機算法制定MineArea對象中的哪些Block對象是雷,哪些對象不是雷,沒有可現實的效果圖。LayMines創建的對象Lay是MineArea中的重要成員,表明該類的主要成員變量和方法
23、以及和MineArea類之間組合關系的UML圖如圖2-5所示。圖2-5 LayMines類的UML圖以下是UML圖中有關數據的方法的詳細說明。1)成員變量 mineIcon用來存放一個格式為gif的圖像。2)方法layMinesForBlock(Block,in)方法對參數指定的Block數組進行設置,其中int參數指定雷的數目,當指定Block數組中每個單元中的方塊是雷時,就將該房快上的圖標設置為mineIcon,當指定Block數組中每個單元中的方塊不是雷時,就將該方塊的名字設置為周圍的雷的數目。2.6 Record類Record創建的對象負責提供保存成績的界面。Record是javax。
24、swing包中jDialog對話框的子類,并實現了ActionListener接口。Record創建的對象:record是MineArea類的成員之一,當用戶掃雷成功時,該對象提供了保存成績到文件的界面。標明Record類的主要成員變量,方法以及和MineArea類之間組合關系的UML圖如圖2-6所示。圖2-6 Record類的UML圖以下是UML圖中有關數據的方法的詳細說明。1)成員變量textName提供用戶掃雷優勝者輸入姓名用戶單擊”確定“按鈕,可以保存成績2)方法actionPerformed(ActionEvent)方法是Record類實現的ActionListener接口中的方法,
25、當用戶單擊”確定“按鈕后,該方法被執行,所執行的操作就是獲取用戶輸入的名字和用時然后調用writeRecord(String,String)方法將信息寫入”英雄榜“中。writeRecord(String,String)方法負責將有關信息掃雷用時,掃雷級別,掃雷優勝者姓名等心思寫入到”英雄榜“文件。2.7 ShowRecord類ShowRecord創建的對象負責提供顯示成績的界面。ShowRecord是javax。swing包中JDialog對話框的子類,并實現了ActionListener接口。ShowReacord創建的對象showHeroRecord是MineGame類的成員之一,當用戶
26、選擇查看英雄榜“菜單項時,該對話框可見,提供了查看掃雷的最好成績的界面。標明ShowRecord類的主要成員變量,方法以及和MineGame類之間組合關系的UML圖如圖2-7所示。圖2-7 ShowRecord類的UML圖以下是UML圖中有關數據的方法的詳細說明。成員變量File存放文件的引用用戶單擊”顯示成績“按鈕,可以查看各個級別掃雷的最好成績。用戶單擊”重新計分“按鈕,可以將”英雄榜“中的成績恢復為初始值。2)方法actionPerformed(ActionEvent)方法是ShowRecord類實現的ActionListener接口中的方法,當用戶單擊”顯示成績“按鈕后,該方法被執行,
27、所執行的操作就是調用readAndShow()方法。readAndShow()方法負責讀取存放在文件中的各個級別的掃雷最好成績以及掃雷者姓名,并顯示這些相關信息。2.8 userDefine 類userDefine是java.awt包中Rame框架的子類,并實現了ActionListener接口。userDefine創建的對像:usedefine是MineArea類的成員之一,當用戶點擊菜單欄中的游戲-自定義時,彈出界面,在界面的文本框中輸入相應的數字。然后單擊確定即可,或者單擊取消退出界面。標明userDefine類的主要成員變量、方法以及和MineArea類之間的組合關系的UML圖如圖2-
28、8所示。JFrameActionListeneruserDefinerow,colum,mineCount,score: JLableex1,ex2,ex3,ex4: JLablerow1,colum1, mineCount1,score1:JTextFieldcon1,con2,con3,con4: JPanel確定,取消:JButtonactionPerformed(ActionEvent)setVisible(boolean) : void圖2-8 userDefine類的UML圖MineAreauserdefin: userDefine以下是UML圖中有關數據和方法的詳細說明。1)成員
29、變量a. row,colum,mineCount,score:分別用來顯示行數,列數,雷數,分數b. row1,colum1, mineCount1,score1:用來自定義雷區的長度值,寬度值,所有的雷數值以及每贏一局所得的分數c. ex1,ex2,ex3,ex4::用來說明上述內容d. con1,con2,con3,con4:用來裝Label 和TextFiled,以方便布局e. 確定,取消;單擊“確定”后,如果輸入的內容合法,就會實現自定義的雷區,如果不合法的話,就會彈出一個警告框,提示輸入有誤;單擊“取消”退出自定義窗口。2)方法 actionPerformrd(ActonEvent)
30、方法是userDefine類中實現的ActionListener接口中的方法,當用戶單擊界面的“確定”,該方法被執行,所執行的操作就是,將用戶輸入的信息傳入程序,實驗自定義雷區的難度級別。當用戶單擊界面的“取消”,該方法被執行,所執行的操作就是,退出用戶自定義界面。3編碼實現各個類的的主要源代碼實現如下:3.1 MineGame.java(主類)import java.awt.event.*;/包含事件類import java.awt.*;/包含抽象窗口工具集中的圖形文本、窗口GUI類import javax.swing.*;/包含SWING組件import javax.swing.Box.F
31、iller;import javax.swing.border.*;/包含布局類import java.util.*;/包含有用的數據類型類import java.util.List;import java.io.*;/包含輸入流和輸出流類import javax.swing.ImageIcon;/包含圖標public class MineGame extends JFrame implements ActionListener JMenuBar menubar; /負責創建菜單條 JMenuItem 開始,初級,中級,高級,掃雷英雄榜,自定義,退出,關于;/負責創建菜單項 JMenu fil
32、eMenu,helpMenu;/負責創建菜單 ImageIcon app;/負責創建標題欄的圖標 JLabel l1,l2,l3,l4; JTextArea ta; MineArea mineArea=null; File 英雄榜=new File(英雄榜.txt);/創建文件保存記錄 Hashtable hashtable=null; ShowRecord showHeroRecord=null; userDefine userdefine=new userDefine();/調用userDefine類 MineGame() mineArea=new MineArea(8,8,10,1);
33、add(mineArea,BorderLayout.CENTER); app=new ImageIcon(app.gif);/給標題欄創建圖標 setIconImage(app.getImage();/獲取圖標并調用類實現 setTitle(掃雷); /加入標題字段 menubar=new JMenuBar();/創建菜單條 JMenu fileMenu=new JMenu(游戲(G);/創建菜單 JMenu helpMenu=new JMenu(幫助(H);/創建菜單 fileMenu.setMnemonic(G); helpMenu.setMnemonic(H); 開始=new JMenu
34、Item(開始);/創建菜單項 開始.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0);/添加快捷方式 初級=new JMenuItem(初級); 中級=new JMenuItem(中級); 高級=new JMenuItem(高級); 掃雷英雄榜=new JMenuItem(掃雷英雄榜); 掃雷英雄榜.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,0); 自定義=new JMenuItem(自定義,KeyEvent.VK_S); 自定義.setAccelerator(Key
35、Stroke.getKeyStroke(KeyEvent.VK_F5,0); 退出=new JMenuItem(退出); 關于 = new JMenuItem(關于); 關于.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0); fileMenu.add(開始); /加入菜單的容器 fileMenu.addSeparator();/加入分隔符 fileMenu.add(初級); fileMenu.add(中級); fileMenu.add(高級); fileMenu.addSeparator(); fileMenu.add(掃雷英雄榜
36、); fileMenu.addSeparator(); fileMenu.add(自定義); fileMenu.addSeparator(); fileMenu.add(退出); helpMenu.add(關于); menubar.add(fileMenu);/加入菜單條的容器 menubar.add(helpMenu); setJMenuBar(menubar);/完成封裝 /添加事件監聽器 開始.addActionListener(this); 初級.addActionListener(this); 中級.addActionListener(this); 高級.addActionListe
37、ner(this); 掃雷英雄榜.addActionListener(this); 自定義.addActionListener(this); 退出.addActionListener(this); 關于.addActionListener(this); /設置英雄榜 hashtable=new Hashtable(); hashtable.put(初級,初級#+999+#匿名); hashtable.put(中級,中級#+999+#匿名); hashtable.put(高級,高級#+999+#匿名); if(!英雄榜.exists() try FileOutputStream out=new
38、FileOutputStream(英雄榜); ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(hashtable); objectOut.close(); out.close(); catch(IOException e) showHeroRecord=new ShowRecord(this,hashtable); setBounds(100,100,300,300); setVisible(true);/設為可見 setDefaultCloseOperation(JFrame.EX
39、IT_ON_CLOSE);/結束窗體所在的應用程序 validate(); /負責執行菜單發出的有關命令public void actionPerformed(ActionEvent e) if(e.getSource()=開始) mineArea.initMineArea(8,8,10,1);/默認為初級 if(e.getSource()=初級) mineArea.initMineArea(8,8,10,1); setBounds(100,100,300,300); mineArea.showTime.setText(0); mineArea.time.stop(); if(e.getSou
40、rce()=中級) mineArea.initMineArea(16,16,40,2); setBounds(100,100,500,500); mineArea.showTime.setText(0); mineArea.time.stop(); if(e.getSource()=高級) mineArea.initMineArea(22,22,99,3); setBounds(100,100,650,650); mineArea.showTime.setText(0); mineArea.time.stop(); if(e.getSource()=掃雷英雄榜) if(showHeroReco
41、rd!=null) showHeroRecord.setVisible(true); if(e.getSource()=自定義) userdefine.setVisible(true); if(e.getSource()=退出) System.exit(0); if(e.getSource()=關于) JDialog dialog=new JDialog(); dialog.setTitle(關于幫助); FlowLayout fl=new FlowLayout(); dialog.setLayout(fl); dialog.setSize(500,500); dialog.setVisibl
42、e(true); String s=掃雷游戲的規則如下:; final JLabel l1 = new JLabel(); l1.setText(s); l1.setForeground(new Color(0,0,0); l1.setFont(new Font(Dialog,10,20); / l1.setBounds(60,84,345,26); final JLabel l2 = new JLabel(1,游戲區包括雷區、地雷計數器和計時器.); final JLabel l3 = new JLabel(2,通過單擊即可挖開方塊,如果挖開的是地雷,則您輸掉游戲.); final JLab
43、el l4 = new JLabel(3,如果方塊上出現數字,表示在其周圍的八個方塊中共有多少顆地雷); dialog.add(l1); dialog.add(l2); dialog.add(l3); dialog.add(l4); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); if(dialog!=null) dialog.setVisible(true); validate(); public static void main(String args) MineGame mg = new MineGame();3.2 MineArea.ja
44、vapublic MineArea(int row,int colum,int mineCount,int grade) reStart=new JButton(重新開始); mark=new ImageIcon(flag.gif); /探雷標記 time=new Timer(1000,this); showTime=new JTextField(3); showMarkedMineCount=new JTextField(3); showTime.setHorizontalAlignment(JTextField.CENTER); showMarkedMineCount.setHorizon
45、talAlignment(JTextField.CENTER); showMarkedMineCount.setFont(new Font(Arial,Font.BOLD,16); showTime.setFont(new Font(Arial,Font.BOLD,16); showTime.setEditable(false);/不可更改 showMarkedMineCount.setEditable(false); pCenter=new JPanel();/創建面板 pSouth=new JPanel(); la1 = new JLabel(new ImageIcon(app.gif);
46、 la2 = new JLabel(new ImageIcon(time.gif); pCenter.setBorder(BorderFactory.createLoweredBevelBorder(); lay=new LayMines(); initMineArea(row,colum,mineCount,grade); /初始化雷區 reStart.addActionListener(this); pSouth.add(la1); pSouth.add(showMarkedMineCount); pSouth.add(reStart); pSouth.add(showTime); pSo
47、uth.add(la2); setLayout(new BorderLayout(); add(pSouth,BorderLayout.SOUTH); add(pCenter,BorderLayout.CENTER); public void initMineArea(int row,int colum,int mineCount,int grade) pCenter.removeAll(); spendTime=0; markMount=mineCount; this.row=row; this.colum=colum; this.mineCount=mineCount; this.grad
48、e=grade; block=new Blockrowcolum; for(int i=0;irow;i+) for(int j=0;jcolum;j+) blockij=new Block(); lay.layMinesForBlock(block,mineCount); blockView=new BlockViewrowcolum; pCenter.setLayout(new GridLayout(row,colum); for(int i=0;irow;i+) for(int j=0;jcolum;j+) blockViewij=new BlockView(); blockViewij
49、.giveView(blockij); /給blockij提供視圖 pCenter.add(blockViewij); blockViewij.getBlockCover().addActionListener(this); blockViewij.getBlockCover().addMouseListener(this); blockViewij.seeBlockCover(); blockViewij.getBlockCover().setEnabled(true); blockViewij.getBlockCover().setIcon(null); showMarkedMineCou
50、nt.setText(+markMount); validate(); /當用戶單擊BlockView中的某個方塊時,執行有關算法 public void actionPerformed(ActionEvent e) /點擊Block方塊區域 if(e.getSource()!=reStart&e.getSource()!=time) time.start(); /開始計時 int m=-1,n=-1; for(int i=0;irow;i+) for(int j=0;jcolum;j+) if(e.getSource()=blockViewij.getBlockCover() m=i; n=
51、j; break; /鼠標左鍵單擊方塊上的按鈕, if(blockmn.isMine() /如果該方塊有雷,則用戶輸掉本局 for(int i=0;irow;i+) for(int j=0;j0&blockmn.getIsOpen()=false) /周圍有雷 blockViewmn.seeBlockNameOrIcon(); blockmn.setIsOpen(true); return; else if(blockmn.getAroundMineNumber()=0&blockmn.getIsOpen()=false)/周圍沒有雷 blockViewmn.seeBlockNameOrIco
52、n(); blockmn.setIsOpen(true); for(int k=Math.max(m-1,0);k=Math.min(m+1,row-1);k+) for(int t=Math.max(n-1,0);t=Math.min(n+1,colum-1);t+) show(k,t); public void mousePressed(MouseEvent e) JButton source=(JButton)e.getSource(); for(int i=0;irow;i+) for(int j=0;j=1) blockNameOrIcon.setText(+n); if(n=1)
53、blockNameOrIcon.setForeground(new Color(255,0,0); if(n=2) blockNameOrIcon.setForeground(new Color(0,0,255); if(n=3) blockNameOrIcon.setForeground(new Color(0,255,0); if(n=4) blockNameOrIcon.setForeground(new Color(125,200,200); if(n=5) blockNameOrIcon.setForeground(new Color(200,0,50); else/周圍沒有雷 bl
54、ockNameOrIcon.setText( ); public void seeBlockNameOrIcon()/只能看見視圖中的標簽 card.show(this,view); validate(); public void seeBlockCover()/只能看見視圖中的按鈕 card.show(this,cover); validate(); public JButton getBlockCover() return blockCover; 3.5 LayMines.java/使用隨機算法指定MineArea對象中的哪些Block對象是雷,哪些不是public class LayMi
55、nes ImageIcon mineIcon=new ImageIcon(app.gif); /創建雷的圖標 public void layMinesForBlock(Block block,int mineCount) int row=block.length; int column=block0.length; LinkedList list=new LinkedList(); for(int i=0;irow;i+) for(int j=0;j0) int size=list.size(); / list返回節點的個數 int randomIndex=(int)(Math.random(
56、)*size); Block b=list.get(randomIndex); b.setIsMine(true); b.setMineIcon(mineIcon); list.remove(randomIndex); /list刪除索引值為randomIndex的節點 mineCount-; for(int i=0;irow;i+) for(int j=0;jcolumn;j+) if(blockij.isMine()/該方塊設為雷,在該方塊上設置圖標 blockij.setIsOpen(false); blockij.setIsMark(false); else /該方塊設為不是雷,設置周
57、圍雷的數目 int mineNumber=0; for(int k=Math.max(i-1,0);k=Math.min(i+1,row-1);k+) for(int t=Math.max(j-1,0);t=Math.min(j+1,column-1);t+) if(blockkt.isMine() mineNumber+; blockij.setIsOpen(false); blockij.setIsMark(false); blockij.setName(+mineNumber); blockij.setAroundMineNumber(mineNumber); 3.6 Record.ja
58、va/提供保存成績的界面 public Record() setTitle(記錄你的成績);/新界面的標題 this.time=time; this.grade=grade; setBounds(100,100,240,160); setResizable(false); setModal(true); 確定=new JButton(確定); 取消=new JButton(取消); textName=new JTextField(8); textName.setText(匿名); 確定.addActionListener(this); 取消.addActionListener(this); C
59、ontainer con = getContentPane(); con.setLayout(new GridLayout(2,1); label=new JLabel(您現在是.高手,輸入您的大名上榜); con.add(label); JPanel p=new JPanel(); p.add(textName); p.add(確定); p.add(取消); con.add(p); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); public void setGrade(String grade) this.grade=grade; label
60、.setText(您現在是+grade+高手,輸入您的大名上榜); public void setTime(int time) this.time=time; public void actionPerformed(ActionEvent e) if(e.getSource()=確定) message=grade+#+time+#+ +textName.getText(); key=grade; writeRecord(key,message); setVisible(false); if(e.getSource()=取消) setVisible(false); public void wri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五三方借款及保證協議
- 臨時工程合同樣本
- 個人木炭售賣合同樣本
- 勞動派遣用工合同范例
- 親子超市采購合同樣本
- 專利權質押合同二零二五年
- 二零二五公司自然人借款合同
- 個人購車借款合同樣本
- 統編版語文四年級上冊第五單元教學設計
- 中醫館改造合同標準文本
- 2023公路橋梁鋼結構防腐涂裝技術條件
- (13)-2.7科學把握理想與現實的辯證統一
- Unit5Poems單元分析講義高中英語人教版選擇性
- 260噸汽車吊地基承載力驗算
- 青島版六年級數學上冊 (完美的圖形)教學課件(第1課時)
- 2022新能源光伏發電工程竣工決算報告模板
- 2023超星爾雅《創新創業》答案
- 110kV變電站短路電流計算書
- 船舶帶纜知識學習
- 2023年湖北省武漢市中考英語真題(含答案)
- 全面地476種食物升糖指數一覽表
評論
0/150
提交評論