java連連看課程設計_第1頁
已閱讀1頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  摘要</b></p><p>  關鍵字:發(fā)展,java,連連看,程序設計;</p><p>  現(xiàn)代科學技術的發(fā)展,改變了人類的生活,作為新世紀的大學生,應該站在時代發(fā)展的前沿,掌握現(xiàn)代科學技術知識,以適應社會的發(fā)展,能夠獨立完成面臨的任務,作一名有創(chuàng)新意識的新型人才。</p><p>  Java語言的學習熱潮

2、并沒有因為時間的推移而消退,相反,由于計算機技術的發(fā)展所帶來的新應用的出現(xiàn),Java越來越流行,這種情況是以往程序設計語言在其生存周期內所不多見的。Java語言之所以這樣長盛不衰,一是因為其眾多的技術特點與現(xiàn)今的應用十分合拍,可以覆蓋大部分的需求;二是因為SUN公司不斷推出新的版本,完善Java自身的功能。有了這兩點,Java語言成為程序員首選的程序設計開發(fā)工具就在情理之中了。</p><p>  連連看游戲是一

3、種很流行的小游戲,記得在小時候去游戲廳玩的時候就有兩臺專門的連連看的機器(當然當時不叫這個名字),一個是連麻將牌、另一個是連水果圖片。當時的麻將牌分好幾層,相鄰層的牌還可以連,看得人眼花繚亂。作為一個java初學者,我所編輯的“悠嘻猴連連看”小游戲,只有幾個基本功能:“開始”“再來一局”炸彈“重新開始”“退出”。我所選中給出的游戲界面很漂亮,不過似乎圖形只有一層,而且數(shù)量也不是很多,只有64張圖,降低了不少難度。</p>

4、<p><b>  目 錄</b></p><p><b>  摘要I</b></p><p>  第1章 需求分析1</p><p>  1.1 功能分析1</p><p><b>  1.2 流程圖2</b></p><p>

5、;  第2章 詳細設計3</p><p>  2.1課程設計目的3</p><p>  2.2 課程設計的實驗環(huán)境3</p><p>  2.3 課程設計的預備知識3</p><p>  2.4 課程設計要求3</p><p>  2.5 連連看算法設計4</p><p>  2.6

6、類的實現(xiàn)方法4</p><p>  2.6.1 成員變量4</p><p>  2.6.2 方法設計5</p><p>  第3章 測試分析7</p><p>  3.1程序運行情況7</p><p>  3.2測試計劃及分析9</p><p>  3.2.1檢驗的先后順序9<

7、;/p><p>  3.2.2程序異常處理9</p><p>  第4章 課程設計總結10</p><p><b>  附件A1</b></p><p>  參考資料錯誤!未定義書簽。</p><p>  第1章 需求分析 </p><p><b>  1

8、.1 功能分析</b></p><p>  每次用戶選擇兩個圖形,如果圖形滿足一定條件(兩個圖形一樣,且這兩個圖形之間存在轉彎少于3的路徑),則兩個圖形都能消掉。給定任意具有相同圖形的兩個格子,我們需要尋找這兩個格子之間在轉彎最少的情況下,經(jīng)過格子數(shù)目最少的路徑。如果這個最優(yōu)路徑的轉彎數(shù)目少于3 ,則這兩個格子可以消去。</p><p>  將界面中相同的猴子圖片消去,游戲限時

9、1000秒,如果在規(guī)定的時間內沒有完成,就會跳出對話框“笨蛋!游戲時間到!GAME OVER ?。?!”的字樣。如果玩家贏了這局,還沒有過癮的話,可以單擊“再來一局”。判斷游戲是否結束。如果所有圖形全部消去,或者游戲玩家不可能再消去任意兩個格子的時候,游戲應該結束。后一種情況,我們稱之為“死鎖”。</p><p>  在死鎖的情況下,我們也可以暫時不終止游戲,而是隨機打亂局面,使得打破“死鎖”局面。不管怎樣,我們需

10、要判別游戲當前狀態(tài)是否為“死鎖”狀態(tài)。我們首先思考問題:怎么判斷兩個圖形能否相消?前面分析中,我們已經(jīng)知道,兩個圖形能夠相消,當且僅當這兩個圖形相同,且它們之間存在路徑轉彎數(shù)目小于3。</p><p>  因此,我們主要需要解決的問題還是,怎樣求出相同圖形之間的最短路徑?這個最短的路徑,我們首先需要保證轉彎數(shù)目最少。在轉彎數(shù)目最少的情況下,經(jīng)過的格子數(shù)目要盡可能地少。</p><p>  

11、在經(jīng)典的最短路問題中,我們需要求出經(jīng)過格子數(shù)目最少的路徑。而這里,要保證轉彎數(shù)目最少,需要把最短路問題的目標函數(shù)修改為從一個點到另一個點的轉彎次數(shù)。雖然,目標函數(shù)修改了,但算法的框架仍然可以保持不變。廣度優(yōu)先搜索是解決經(jīng)典最</p><p>  短路問題的一個思路。我們看看在新的目標函數(shù)(轉彎數(shù)目最少)下,如何用廣度優(yōu)先搜索來解決圖形A(x1,y1)和圖形B(x2,y2)之間的最短路問題。</p>

12、<p><b>  1.2 流程圖</b></p><p><b>  第2章 詳細設計</b></p><p><b>  2.1課程設計目的</b></p><p>  《JAVA程序設計》是計算機相關專業(yè)的必修專業(yè)基礎課程,其實踐性、應用性很強。實踐教學環(huán)節(jié)是必不可少的一個重要環(huán)節(jié)。本

13、課程的程序設計專題實際是計算機相關專業(yè)學生學習完《JAVA程序設計》課程后,進行的一次全面的綜合訓練,JAVA程序設計的設計目的是加深對理論教學內容的理解和掌握,使學生較系統(tǒng)地掌握程序設計及其在網(wǎng)絡開發(fā)中的廣泛應用,基本方法及技巧,為學生綜合運用所學知識,利用軟件工程為基礎進行軟件開發(fā)、并在實踐應用方面打下一定基礎。</p><p>  2.2 課程設計的實驗環(huán)境</p><p>  硬件

14、要求能運行Windows 9.X操作系統(tǒng)的微機系統(tǒng)。JAVA程序設計語言及相應的集成開發(fā)環(huán)境,UltraEdit-32開發(fā)工具。</p><p>  2.3 課程設計的預備知識</p><p>  熟悉JAVA語言及UltraEdit-32開發(fā)工具。</p><p>  2.4 課程設計要求</p><p>  按課程設計指導書提供的課題,要

15、求學生在自行完成各個操作環(huán)節(jié),并能實現(xiàn)且達到舉一反三的目的,完成一個項目解決一類問題。要求學生能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、設計和解答類似問題;對此能夠較好地理解和掌握,能夠進行簡單分析和判斷;能編寫出具有良好風格的程序;掌握JAVA程序設計的基本技能和面向對象的概念和方法;了解多線程、安全和網(wǎng)絡等編程技術。同時培養(yǎng)學生進行分析問題、解決問題的能力;培養(yǎng)學生進行設計分析、設計方法、設計操作與測試、設計過程的觀察、

16、理解和歸納能力的提高。</p><p>  2.5 連連看算法設計</p><p>  在檢驗兩個方塊能否消掉的時候,我們要讓兩個方塊同時滿足兩個條件才行,就是兩者配對并且連線成功。</p><p>  * 分3種情況:(從下面的這三種情況,我們可以知道,需要三個檢測,這三個檢測分別檢測一條直路經(jīng)。這樣就會有三條路經(jīng)。若這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線(

17、兩個轉彎點)把兩個按鈕連接起來了)</p><p><b>  * 1.相鄰 </b></p><p>  * 2. 若不相鄰的先在第一個按鈕的同行找一個空按鈕。1).找到后看第二個按鈕橫向到這個空按鈕所在的列是否有按鈕。2).沒有的話再看第一個按鈕到與它同行的那個空按鈕之間是否有按鈕。3).沒有的話,再從與第一個按鈕同行的那個空按鈕豎向到與第二個按鈕的同行看是否有

18、按鈕。沒有的話路經(jīng)就通了,可以消了. </p><p>  * 3.若2失敗后,再在第一個按鈕的同列找一個空按鈕。1).找到后看第二個按鈕豎向到這個空按鈕所在的行是否有按鈕 2).沒有的話,再看第一個按鈕到與它同列的那個空按鈕之間是否有按鈕。3).沒有的話,再從與第一個按鈕同列的那個空按鈕橫向到與第二個按鈕同列看是否有按鈕。沒有的話路經(jīng)就通了,可以消了。</p><p>  * 若以上三

19、步都失敗,說明這兩個按鈕不可以消去。</p><p><b>  2.6類的實現(xiàn)方法</b></p><p>  2.6.1 成員變量</p><p>  成員變量也叫類的屬性,一般帶有訪問控制屬性的,而全局變量雖然也有類的屬性,但全局變量嚴重影響了封裝和模塊化,一般的全局變量前面要加上static和 fina屬性其中,static使該變量任何

20、類都可用(方法 ClassName.全局變量名) ,而 fina則使得變量不可更改,基本上算是常量了,這也在一定程度上防止對變量的非法修改。</p><p>  表 2-6-1 成員變量 </p><p>  2.6.2 方法設計</p><p>  方法名稱為任何合乎語法的識別字,返回值類型是方法執(zhí)行結果返回給調用者的數(shù)據(jù)類型,void表示沒有返回值,參數(shù)行(p

21、arameter list)是調用時給予的參數(shù)聲明,兩個以上的參數(shù)聲明以逗號隔開,若沒有參數(shù)則參數(shù)行為空白,調用時每一個參數(shù)對應一個參數(shù)值(argument)大括號內為方法本體,也稱為方法程序模塊(block),包含聲明(declarations)和語句(statements),聲明也可以摻雜在語句之間。一個方法不能聲明在另一個方法內。</p><p>  表 2-6-2 方法定義</p>

22、;<p><b>  第3章 測試分析</b></p><p><b>  3.1程序運行情況</b></p><p>  連連看游戲規(guī)則很簡單,就是點中兩個互相匹配并且可以通過不多于兩個折點的折線連在一起的方塊后,這兩個方塊就可以消掉。</p><p><b>  圖1初始界面</b>

23、</p><p>  菜單選項中,包括“開始游戲”、“重新開始”、“炸彈”、“退出”功能。</p><p>  當選擇炸彈功能時:每次含有三個炸彈,所炸的位置也是隨機的;</p><p><b>  圖2 游戲界面</b></p><p>  粗略想來,由于用戶每次只能消除一對圖形,即只會用到一個最短路徑,但由于實現(xiàn)并不

24、知道用戶會選擇哪一對圖形,所以需要事先計算出所有可能的最短路徑并保存起來。此外,采用這種方法的話似乎每次用戶消去一對相同圖像之后都需要重新計算出當前所有可能被連接的相同圖形之間最短路徑,這是因為當某些圖像被消去之后可能會產(chǎn)生很多新路徑,而我們又不能確定這些空出來的格子到底能夠影響哪些路徑,所以就只好都重新計算一遍。其缺點很明顯就是每次消去圖形動作之后重新計算所有可能的最短路徑所需要消耗的時間;而該方法的優(yōu)點則是可以很快地判斷兩個相同圖形

25、之間是否存在滿足條件的最短路徑。</p><p>  如果用戶很厲害,每次都能選中可以消除的圖形對,那么用這種方法浪費的時間就會相當可觀,畢竟用戶未選中的其他可以連接的圖形對之間的最短路徑都被浪費掉了;而如果用戶很差勁,每輪選擇的次數(shù)都遠遠大于當前可能的連接數(shù)量時,該方法就會比書中正文提到的方法高效。但這種情況是比較少的,因為在整個游戲中用戶主要是會用眼睛“找”而不是頻繁的用鼠標去“試”。所以總的來看,維護所有最

26、短路徑的方法的效率相對比較低。游戲結束后,在頁面出現(xiàn)對話框,詢問玩家是否進行下一局。</p><p>  3.2測試計劃及分析</p><p>  3.2.1檢驗的先后順序</p><p>  在檢驗兩個方塊能否消掉的時候,我們要讓兩個方塊同時滿足兩個條件才行,就是兩者配對并且連線成功。所以,這里應該先檢驗配對,如果該條件不成立的話,就不要再進行連線檢查了,這樣可以

27、避免很多不必要的復雜運算。當然,如果你在做這個游戲的時候,配對規(guī)則不夠如此簡單的話,那么就看哪個算起來麻煩就把它放在后面。</p><p>  3.2.2程序異常處理</p><p>  本程序沒有涉及到程序的異常處理,只有關于“死鎖”問題,本質上還是判別兩個格子是否可以消去的問題。最直接的方法就是,對于游戲中尚未消去的格子,兩兩都計算一下,它們是否可以消去。此外,從上面的廣度優(yōu)先搜索可以

28、看出,我們每次都是擴展出起始格子A(x1,y1)能夠到達的格子。也就是說,對于每一個格子,我們可以調用一次上面的擴展過程,得到所有可以到達的格子,如果這些格子中有任意一個跟起始格子的圖形一致,則它們可以消去,目前游戲還不是“死鎖”狀態(tài)。</p><p>  第4章 課程設計總結</p><p>  通過這次課程設計還使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所

29、學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,并且還發(fā)現(xiàn)了自己的許多不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。但通過這次課程設計之后,一定把以前所學過的知識重新溫故。</p><p>  我完成了這次JAVA課程設計,不過這只是我學習路上的驛站。我相信我在未來的學習中會記住從本次課程設計

30、中所學到的東西,并將它用到未來的學習中去。在這里謝謝老師的指導,我會更加努力的學習</p><p><b>  附件A</b></p><p>  ********************************************************** </p><p>  * 類名: MainFrame</p>&l

31、t;p>  * 作用: 自定義主類,對鼠標拖拽的初始界面進行聲明* </p><p>  * 繼承的父類: JFrame類 * </p><p>  * 實現(xiàn)的接口: Strings* </p><p>  ********************************************************** </p><p&

32、gt;  import java.awt.*;</p><p>  import javax.swing.*;</p><p>  import cn.elva.Settings;</p><p>  import cn.elva.model.Map;</p><p>  public class MainFrame extends JFra

33、me{</p><p>  private static final long serialVersionUID = 1L;</p><p><b>  //炸彈的次數(shù)</b></p><p>  private int bombCount = Settings.BOMBCOUNT;</p><p>  private

34、JPanel jContentPane = null;</p><p>  private JMenuBar menuBar = null;</p><p>  private JMenu fileMenu = null;</p><p>  private JMenuItem reloadItem = null;</p><p>  pri

35、vate JMenuItem startItem = null;</p><p><b>  //炸彈</b></p><p>  private JMenuItem bombItem = null;</p><p>  private JMenuItem exitItem = null;</p><p>  priva

36、te MapUI mapUI = null;</p><p><b>  // 游戲開始時間</b></p><p>  private long startTime;</p><p><b>  // 結束時間</b></p><p>  private long endTime;</p&g

37、t;<p>  private Timer timer = null;</p><p>  // private JMenuItem ti</p><p>  private JMenuBar initMenuBar(){</p><p>  if (menuBar == null){</p><p>  menuBar = n

38、ew JMenuBar();</p><p>  fileMenu = new JMenu("菜單");</p><p>  startItem = new JMenuItem("開始游戲");</p><p>  startItem.addActionListener(new ActionListener(){</p&

39、gt;<p>  public void actionPerformed(ActionEvent e){</p><p><b>  reload();</b></p><p><b>  }</b></p><p><b>  });</b></p><p> 

40、 reloadItem = new JMenuItem("重新開始");</p><p>  reloadItem.addActionListener(new ActionListener(){</p><p>  public void actionPerformed(ActionEvent e){</p><p><b>  rel

41、oad();</b></p><p><b>  }</b></p><p><b>  });</b></p><p>  bombItem = new JMenuItem("炸彈");</p><p>  bombItem.addActionListener(ne

42、w ActionListener(){</p><p>  public void actionPerformed( ActionEvent e ){</p><p>  if( bombCount==0 ){</p><p>  JOptionPane.showMessageDialog(MainFrame.this,"三枚炸彈已用完!!!"

43、);</p><p>  bombItem.setEnabled(false);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  mapUI.bomb();</p><p>  bombCount--;</

44、p><p><b>  }</b></p><p><b>  });</b></p><p>  exitItem = new JMenuItem("退出");</p><p>  exitItem.addActionListener(new ActionListener(){&l

45、t;/p><p>  public void actionPerformed(ActionEvent e){</p><p>  System.exit(0);</p><p><b>  }</b></p><p><b>  });</b></p><p>  fileMen

46、u.add(startItem);</p><p>  fileMenu.add(reloadItem);</p><p>  fileMenu.add( bombItem );</p><p>  fileMenu.add(exitItem);</p><p>  menuBar.add(fileMenu);</p><

47、p><b>  }</b></p><p>  return menuBar;</p><p><b>  }</b></p><p>  public static void main(String[] args){</p><p>  // 自動生成方法存根</p><

48、;p>  SwingUtilities.invokeLater(new Runnable(){</p><p>  public void run(){</p><p>  MainFrame thisClass = new MainFrame();</p><p>  thisClass.setDefaultCloseOperation(JFrame.EXI

49、T_ON_CLOSE);</p><p>  thisClass.setVisible(true);</p><p><b>  }</b></p><p><b>  });</b></p><p><b>  }</b></p><p>  publ

50、ic MainFrame(){</p><p><b>  super();</b></p><p>  initialize();</p><p><b>  }</b></p><p>  private void initialize(){</p><p>  this

51、.setSize(650, 650);</p><p>  this.setTitle("llk");</p><p>  this.setJMenuBar(initMenuBar());</p><p>  this.setTitle("悠嘻猴連連看");</p><p><b>  }&l

52、t;/b></p><p>  private void reload(){</p><p>  mapUI = new MapUI();</p><p>  startTime = System.currentTimeMillis() / 1000;</p><p>  endTime = startTime + Settings.P

53、ERTIME;</p><p>  jContentPane = new JPanel();</p><p>  jContentPane.setLayout(new BorderLayout());</p><p>  jContentPane.add(mapUI);</p><p>  this.setContentPane(jConte

54、ntPane);</p><p>  this.validate();</p><p>  Map.LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;</p><p>  initTimer();</p><p>  bombItem.setEnabled(true);</p><p

55、>  bombCount=Settings.BOMBCOUNT;</p><p><b>  }</b></p><p>  private void initTimer(){</p><p>  ActionListener actionListener = new ActionListener(){</p><p&

56、gt;  public void actionPerformed(ActionEvent e){</p><p>  startTime = System.currentTimeMillis() / 1000;</p><p>  if (startTime == endTime){</p><p>  JOptionPane.showMessageDialog(M

57、ainFrame.this, "笨蛋!時間到! GAME OVER!!");</p><p>  int result = JOptionPane.showConfirmDialog(MainFrame.this,</p><p>  "重玩一次?", "Again", JOptionPane.YES_NO_CANCEL_OPTI

58、ON);</p><p>  if (result == JOptionPane.YES_OPTION){</p><p><b>  reload();</b></p><p><b>  }</b></p><p><b>  else{</b></p>&l

59、t;p>  jContentPane.setVisible(false);</p><p>  validate();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p

60、><b>  };</b></p><p>  timer = new javax.swing.Timer(1000, actionListener);</p><p>  timer.start();</p><p><b>  }</b></p><p><b>  }</

61、b></p><p>  ********************************************************** </p><p>  * 類名: MapUI</p><p>  * 作用: 定義按鈕和炸彈功能* </p><p>  * 繼承的父類: JPanel類 * </p><p

62、>  * 實現(xiàn)的接口: Stings * </p><p>  ********************************************************** </p><p>  import java.awt.*;</p><p>  import javax.swing.*;</p><p>  import

63、 cn.elva.Settings;</p><p>  import cn.elva.model.ArrayPoint;</p><p>  import cn.elva.model.Map;</p><p>  public class MapUI extends JPanel implements ActionListener{</p><

64、p>  private static final long serialVersionUID = 1L;</p><p>  // 棋子數(shù)組,用按鈕來表示</p><p>  private ChessButton[] chesses = null;</p><p><b>  // 數(shù)據(jù)模型</b></p><p&g

65、t;  private Map map = new Map();</p><p>  // 判斷當前點擊的棋子是否是第二次選中的</p><p>  private boolean two = false;</p><p>  // 前面點的那個棋子</p><p>  private ArrayPoint priviousPoint;<

66、;/p><p>  // 第二次選中的棋子</p><p>  private ArrayPoint currPoint;</p><p><b>  // 構造函數(shù)</b></p><p>  public MapUI(){</p><p><b>  super();</b>

67、</p><p>  initialize();</p><p><b>  }</b></p><p><b>  // 初始化函數(shù)</b></p><p>  private void initialize(){</p><p>  initChesses();</

68、p><p>  GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,</p><p>  Settings.COLUMNS + 2);</p><p>  gridLayout.setHgap(2);</p><p>  gridLayout.setVgap(2);</p>

69、<p>  this.setLayout(gridLayout);</p><p>  this.setSize(300, 200);</p><p>  // 放置按鈕,按行</p><p>  for (int row = 0; row < Settings.ROWS + 2; row++){</p><p>  fo

70、r (int col = 0; col < Settings.COLUMNS + 2; col++){</p><p>  add(chesses[row * (Settings.COLUMNS + 2) + col]);</p><p><b>  }</b></p><p><b>  }</b></p&g

71、t;<p><b>  }</b></p><p>  private void initChesses(){</p><p>  int[][] values = map.getMap();</p><p>  // 初始化棋子,和數(shù)據(jù)模型里保持一樣 </p><p>  this.chess

72、es = new ChessButton[(Settings.ROWS + 2)</p><p>  * (Settings.COLUMNS + 2)];</p><p>  for (int row = 0; row < 10; row++){</p><p>  for (int col = 0; col < 10; col++){</p>

73、;<p>  // 通過二維的數(shù)據(jù)模型坐標得到一維的棋子坐標 </p><p>  int index = row * (Settings.COLUMNS + 2) + col;</p><p>  // 對棋子的數(shù)據(jù)模型,即ArrayPoint對象進行設置,指定此棋子具體的位置和值</p><p>  chesses[index] = n

74、ew ChessButton(row, col, values[row][col]);</p><p><b>  // 添加監(jiān)聽器</b></p><p>  chesses[index].addActionListener(this);</p><p>  // 將外圍的一圈設為不可見,行,列為0 和為最大值的情況</p>&

75、lt;p>  if (row == 0 || row == (Settings.ROWS + 2 - 1) || col == 0</p><p>  || col == (Settings.COLUMNS + 2 - 1)){</p><p>  chesses[index].setVisible(false);</p><p><b>  }&l

76、t;/b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  public void clearCheese(ArrayPoint priviousPoint, ArrayPoint

77、 currPoint){</p><p>  // 處理匹配,看兩點是否聯(lián)通</p><p>  int[][] values = map.getMap();</p><p>  // 將模型中對應的棋子設為0</p><p>  values[priviousPoint.getI()][priviousPoint.getJ()] = 0;&

78、lt;/p><p>  values[currPoint.getI()][currPoint.getJ()] = 0;</p><p>  // 使兩個已經(jīng)消除的按鈕不可見</p><p>  int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)</p><p>  + privio

79、usPoint.getJ();</p><p>  int index2 = currPoint.getI() * (Settings.COLUMNS + 2)</p><p>  + currPoint.getJ();</p><p>  chesses[index1].setVisible(false);</p><p>  chesse

80、s[index2].setVisible(false);</p><p>  // 如果棋子總數(shù)已為0,則程序結束</p><p>  if (map.LEFTCOUNT == 0){</p><p>  JOptionPane.showMessageDialog(this, "恭喜您通過!!");</p><p><

81、;b>  }</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 事件監(jiān)聽器處理函數(shù),也是處理棋子消除的地方</p><p><b>  */</b></p><p>  

82、public void actionPerformed(ActionEvent e){</p><p>  // 獲得當前的柜子</p><p>  ChessButton button = (ChessButton) e.getSource();</p><p>  // 獲得當前棋子的數(shù)據(jù)結構</p><p>  ArrayPoint p

83、 = button.getPoint();</p><p>  // 如果已有兩個棋子選中, 則進行判斷操作</p><p><b>  if (two){</b></p><p>  currPoint = p;</p><p>  if( map.match(this.priviousPoint, this.curr

84、Point)){</p><p>  clearCheese(this.priviousPoint, this.currPoint);</p><p><b>  }</b></p><p>  // 設置為沒有兩個按鈕的選中的狀態(tài)</p><p>  two = false;</p><p>&

85、lt;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  // 將當前點擊的棋子賦給變量priviousPoint</p><p>  this.priviousPoint = p;</p>&

86、lt;p>  // 標志位設為TRUE,用于點擊下個棋子的時候使用</p><p>  two = true;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //炸彈的功能</b></p><

87、;p>  public void bomb(){</p><p>  int[][] values = map.getMap();</p><p>  ArrayPoint p1 = null;</p><p>  ArrayPoint p2 = null;</p><p>  for (int row = 1; row < Se

88、ttings.ROWS + 1; row++){</p><p>  for (int col = 1; col < Settings.COLUMNS + 1; col++){</p><p>  if (values[row][col] != 0){</p><p>  p1 = new ArrayPoint(row, col, values[row][co

89、l]);</p><p>  for (int i = 1; i < Settings.ROWS + 1; i++){</p><p>  for (int j = 1; j < Settings.COLUMNS + 1; j++){</p><p>  if (values[i][j] != 0){</p><p>  p2 =

90、 new ArrayPoint(i, j, values[i][j]);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  continue;</b>&

91、lt;/p><p><b>  }</b></p><p>  if (map.match(p1, p2)){</p><p>  clearCheese(p1, p2);</p><p><b>  return;</b></p><p><b>  }</b&

92、gt;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&

93、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  ********************************************************** </p><p>  * 類名: ChessButton</p>&

94、lt;p>  * 作用: 初始化游戲中鼠標點擊按鈕* </p><p>  * 繼承的父類: JButton類 * </p><p>  * 實現(xiàn)的接口: 沒有 * </p><p>  ********************************************************** </p><p>  impor

95、t java.net.*;</p><p>  import javax.swing.*;</p><p>  import cn.elva.Settings;</p><p>  import cn.elva.model.ArrayPoint;</p><p>  public class ChessButton extends JButt

96、on{</p><p>  protected ArrayPoint point = null;</p><p>  public ChessButton(int row, int col, int value){</p><p>  this(new ArrayPoint(row, col, value));</p><p><b&g

97、t;  }</b></p><p>  public ChessButton(ArrayPoint point){</p><p>  this.point = point;</p><p>  String name ="Resource/"+point.getValue() + Settings.RELEX;</p>

98、<p>  URL url = ChessButton.class.getResource(name);</p><p>  ImageIcon icon = new ImageIcon( url );</p><p>  this.setIcon(icon);</p><p><b>  }</b></p><

99、p>  //構造函數(shù),使用默認值</p><p>  public ChessButton(){</p><p>  this(new ArrayPoint(0, 0, 0));</p><p><b>  }</b></p><p>  //返回當前按鈕代表的位置和值</p><p>  

100、public ArrayPoint getPoint(){</p><p>  return point;</p><p><b>  }</b></p><p>  public void setPoint(ArrayPoint point){</p><p>  this.point = point;</p&g

101、t;<p><b>  }</b></p><p><b>  }</b></p><p>  ********************************************************** </p><p>  * 接口名:Settings*</p><p> 

102、 * 作用: 聲明各個變量大小* </p><p>  ********************************************************** </p><p>  package cn.elva;</p><p>  public interface Settings{</p><p><b>  /

103、/行數(shù)</b></p><p>  public static final int ROWS = 8;</p><p><b>  //列數(shù)</b></p><p>  public static final int COLUMNS=8;</p><p><b>  //圖片后綴名</b>

104、;</p><p>  public static final String RELEX=".gif";</p><p>  //每局所花時間(秒)</p><p>  public static final int PERTIME = 600;</p><p><b>  //判斷的時間間隔</b>

105、</p><p>  public static final int PER = 1;</p><p><b>  //炸彈的使用次數(shù)</b></p><p>  public static final int BOMBCOUNT = 3;</p><p><b>  }</b></p>

106、<p>  ********************************************************** </p><p><b>  * 類名: Map</b></p><p>  * 作用: 連入圖片并聲明游戲規(guī)則* </p><p>  *******************************

107、*************************** </p><p>  package cn.elva.model;</p><p>  import java.util.Random;</p><p>  import cn.elva.Settings;</p><p>  public class Map {</p>

108、<p>  public static int LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;</p><p>  // 讓其最外層的數(shù)據(jù)不顯示,可以解決邊框消除不掉的情況</p><p>  private int[][] map = new int[Settings.ROWS + 2][Settings.COLUMNS + 2];&

109、lt;/p><p>  // 出現(xiàn)的不同圖片個數(shù)</p><p>  private int maxKinds = 4;</p><p>  public Map(){</p><p><b>  init();</b></p><p><b>  }</b></p>

110、<p>  public int[][] getMap(){</p><p>  return map;</p><p><b>  }</b></p><p>  private void init(){</p><p>  int[] tempArr = new int[Settings.ROWS *

111、Settings.COLUMNS];</p><p>  int len = tempArr.length;</p><p>  // 根據(jù)圖片的種類數(shù)來確定數(shù)組大小,如有64張圖片,每四個為一樣的,則需要圖片數(shù)為64/4=16</p><p>  for (int i = 0; i < len / maxKinds; i++){</p><

112、;p>  tempArr[i * 4] = i + 1;</p><p>  tempArr[i * 4 + 1] = i + 1;</p><p>  tempArr[i * 4 + 2] = i + 1;</p><p>  tempArr[i * 4 + 3] = i + 1;</p><p><b>  }</b

113、></p><p>  // 打亂一維數(shù)組內數(shù)據(jù)的排列</p><p>  random(tempArr);</p><p>  // 填充到二維數(shù)組中</p><p>  for (int i = 1; i < Settings.ROWS + 1; i++){</p><p>  for (int j =

114、 1; j < Settings.COLUMNS + 1; j++){</p><p>  this.map[i][j] = tempArr[(i - 1) * Settings.COLUMNS</p><p>  + (j - 1)];</p><p><b>  }</b></p><p><b> 

115、 }</b></p><p><b>  }</b></p><p>  private void random(int[] array){</p><p>  Random random = new Random();</p><p>  int len = array.length;</p>

116、<p>  for (int i = len; i > 0; i--){</p><p>  int j = random.nextInt(i);</p><p>  int temp = array[i - 1];</p><p>  array[i - 1] = array[j];</p><p>  array[j]

117、= temp;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 判斷是否在一條直線上,這里不去比較兩者值是否相等,主要用于后面兩個拐點的情況</p><p&

118、gt;<b>  * p1之前的點</b></p><p>  * p2當前所點的點</p><p>  * true 相通,false 不通</p><p><b>  */</b></p><p>  public boolean oneLineWithoutValue(ArrayPoin

119、t p1, ArrayPoint p2){</p><p>  if (horizonMatch(p1, p2)){</p><p>  return true;</p><p><b>  }</b></p><p>  else if (verticalMatch(p1, p2)){</p><p

120、>  return true;</p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 判斷是否在一條直線上

121、,其中包括了垂直和水平兩種情況</p><p><b>  * p1之前的點</b></p><p>  * p2當前所點的點</p><p>  * true 相通,false 不通</p><p><b>  */</b></p><p>  public bool

122、ean oneLine(ArrayPoint p1, ArrayPoint p2){</p><p>  if (p1.value != p2.value){</p><p>  return false;</p><p><b>  }</b></p><p>  if (oneLineWithoutValue(p1,

123、 p2)){</p><p>  return true;</p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  /**</b></p>

124、<p><b>  * 豎線上的判斷</b></p><p><b>  * p1之前的點</b></p><p>  * p2當前所點的點</p><p>  * true 相通,false 不通</p><p><b>  */</b></p>

125、<p>  public boolean verticalMatch(ArrayPoint p1, ArrayPoint p2){</p><p>  if (p1.j != p2.j){</p><p>  return false;</p><p><b>  }</b></p><p>  if (p1

126、.i > p2.i){</p><p>  ArrayPoint temp = null;</p><p>  temp = p1;</p><p><b>  p1 = p2;</b></p><p>  p2 = temp;</p><p><b>  }</b>&

127、lt;/p><p>  // 之間的相隔的棋子數(shù)</p><p>  int spaceCount = p2.i - p1.i;</p><p>  // 如果相鄰,直接消除</p><p>  if (spaceCount == 1 && p1.value == p2.value){</p><p>  

128、return true;</p><p><b>  }</b></p><p>  for (int i = p1.i + 1; i < p2.i; i++){</p><p>  ArrayPoint point = new ArrayPoint(i, p1.j, map[i][p1.j]);</p><p>

溫馨提示

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

評論

0/150

提交評論