版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 基于JAVA的掃雷小游戲</p><p><b> 引言</b></p><p> 本次課程設(shè)計(jì)目的在于設(shè)計(jì)開(kāi)發(fā)一個(gè)類似windows自帶掃雷游戲的小游戲,實(shí)現(xiàn)基本的掃雷面板及掃雷的游戲功能、游戲數(shù)據(jù)存儲(chǔ)、游戲計(jì)時(shí)等功能。設(shè)計(jì)采用Windows下的eclipse開(kāi)發(fā)工具由本人獨(dú)立完成。</p><p><b>
2、; 系統(tǒng)設(shè)計(jì)</b></p><p> 本游戲采用快速原型模型的軟件開(kāi)發(fā)方法設(shè)計(jì),總共經(jīng)歷了八個(gè)版本的修改最終完成設(shè)計(jì)要求。</p><p> 在第一個(gè)版本中,實(shí)現(xiàn)如下功能:</p><p> 基于JFrame的掃雷框架的建立:</p><p> 使用JFrame建立起如圖的所示的程序框架,雷區(qū)為12*12,添加JPan
3、el和JButton,采用setBounds的布局方式而非內(nèi)置的布局方法。</p><p> 基于Random方法的虛擬雷盤的建立和動(dòng)態(tài)修改:</p><p> 通過(guò)Random產(chǎn)生出一個(gè)14*14的數(shù)組,其中,二維數(shù)組邊緣對(duì)應(yīng)邊框標(biāo)記值為2,產(chǎn)生的雷點(diǎn)標(biāo)記為1,普通點(diǎn)標(biāo)記為0。再次建立一個(gè)12*12的數(shù)組對(duì)應(yīng)實(shí)際的游戲面板,初始值為0,遍歷14*14的數(shù)組中非邊緣的元素,將每個(gè)格子周
4、圍的地雷數(shù)目賦值給對(duì)應(yīng)的12*12數(shù)組,地雷仍然用-1來(lái)表示,最后遍歷12*12的數(shù)組同時(shí)把數(shù)組中非0非-1的數(shù)繪制到JPanel上,值為-1的元素向面板對(duì)應(yīng)位置添加一個(gè)地雷的圖片(注:地雷圖片來(lái)自Windows7自帶掃雷游戲的截圖)。</p><p> 基于Button的雷區(qū)覆蓋面板建立以及虛擬雷盤的ActionListener的連接:</p><p> 將生成好的底板覆蓋上12*1
5、2的Button并且為每個(gè)Button添加ActionListener,實(shí)現(xiàn)點(diǎn)擊后隱藏對(duì)應(yīng)的Button功能。結(jié)果如下圖:</p><p> 重新開(kāi)始及其按鍵功能的實(shí)現(xiàn):</p><p> 通過(guò)“重新開(kāi)始”按鍵重新生成雷區(qū)以及重新覆蓋Button到所有格子。</p><p><b> 關(guān)于按鍵及其功能:</b></p>&l
6、t;p> 通過(guò)“關(guān)于”按鍵彈出一個(gè)MessageDialog。</p><p> 在第二個(gè)版本中,實(shí)現(xiàn)如下功能:</p><p> 新增利用遞歸算法實(shí)現(xiàn)的一次點(diǎn)開(kāi)一片區(qū)域功能:</p><p> 通過(guò)數(shù)據(jù)結(jié)構(gòu)中的走迷宮算法在按鍵監(jiān)聽(tīng)中加入了連鎖點(diǎn)亮的算法,點(diǎn)亮該格,然后依次遍歷12*12表的周圍9格,發(fā)現(xiàn)為空格即遞歸調(diào)用遍歷算法,發(fā)現(xiàn)數(shù)字即點(diǎn)亮該格并r
7、eturn,初步實(shí)現(xiàn)了如圖所示的功能:</p><p> 新增虛擬訪問(wèn)判定表的建立和刷新及修改:</p><p> 即通過(guò)查找已標(biāo)記的正確的雷并且計(jì)數(shù),如果達(dá)到了設(shè)定了雷的最大值即執(zhí)行游戲結(jié)束的方法。</p><p> 新增失敗提示框和自動(dòng)刷新功能:</p><p> 即點(diǎn)亮了地雷的區(qū)域后,自動(dòng)彈出對(duì)話框提示失敗并且執(zhí)行游戲結(jié)束的方法
8、。</p><p> 對(duì)原boom表進(jìn)行了改動(dòng),解決了虛擬表和實(shí)際表的下標(biāo)錯(cuò)位問(wèn)題</p><p> 將原12*12的數(shù)組擴(kuò)充到14*14。</p><p> 在第三個(gè)版本中,實(shí)現(xiàn)如下功能:</p><p> 修復(fù)了一個(gè)導(dǎo)致重新開(kāi)始后第一行雷點(diǎn)位置不變的BUG:</p><p> 重寫游戲結(jié)束的算法,改變循環(huán)
9、的起始點(diǎn),使其可以正確生成虛擬的雷點(diǎn)。</p><p> 新增了右鍵標(biāo)記、取消雷點(diǎn)的功能:</p><p> 為每個(gè)Button添加了MouseListener從而實(shí)現(xiàn)了當(dāng)點(diǎn)擊鼠標(biāo)右鍵時(shí)可以修改Button上文字,顯示為雷,并且當(dāng)該Button已經(jīng)顯示了雷的時(shí)候再次右鍵該Button可以取消文字顯示。</p><p> 在第四個(gè)版本中,實(shí)現(xiàn)如下功能:</
10、p><p> 調(diào)整了按鍵監(jiān)聽(tīng)的點(diǎn)亮區(qū)域算法,當(dāng)且僅當(dāng)點(diǎn)擊處周圍沒(méi)有地雷時(shí)才會(huì)觸發(fā)openButton()算法,否則僅顯示當(dāng)前區(qū)域,提高了游戲性:</p><p> 重寫了Button的ActionListener,按條件區(qū)分是否執(zhí)行遞歸點(diǎn)亮算法,當(dāng)且僅當(dāng)單擊區(qū)域?yàn)榭盏臅r(shí)候才執(zhí)行點(diǎn)亮算法,否則僅點(diǎn)亮該區(qū)域。</p><p> 新增了基于System.currentT
11、imeMillis()的計(jì)時(shí)器功能,計(jì)時(shí)器與重新開(kāi)始游戲?qū)?yīng)同步更新:</p><p> 通過(guò)在游戲開(kāi)始時(shí)獲取一個(gè)currentTimeMillis()以及實(shí)時(shí)監(jiān)控并刷新計(jì)時(shí)器窗口的值為當(dāng)前時(shí)間減去初始時(shí)間除以1000,為節(jié)約內(nèi)存,單獨(dú)為計(jì)時(shí)器開(kāi)辟了一個(gè)線程,每工作一次該線程休息0.5秒。</p><p> 在第五個(gè)版本中,實(shí)現(xiàn)如下功能:</p><p> 更
12、改了獲勝和失敗后的提示信息:</p><p> 將本次游戲時(shí)間加入了游戲結(jié)束時(shí)的提示窗口。</p><p> 新增了“記錄”窗體的框架和面板:</p><p> 增加了一個(gè)新的JFrame,對(duì)應(yīng)“記錄”按鈕。</p><p> 在第六個(gè)版本中,實(shí)現(xiàn)如下功能:</p><p> 再次改進(jìn)了按鍵監(jiān)聽(tīng)的點(diǎn)亮區(qū)域算法
13、:</p><p> 進(jìn)行遞歸遍歷時(shí)將正相鄰和斜相鄰兩種情況分開(kāi),使斜相鄰的地雷值為0的格子不再會(huì)被自動(dòng)點(diǎn)亮,提高了游戲性,至此版本為止,該算法已經(jīng)完全符合預(yù)期要求。</p><p> 游戲后臺(tái)新加入了recordlist類,用來(lái)存儲(chǔ)和處理光榮榜的數(shù)據(jù):</p><p> 該類擁有10條記錄以及插入新數(shù)據(jù)到對(duì)應(yīng)位置的功能。</p><p&g
14、t;<b> 對(duì)記錄窗體的改動(dòng):</b></p><p> 通過(guò)取消設(shè)定recordFrame類的mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);以及設(shè)定recFrame.hide();方法解決了關(guān)閉窗口時(shí)導(dǎo)致的程序異常終止的錯(cuò)誤。</p><p> 在第七個(gè)版本中,實(shí)現(xiàn)如下功能:</p&g
15、t;<p><b> 記錄的讀取與存儲(chǔ):</b></p><p> 通過(guò)ObjectOutputStream和ObjectInputStream成功實(shí)現(xiàn)了對(duì)光榮榜文件的存取功能。并且重新定義了上一版本的光榮榜信息控件,增加了獲勝時(shí)修改光榮榜并且自動(dòng)保存文件的功能,同時(shí)新增nameInput窗口類到游戲結(jié)束時(shí)并且成績(jī)足以進(jìn)入光榮榜時(shí)調(diào)用的方法中,用于輸入獲取進(jìn)入光榮榜的玩家信
16、息。</p><p> 在最終版本中,實(shí)現(xiàn)如下功能:</p><p> 記錄與游戲的同步措施:</p><p> 通過(guò)更改FileOutputStream的實(shí)現(xiàn)位置到nameInputer中的actionListener中并且將recordlist和usedTime以參數(shù)形式通過(guò)構(gòu)造函數(shù)傳入nameInputer類中成功實(shí)現(xiàn)了光榮榜數(shù)據(jù)文件的存取。</p
17、><p><b> 系統(tǒng)實(shí)現(xiàn)</b></p><p><b> Sweeper類:</b></p><p> import java.awt.event.*;</p><p> import javax.swing.*;</p><p> import java.awt
18、.*;</p><p> import java.util.Random;</p><p> import java.io.*;</p><p> public class sweeper{</p><p> Button boom[][] = new Button[14][14];</p><p> int
19、 visualBoom[][] = new int[14][14];</p><p> int visitTest[][] = new int[14][14];</p><p> int numOfBoom = 0;</p><p> Label timeLabel = new Label();</p><p> timeRunnab
20、le runnable = new timeRunnable();</p><p> Thread timeThread = new Thread(runnable);</p><p> long startTime;</p><p> long usedTime;</p><p> JFrame mainframe;</p&g
21、t;<p> myPanel panel;</p><p> Image boomImage = new ImageIcon("boom.jpg").getImage();</p><p> recordlist list = new recordlist();</p><p> JButton startButton;&l
22、t;/p><p> JButton aboutButton;</p><p> JButton recordButton;//類的屬性</p><p> void createWindow(){//創(chuàng)建基礎(chǔ)框架</p><p> mainframe = new JFrame("掃雷");<
23、/p><p> panel = new myPanel();//框架及面板</p><p> startButton = new JButton();</p><p> startButton.setText("重新開(kāi)始");</p><p> startButton.setFont(new Font("
24、;楷書",Font.ITALIC,15));</p><p> startButton.setFocusPainted(false);</p><p> startButton.addActionListener(new startListener());</p><p> aboutButton = new JButton();</p>
25、<p> aboutButton.setText("關(guān)于");</p><p> aboutButton.setFont(new Font("楷書",Font.ITALIC,15));</p><p> aboutButton.setFocusPainted(false);</p><p> aboutB
26、utton.addActionListener(new aboutListener());</p><p> recordButton = new JButton();</p><p> recordButton.setText("記錄");</p><p> recordButton.setFont(new Font("楷書&q
27、uot;,Font.ITALIC,15));</p><p> recordButton.addActionListener(new recordListener());</p><p> recordButton.setFocusPainted(false);//按鈕</p><p> timeLabel.setBounds(350, 220, 30, 3
28、0);</p><p> timeLabel.setBackground(Color.white);</p><p> startTime = System.currentTimeMillis();</p><p> timeThread.start();</p><p> panel.setLayout(null);</p&g
29、t;<p> panel.setBackground(Color.BLACK);</p><p> startButton.setBounds(320, 40, 100, 30);</p><p> panel.add(startButton);</p><p> recordButton.setBounds(320,100,100,30);&
30、lt;/p><p> panel.add(recordButton);</p><p> aboutButton.setBounds(320,160,100,30);</p><p> panel.add(aboutButton);</p><p> panel.add(timeLabel);</p><p>
31、mainframe.setSize(450, 340);</p><p> mainframe.setVisible(true);</p><p> mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p> mainframe.add(panel);//框架布局</p
32、><p><b> }</b></p><p> void setBoom()//生成虛擬雷盤的雷區(qū)</p><p><b> {</b></p><p> for(int row = 0;row<14;row++)</p><p> for(in
33、t col = 0;col<14;col++)</p><p><b> {</b></p><p> boom[row][col] = new Button();</p><p> visualBoom[row][col] = 0;</p><p> }//初始化雷區(qū)</p>
34、<p> for(int i = 0;i<14;i++)</p><p><b> {</b></p><p> visualBoom[0][i] = -2;</p><p> visualBoom[i][0] = -2;</p><p> visualBoom[i][13] = -2;&l
35、t;/p><p> visualBoom[13][i] = -2;</p><p> }//虛擬雷盤封邊</p><p><b> int x,y;</b></p><p> Random r = new Random();</p><p> for(int count
36、= 0;count<16;)</p><p><b> {</b></p><p> x = r.nextInt(12);</p><p> y = r.nextInt(12);</p><p> if(visualBoom[x+1][y+1] == 0)</p><p><b
37、> {</b></p><p> visualBoom[x+1][y+1] = -1;</p><p><b> count++;</b></p><p><b> }</b></p><p><b> }</b></p><p&
38、gt; }//生成地雷,邊緣:-2 雷點(diǎn):-1 正常點(diǎn):0</p><p> void handleBoom(){//炸彈信息轉(zhuǎn)化</p><p> int temp[][] = new int[14][14];</p><p> for(int row = 0;row<14;row++)<
39、/p><p> for(int col = 0;col<14;col++)</p><p><b> {</b></p><p> temp[row][col] = visualBoom[row][col];</p><p><b> }</b></p><p>
40、 for(int row = 1;row<13;row++)</p><p> for(int col = 1;col<13;col++)</p><p><b> {</b></p><p> temp[row][col] = countBoom(row,col);</p><p><b>
41、 }</b></p><p> numOfBoom = 0;</p><p> visualBoom = temp;</p><p><b> }</b></p><p> int countBoom(int x,int y){//周圍炸彈計(jì)數(shù)器</p><p>
42、 int count = 0;</p><p> if(visualBoom[x][y] != -1)</p><p><b> {</b></p><p> if(visualBoom[x-1][y-1] == -1)</p><p><b> count++;</b></p>
43、<p> if(visualBoom[x][y-1] == -1)</p><p><b> count++;</b></p><p> if(visualBoom[x+1][y-1] == -1)</p><p><b> count++;</b></p><p> if(
44、visualBoom[x+1][y] == -1)</p><p><b> count++;</b></p><p> if(visualBoom[x+1][y+1] == -1)</p><p><b> count++;</b></p><p> if(visualBoom[x][y+
45、1] == -1)</p><p><b> count++;</b></p><p> if(visualBoom[x-1][y+1] == -1)</p><p><b> count++;</b></p><p> if(visualBoom[x-1][y] == -1)</p&
46、gt;<p><b> count++;</b></p><p><b> }else</b></p><p> count = -1;</p><p> return count;</p><p> }//雷:-1 雷數(shù):(int) </
47、p><p> void showButton()//加入雷區(qū)按鈕到面板上</p><p><b> {</b></p><p> for(int row = 1;row<13;row++)</p><p> for(int col = 1;col<13;col++)</p>&
48、lt;p><b> {</b></p><p> boom[row][col].setBounds((row-1)*25, (col-1)*25, 25, 25);</p><p> boom[row][col].setFocusable(false);</p><p> boom[row][col].addActionListe
49、ner(new buttomListener(row,col));</p><p> boom[row][col].addMouseListener(new rightClick(row,col));</p><p> panel.add(boom[row][col]);</p><p><b> }</b></p><
50、;p><b> }</b></p><p> class myPanel extends JPanel{//面板內(nèi)部類</p><p> public void paintComponent(Graphics g)</p><p><b> {</b></p><p>
51、 g.setColor(Color.gray);</p><p> g.fillRect(0, 0, 300, 300);</p><p> g.setColor(Color.black);</p><p> for(int line = 0;line<=300;line+=25)</p><p> g.drawLine(li
52、ne, 0, line, 300);</p><p> for(int row = 0;row<=300;row+=25)</p><p> g.drawLine(0, row, 300, row);//繪制基本格</p><p> g.setFont(new Font("楷書",Font.ITALIC,13));</p
53、><p> g.drawString("MineSweeper Ver 3.0", 305, 20);//繪制版本信息</p><p> g.drawString("時(shí)間",310,240);</p><p> for(int row = 1;row<13;row++)</p><p> f
54、or(int col = 1;col<13;col++)</p><p><b> {</b></p><p> if(visualBoom[row][col]!=-1 && visualBoom[row][col]!=0)</p><p> g.drawString(Integer.toString(visualB
55、oom[row][col]), (row-1)*25+8, (col-1)*25+20);</p><p> else if(visualBoom[row][col]==-1) </p><p><b> {</b></p><p> g.drawImage(boomImage,(row-1)*25,(col-1)*25,25,25,th
56、is);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> }//面板繪圖</p><p> class buttomListener impl
57、ements ActionListener{//各種監(jiān)聽(tīng)器</p><p> int row,col;</p><p> buttomListener(int x,int y)</p><p><b> {</b></p><p><b> row = x;</b></p>
58、<p><b> col = y;</b></p><p><b> }</b></p><p> public void actionPerformed(ActionEvent e) {</p><p> if(visualBoom[row][col]==0)</p><p>&
59、lt;b> {</b></p><p> refreshVisitTest();</p><p> openButton(row,col);</p><p> }else if(visualBoom[row][col] != -1)</p><p><b> {</b></p>
60、<p> boom[row][col].setVisible(false);</p><p><b> }else</b></p><p><b> {</b></p><p> boom[row][col].setVisible(false);</p><p> gameOve
61、r(0);</p><p><b> }</b></p><p> numOfBoom = 0;</p><p> for(int row = 1;row<13;row++)</p><p> for(int col = 1;col<13;col++)</p><p> i
62、f(boom[row][col].getLabel() == "雷")</p><p> numOfBoom++;</p><p> if(numOfBoom == 16)</p><p> gameOver(1);</p><p><b> }</b></p><p>
63、;<b> }</b></p><p> class rightClick implements MouseListener{</p><p> int row,col;</p><p> rightClick(int x,int y)</p><p><b> {</b></p&g
64、t;<p><b> row = x;</b></p><p><b> col = y;</b></p><p><b> }</b></p><p><b> @Override</b></p><p> public void
65、 mouseClicked(MouseEvent e) {</p><p> // TODO Auto-generated method stub</p><p> if(e.getButton() == MouseEvent.BUTTON3)</p><p><b> {</b></p><p> if(boo
66、m[row][col].getLabel() != "雷")</p><p><b> {</b></p><p> boom[row][col].setLabel("雷");</p><p> numOfBoom = 0;</p><p> for(int row = 1
67、;row<13;row++)</p><p> for(int col = 1;col<13;col++)</p><p> if(boom[row][col].getLabel() == "雷")</p><p> numOfBoom++;</p><p> if(numOfBoom == 16)&l
68、t;/p><p> gameOver(1);</p><p><b> }</b></p><p><b> else</b></p><p> boom[row][col].setLabel("");</p><p><b> }<
69、/b></p><p><b> }</b></p><p><b> @Override</b></p><p> public void mouseEntered(MouseEvent e) {</p><p> // TODO Auto-generated method stub
70、</p><p><b> }</b></p><p><b> @Override</b></p><p> public void mouseExited(MouseEvent e) {</p><p> // TODO Auto-generated method stub</p&
71、gt;<p><b> }</b></p><p><b> @Override</b></p><p> public void mousePressed(MouseEvent e) {</p><p> // TODO Auto-generated method stub</p>&
72、lt;p><b> }</b></p><p><b> @Override</b></p><p> public void mouseReleased(MouseEvent e) {</p><p> // TODO Auto-generated method stub</p><p&
73、gt;<b> }</b></p><p><b> }</b></p><p> void refreshVisitTest(){//重置訪問(wèn)標(biāo)記表</p><p> for(int row = 1;row<13;row++)</p><p> for(int col
74、 = 1;col<13;col++)</p><p><b> {</b></p><p> visitTest[row][col] = 0;</p><p> }//訪問(wèn)標(biāo)記置0</p><p> for(int i = 0;i<14;i++)</p>
75、<p><b> {</b></p><p> visualBoom[0][i] = 1;</p><p> visualBoom[i][0] = 1;</p><p> visualBoom[i][13] = 1;</p><p> visualBoom[13][i] = 1;</p>
76、<p> }//邊緣訪問(wèn)標(biāo)記置1</p><p><b> }</b></p><p> class startListener implements ActionListener{</p><p> public void actionPerformed(ActionEvent e) {</p&
77、gt;<p> for(int row = 1;row<13;row++)</p><p> for(int col = 1;col<13;col++)</p><p><b> {</b></p><p> boom[row][col].setVisible(true);</p><p&g
78、t; boom[row][col].setLabel("");</p><p> visualBoom[row][col] = 0;</p><p><b> }</b></p><p><b> int x,y;</b></p><p> Random r = new
79、 Random();</p><p> for(int count = 0;count<16;)</p><p><b> {</b></p><p> x = r.nextInt(12);</p><p> y = r.nextInt(12);</p><p> if(visua
80、lBoom[x+1][y+1] == 0)</p><p><b> {</b></p><p> visualBoom[x+1][y+1] = -1;</p><p><b> count++;</b></p><p><b> }</b></p>&l
81、t;p><b> }</b></p><p> handleBoom();</p><p> startTime = System.currentTimeMillis();</p><p> panel.repaint();</p><p> System.out.println(""
82、);</p><p> System.out.println("");</p><p> System.out.println("");</p><p> System.out.println("");</p><p> for(int row = 1;row<13;r
83、ow++)</p><p><b> {</b></p><p> System.out.println(" ");</p><p> for(int col = 1;col<13;col++)</p><p><b> {</b></p><p
84、> if(visualBoom[col][row]!=-1)</p><p> System.out.print(visualBoom[col][row]+" ");</p><p><b> else</b></p><p> System.out.print("* ");</p
85、><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> class recordListener implement
86、s ActionListener{</p><p><b> @Override</b></p><p> public void actionPerformed(ActionEvent arg0) {</p><p> recordFrame rec = new recordFrame();</p><p>
87、rec.createWindow();</p><p><b> }</b></p><p><b> }</b></p><p> class aboutListener implements ActionListener{</p><p> public void actionPerfo
88、rmed(ActionEvent e) {</p><p> JOptionPane.showMessageDialog(mainframe.getContentPane(),"制作人: 濱江學(xué)院2011級(jí)軟件工程1班 王琢", "關(guān)于", JOptionPane.INFORMATION_MESSAGE);</p><p><b>
89、 }</b></p><p><b> }</b></p><p> void openButton(int x,int y){//響應(yīng)鼠標(biāo)事件</p><p> visitTest[x][y] = 1;//訪問(wèn)標(biāo)記置1</p><p> boom[x][y].setVi
90、sible(false);</p><p> if(visualBoom[x][y] != -1)</p><p><b> {</b></p><p> if(visualBoom[x-1][y-1] != -1)</p><p> boom[x-1][y-1].setVisible(false);</p
91、><p> if(visualBoom[x][y-1] == 0 && visitTest[x][y-1] == 0)</p><p> openButton(x,y-1);</p><p> else if(visualBoom[x][y-1] != -1)</p><p> boom[x][y-1].setVisibl
92、e(false);</p><p> if(visualBoom[x+1][y-1] != -1)</p><p> boom[x+1][y-1].setVisible(false);</p><p> if(visualBoom[x+1][y] == 0 && visitTest[x+1][y] == 0)</p><p&
93、gt; openButton(x+1,y);</p><p> else if(visualBoom[x+1][y] != -1)</p><p> boom[x+1][y].setVisible(false);</p><p> if(visualBoom[x+1][y+1] != -1)</p><p> boom[x+1][y
94、+1].setVisible(false);</p><p> if(visualBoom[x][y+1] == 0 && visitTest[x][y+1] == 0)</p><p> openButton(x,y+1);</p><p> else if(visualBoom[x][y+1] != -1)</p><p
95、> boom[x][y+1].setVisible(false);</p><p> if(visualBoom[x-1][y+1] != -1)</p><p> boom[x-1][y+1].setVisible(false);</p><p> if(visualBoom[x-1][y] == 0 && visitTest[x-1
96、][y] == 0)</p><p> openButton(x-1,y);</p><p> else if(visualBoom[x-1][y] != -1)</p><p> boom[x-1][y].setVisible(false);</p><p><b> }else{</b></p>
97、<p> gameOver(0);</p><p><b> }</b></p><p><b> }</b></p><p> class timeRunnable implements Runnable{//計(jì)時(shí)器專用線程</p><p><b> @O
98、verride</b></p><p> public void run() {</p><p> while(true)</p><p><b> {</b></p><p> timeLabel.setText(Long.toString((System.currentTimeMillis()-s
99、tartTime)/1000));</p><p> usedTime = (System.currentTimeMillis()-startTime)/1000 + 1;</p><p><b> try{</b></p><p> Thread.sleep(500);</p><p> }catch(Exce
100、ption ex){</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void gameOver(i
101、nt isWin){//游戲結(jié)束</p><p> if(isWin == 0)</p><p><b> {</b></p><p> JOptionPane.showMessageDialog(mainframe.getContentPane()," 勝敗乃兵家常事,大俠請(qǐng)重新來(lái)過(guò)!\n 本
102、次游戲用時(shí):" + usedTime + "秒", "YouLose!", JOptionPane.INFORMATION_MESSAGE);</p><p> startButton.doClick();</p><p><b> }else{</b></p><p> JOptionP
103、ane.showMessageDialog(mainframe.getContentPane()," 恭喜您!沒(méi)有什么地雷能逃過(guò)您的火眼金睛\n 本次游戲用時(shí):" + usedTime + "秒", "YouWin!", JOptionPane.INFORMATION_MESSAGE);</p><p><b> tr
104、y</b></p><p><b> {</b></p><p> ObjectInputStream in = new ObjectInputStream(new FileInputStream("record.wz"));</p><p> list = (recordlist)in.readObjec
105、t();</p><p> in.close();</p><p> if(usedTime<=list.getLowestScore());</p><p> nameInputer nameinputer = new nameInputer(list,usedTime);</p><p> }catch(Exception
106、e)</p><p><b> {</b></p><p><b> }</b></p><p> startButton.doClick();</p><p><b> }</b></p><p><b> }</b>&
107、lt;/p><p> public static void main(String [] args){</p><p> sweeper main = new sweeper();</p><p> main.setBoom();</p><p> main.handleBoom();</p><p> main
108、.createWindow();</p><p> main.showButton();</p><p> for(int row = 1;row<13;row++)</p><p><b> {</b></p><p> System.out.println(" ");</p&g
109、t;<p> for(int col = 1;col<13;col++)</p><p><b> {</b></p><p> if(main.visualBoom[col][row]!=-1)</p><p> System.out.print(main.visualBoom[col][row]+"
110、");</p><p><b> else</b></p><p> System.out.print("* ");</p><p><b> }</b></p><p><b> }</b></p><p>&
111、lt;b> }</b></p><p><b> }</b></p><p> recordFrame類:</p><p> import java.awt.Graphics;</p><p> import java.awt.event.ActionEvent;</p><
112、;p> import java.awt.event.ActionListener;</p><p> import java.io.*;</p><p> import javax.swing.*;</p><p> public class recordFrame implements Serializable{</p><p&g
113、t; JFrame recFrame;</p><p> recPanel recpanel;</p><p> JButton close = new JButton("關(guān)閉");</p><p> recordlist list;</p><p> void createWindow(){</p>
114、<p> recFrame = new JFrame("光榮榜");</p><p> recpanel = new recPanel();</p><p> recpanel.setLayout(null);</p><p> close.addActionListener(new closeListener());<
115、;/p><p> close.setBounds(50, 230, 80, 20);</p><p> recpanel.add(close);</p><p> recFrame.setSize(200, 300);</p><p> recFrame.setVisible(true);</p><p> re
116、cFrame.add(recpanel);</p><p><b> }</b></p><p> class closeListener implements ActionListener{</p><p><b> @Override</b></p><p> public void
117、actionPerformed(ActionEvent arg0) {</p><p> recFrame.hide();</p><p><b> }</b></p><p><b> }</b></p><p> class recPanel extends JPanel{</p&
118、gt;<p> public void paintComponent(Graphics g){</p><p> g.drawString("姓名", 25, 20);</p><p> g.drawString("耗時(shí)", 125, 20);</p><p><b> try{</b&g
119、t;</p><p> ObjectInputStream in = new ObjectInputStream(new FileInputStream("record.wz"));</p><p> list = (recordlist)in.readObject();</p><p> in.close();</p>&l
120、t;p> for(int pos = 0;pos<10;pos++)</p><p><b> {</b></p><p> g.drawString(list.name[pos], 25, 20*(pos+2));</p><p> g.drawString(Long.toString(list.score[pos]),
121、125, 20*(pos+2));</p><p><b> }</b></p><p> }catch(Exception e){</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b>
122、 }</b></p><p><b> }</b></p><p><b> }</b></p><p> recordList類:</p><p> import java.io.*;</p><p> public class recordlist
123、implements Serializable{//光榮榜存儲(chǔ)類</p><p> public String name[];</p><p> public long score[];</p><p> public recordlist(){//構(gòu)造函數(shù)</p><p> name = new
124、String[10];</p><p> score = new long[10];</p><p> for(int i = 0;i<10;i++)</p><p><b> {</b></p><p> name[i] = "王琢";</p><p> sc
125、ore[i] = 999;</p><p><b> }</b></p><p><b> }</b></p><p> long getLowestScore(){//返回榜內(nèi)最長(zhǎng)時(shí)間</p><p> return score[9];</p><p&
126、gt;<b> }</b></p><p> long getHighestScore(){</p><p> return score[0];</p><p><b> }</b></p><p> void insertValue(String n,long s){//插入
127、新元素</p><p> int i = 0;</p><p> long temp;</p><p> String ntemp;</p><p> while(s>score[i]){</p><p><b> i++;</b></p><p><
128、b> }</b></p><p><b> do{</b></p><p> temp = score[i];</p><p> ntemp = name[i];</p><p> score[i] = s;</p><p> name[i] = n;</p&g
129、t;<p><b> s = temp;</b></p><p> n = ntemp;</p><p><b> i++;</b></p><p> }while(i<10);</p><p><b> }</b></p><
130、p><b> }</b></p><p> nameInputer類:</p><p> import java.awt.event.ActionEvent;</p><p> import java.awt.event.ActionListener;</p><p> import java.io.Fi
131、leOutputStream;</p><p> import java.io.ObjectOutputStream;</p><p> import javax.swing.*;</p><p> public class nameInputer {</p><p> JFrame frame;</p><p&g
132、t; JPanel panel;</p><p> JTextField text;</p><p> JButton button;</p><p> JLabel label;</p><p> String name;</p><p> recordlist mylist;</p>&l
133、t;p> long usedtime;</p><p> nameInputer(recordlist list,long time){</p><p> frame = new JFrame("新紀(jì)錄");</p><p> frame.setSize(300, 180);</p><p> panel
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)-掃雷游戲
- java掃雷游戲課程設(shè)計(jì)
- java課程設(shè)計(jì)--掃雷游戲報(bào)告
- java課程設(shè)計(jì)--基于java的掃雷游戲軟件設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告-掃雷小游戲
- 基于java的掃雷課程設(shè)計(jì)
- 基于java的掃雷課程設(shè)計(jì)
- java掃雷課程設(shè)計(jì)
- java 課程設(shè)計(jì) 掃雷
- java_掃雷游戲課程設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 掃雷游戲課程設(shè)計(jì)報(bào)告
- 掃雷游戲課程設(shè)計(jì)報(bào)告
- 掃雷小游戲課程設(shè)計(jì)
- 掃雷畢業(yè)設(shè)計(jì)---基于java掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的掃雷游戲設(shè)計(jì)與實(shí)現(xiàn)
- android平臺(tái)掃雷游戲課程設(shè)計(jì)
- 基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)
- java課程設(shè)計(jì)--基于java的24點(diǎn)游戲
- vb課程設(shè)計(jì)掃雷游戲的設(shè)計(jì)與開(kāi)發(fā)
- c程序課程設(shè)計(jì)報(bào)告(掃雷游戲)
評(píng)論
0/150
提交評(píng)論