2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  課 程 設(shè) 計(jì) 報(bào) 告</p><p>  課程名稱 Java程序設(shè)計(jì) </p><p>  課題名稱 Hannoi塔 </p><p>  專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 

2、 班 級 </p><p>  學(xué) 號 </p><p>  姓 名 </p><p>  指導(dǎo)教師 </p&

3、gt;<p>  2013 年 6月 27日</p><p>  課 程 設(shè) 計(jì) 任 務(wù) 書</p><p>  課程名稱 Java程序設(shè)計(jì) </p><p>  課 題 Hannoi塔 </p><p>  專業(yè)班級

4、 </p><p>  學(xué)生姓名 </p><p>  學(xué) 號 </p><p>  指導(dǎo)老師 </p><p>  審 批 </p>

5、;<p>  任務(wù)書下達(dá)日期 2013 年 6 月20 日</p><p>  任務(wù)完成日期 2013 年 6 月 27 日</p><p><b>  目錄</b></p><p>  設(shè)計(jì)要求……………………………………………………………1</p><p>  1.1 界面要求………

6、…………………………………………………1</p><p>  1.2 功能要求…………………………………………………………1 </p><p>  總體設(shè)計(jì) ………………………………………………………… 2</p><p>  2.1 總體概述…………………………………………………………2</p><p>  2.2 主要類功能設(shè)計(jì)……………

7、……………………………………3</p><p>  詳細(xì)設(shè)計(jì)……………………………………………………………5</p><p>  3.1 HannoiWindow類 ………………………………………………5</p><p>  3.2 Tower類 …………………………………………………………5</p><p>  3.3 HandleMou

8、se類 …………………………………………………6</p><p>  3.4 AutoMoveDisc類…………………………………………………7</p><p>  3.5 TimeCount類 ……………………………………………………8</p><p>  調(diào)試與結(jié)果分析……………………………………………………9</p><p>  4.1

9、 初級游戲…………………………………………………………9</p><p>  4.2 游戲界面屬性設(shè)置………………………………………………10</p><p>  4.3 游戲外觀設(shè)置……………………………………………………10</p><p>  4.4 自動(dòng)移動(dòng)演示……………………………………………………10</p><p>  設(shè)計(jì)總結(jié)

10、與心得體會………………………………………………12</p><p>  附錄 ……………………………………………………………………13</p><p>  1 參考書………………………………………………………………13</p><p>  2 源代碼………………………………………………………………13</p><p><b>  1

11、 設(shè)計(jì)要求</b></p><p><b>  1.1 界面要求</b></p><p>  用戶界面為GUI界面,其分為菜單欄以及游戲區(qū)兩個(gè)部分。游戲區(qū)中分布有三座Hannoi塔,其名字分別為A、B、C。初始狀態(tài)下A座有三個(gè)大小不等的盤子,其按照從大到小的順序依次擺放在A座上。</p><p><b>  1.2 功能要

12、求</b></p><p>  1.2.1 游戲規(guī)則</p><p>  用戶用鼠標(biāo)選中盤子,然后通過拖動(dòng)鼠標(biāo)來移動(dòng)盤子、釋放鼠標(biāo)來放置該盤子。其中主要的規(guī)則就是:</p><p>  移動(dòng)盤子時(shí),盤子上方必須無盤子</p><p>  放置盤子時(shí),其位置必須在塔點(diǎn)處,而且盤子必須比下方盤子小</p><p&g

13、t;  游戲結(jié)束的條件是:所有的盤子均從A座移到B或C座</p><p>  1.2.2 游戲設(shè)置功能</p><p>  用戶可以通過游戲-》選項(xiàng)來設(shè)置游戲的一些基本的屬性,如是否播放音樂、難度、盤子大小等等</p><p>  1.2.3 游戲幫助功能</p><p>  用戶可以通過菜單欄中的幫助能過初步了解游戲的相關(guān)信息,以及如何操作

14、。其中必須實(shí)現(xiàn)游戲的自動(dòng)完成功能以指導(dǎo)用戶如何操作。</p><p>  1.2.4 游戲外觀設(shè)置功能</p><p>  用戶可以通過游戲-》外觀可以設(shè)置游戲的背景顏色以及盤子的顏色</p><p><b>  2 總體設(shè)計(jì)</b></p><p><b>  2.1 總體概述</b></p

15、><p>  在設(shè)計(jì)Hannoi塔時(shí),需要編寫9個(gè)Java源文件:AutoMoveDisc.java、Disc.java、GameMusic.java、GameSettingS.java、HandleMouse.java、HannoiWindow.java、TimeCount.java、Tower.java、TowerPoint.java。</p><p>  Hannoi塔除了要編寫的10個(gè)

16、Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,如JMenuBar、JMenu、JMenuItem和JButton。Hannnoi塔所用的一些重要的類以及之間的組合關(guān)系如圖2.1 所示:</p><p>  圖2.1 類之間的組合關(guān)系</p><p>  2.2 主要類功能設(shè)計(jì)</p><p>  2.2.1 HannoiWindow.java&l

17、t;/p><p>  HannoiWindows類主要負(fù)責(zé)創(chuàng)建Hannoi塔的主窗口,該類包含main()方法,Hannoi塔從此類開始執(zhí)行。HannoiWindows類的成員變量有五種重要類型對象以及一個(gè)char型數(shù)組。五種重要類型對象為:Tower、JMenuBar、JMenu、JMenuItem和GameSettings 對象。其效果圖2.2如下:</p><p><b>  

18、圖2.2 主界面</b></p><p>  2.2.2 Tower.java</p><p>  Tower.java類是javax.swing.JPanel的子類,創(chuàng)建的容器被添HannoiWindow窗體的中心。Tower類主要的功能是設(shè)置游戲區(qū)的所有組件的位置等相關(guān)信息以及注冊其中的監(jiān)聽器。</p><p>  2.2.3 HandleMouse

19、.java</p><p>  HandleMouse類主要負(fù)責(zé)的是鼠標(biāo)移動(dòng)游戲區(qū)組件所有的事件,其主要實(shí)現(xiàn)了 MouseListener,MouseMotionListener兩個(gè)接口的方法。其所有的移動(dòng)都必須遵守1.2.1的游戲規(guī)則。 </p><p>  2.2.4 AutoMoveDisc.java</p><p>  AutoMoveDisc類是jav

20、ax.swing.JDialog類的子類,其主要的功能是彈出一個(gè)對話框在其中顯示字符移動(dòng)的全過程,與此同時(shí)移動(dòng)游戲區(qū)的盤子直至游戲結(jié)束。其中包含的操作有開始、結(jié)束、繼續(xù)、暫停、保存五大操作。</p><p>  2.2.5 GameSettingS.java</p><p>  GameSettingS類是javax.swing.JFrame類的子類,其主要的功能是彈出一個(gè)界面,其中包含游

21、戲的基本設(shè)置項(xiàng)目,通過此界面的操作來調(diào)整游戲區(qū)的相關(guān)信息。</p><p><b>  3 詳細(xì)設(shè)計(jì)</b></p><p>  3.1 HannoiWindow類 </p><p>  其主要的方法是actionPerformed(ActionEvent e),其是ActionListenter接口的方法的實(shí)現(xiàn)。主要的功能就是監(jiān)聽JMe

22、nuItem對象如gStart等的監(jiān)聽。</p><p><b>  其部分代碼如下:</b></p><p>  else if(e.getSource()==gFColor){</p><p>  Tower.discsColor=JColorChooser.showDialog(this,"請選擇背景色" ,

23、new Color(255,0,0));</p><p>  if(equalsColor()){</p><p>  JOptionPane.showMessageDialog(null, "背景色與盤子顏色相同,設(shè)置無效");</p><p><b>  return;</b></p><p

24、><b>  }</b></p><p>  tower.putDiscOnTower();</p><p><b>  }</b></p><p>  以上代碼是監(jiān)聽到盤子設(shè)置菜單選擇點(diǎn)擊事件,系統(tǒng)彈出一個(gè)顏色的對話框,選擇顏色后通過tower.putDiscOnTower()刷新游戲區(qū)。</p>

25、<p>  3.2 Tower類</p><p>  其UML圖如下圖3.1所示:</p><p>  Tower類中主要的功能就是確定塔、盤子的位置以及畫圖。其中最主要的是位置的確定。其關(guān)鍵代碼如下:</p><p>  //設(shè)置塔點(diǎn)的x,y</p><p>  int vertialDistance=discHeight;<

26、;/p><p>  for(int i=0;i<pointA.length;i++){</p><p>  pointA[i]=new TowerPoint(maxDiscWidth-20,100+vertialDistance);</p><p>  pointB[i]=new TowerPoint(2*maxDiscWidth-20,100+v

27、ertialDistance);</p><p>  pointC[i]=new TowerPoint(3*maxDiscWidth-20,100+vertialDistance);</p><p>  vertialDistance=vertialDistance+discHeight;</p><p><b>  } </b></

28、p><p>  for(int i=0;i<pointA.length;i++){</p><p>  pointA[i].putDisc(discs[i],this);</p><p><b>  }</b></p><p>  其中最主要的是知道Java圖形界面的坐標(biāo)系是采用的是倒坐標(biāo)系,所以pointA或poin

29、tB數(shù)組中最后的一個(gè)TowerPoint對象就是A或B座最底下的一個(gè)盤子的坐標(biāo)</p><p>  3.3 HandMouse類</p><p>  HandMouse的UML類圖為圖3.2 HandMouse類主要處理的是鼠標(biāo)對盤子移動(dòng)。其中主要涉及的是鼠標(biāo)選中 盤子、鼠標(biāo)拖動(dòng)盤子、鼠標(biāo)放置盤子,所以其中主要的方法有三個(gè):(1)

30、 mousePressed(MouseEvent e)(2)mouseDragged(MouseEvent e)(3)mouseReleased(MouseEvent e) ,下面主要介紹一下mousePress(MouseEvent e)方法對鼠標(biāo)選中盤子時(shí)判斷是否可以移動(dòng)時(shí)的處理,其主要代碼如下:</p><p>  for(int i=0;i<pointA.length;i++){</p>

31、<p>  if(pointA[i].equals(startPoint)){</p><p><b>  m=i;</b></p><p>  if((m==0)||(m>0&&!pointA[m-1].haveDisc)){</p><p>  move_flag=true;</p><

32、;p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  以上代碼是判斷選中的盤子是否是A座上的盤子同時(shí)判斷是否可以移動(dòng)?&

33、lt;/p><p>  首先通過if(pointA[i].equals(startPoint))判斷是否相等,如果相等則繼續(xù)判斷盤子是否為最上方的盤子或者盤子的上方無盤子,如果仍成立,則將可移動(dòng)標(biāo)示設(shè)為true。</p><p>  圖3.1 Tower類圖 圖3.2 HandleMouse類圖</p><p>  3.4 AutoMoveDis

34、c類</p><p>  AutoMoveDisc類的UML圖如圖3.3所示</p><p>  AutoMoveDisc類是javax.swing.JDialog的一個(gè)子類,其主要的功能可以參考總體設(shè)計(jì)中2.2主要類的功能設(shè)計(jì)。其中最主要的代碼是計(jì)時(shí)器監(jiān)聽,代碼大致結(jié)構(gòu)如下:</p><p>  public void actionPerformed(Action

35、Event e) {</p><p>  if(e.getSource()==time){</p><p>  //移動(dòng)信息輸入對話框</p><p>  //移動(dòng)游戲區(qū)盤子</p><p><b>  }</b></p><p>  else if(e.getSource()==btn_sta

36、rt){</p><p><b>  //迭代字符串求解</b></p><p>  time.start(); </p><p><b>  }</b></p><p>  else if(e.getSource()==btn_stop){</p><p>  I

37、f(time.isRunning){</p><p>  time.stop();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  其設(shè)計(jì)巧妙的運(yùn)用了javax

38、.management.timer的相關(guān)性質(zhì)。</p><p>  圖3.3 AutoMoveDisc類UML圖</p><p>  3.5 TimeCount類</p><p>  TimeCount類繼承了JLabel類,實(shí)現(xiàn)了Runnale接口。其中主要的方法是run()方法即線程體。其中通過取得系統(tǒng)時(shí)間與記錄的游戲開始時(shí)間的差來刷新其組件上的內(nèi)容。關(guān)鍵代碼結(jié)

39、構(gòu)如下:</p><p>  public void run(){</p><p><b>  if(flag){</b></p><p>  startDate=new Date();</p><p>  flag=false;</p><p><b>  }</b><

40、;/p><p>  While(flag){</p><p>  Date currentDate=new Date();</p><p>  //將currentDatr與startDate之差以為時(shí):分:秒:毫秒:格式轉(zhuǎn)為字符串str</p><p>  lab_time.setText(str);</p><p&g

41、t;<b>  }</b></p><p><b>  } </b></p><p>  其中通過flag來保證能夠獲得用戶用鼠標(biāo)移動(dòng)第一個(gè)盤子的時(shí)間,其中主要涉及的問題是如何保證顯示同步,相關(guān)內(nèi)容在5 設(shè)計(jì)總結(jié)與心得體會有講解。</p><p>  本類主要用在HandleMouse類中,其中控制結(jié)構(gòu)如下:</p&

42、gt;<p>  //通過start_flag控制是否開始進(jìn)程</p><p>  public void mousePressed(MouseEvent e) {</p><p>  if(start_flag){</p><p>  thread=new Thread(runThread);</p><p>  thread

43、.start();</p><p>  start_flag=false;</p><p><b>  }</b></p><p>  //匹配盤子及判斷盤子是否可以移動(dòng)</p><p><b>  }</b></p><p>  public void mouseRelea

44、sed(MouseEvent e) {</p><p>  //判斷游戲是否結(jié)束,如果結(jié)束則停止計(jì)時(shí)線程</p><p>  if(pointB[0].getHaveDisc()||pointC[0].getHaveDisc()){</p><p>  end_flag=true;</p><p>  start_flag=true;<

45、/p><p>  runThread.flag=true;</p><p>  thread.stop();</p><p>  String str=runThread.getLabTime().getText();</p><p>  JOptionPane.showMessageDialog(null, "YOU WIN\n&qu

46、ot;+"用時(shí)"+str);</p><p>  Thread.currentThread().stop();</p><p><b>  }</b></p><p><b>  }</b></p><p>  以上代碼核心為start_flag控制,其他相關(guān)控制在5設(shè)計(jì)總結(jié)和心

47、得體會可以解答。</p><p><b>  4 調(diào)試與結(jié)果分析</b></p><p><b>  4.1 初級游戲</b></p><p>  圖 4.1 初級游戲</p><p>  上圖是游戲難度為初級即盤子數(shù)量為3的Hannoi游戲。從圖中可以看出實(shí)現(xiàn)了游戲的基本規(guī)則以及界面要求還有就是計(jì)

48、時(shí)要求。</p><p>  其中基本規(guī)則在初稿的時(shí)候有一個(gè)很大的Bug,情況如圖4.2</p><p>  圖4.2 規(guī)則Bug</p><p>  其中的現(xiàn)行條件是必須有一步是按規(guī)則玩的。</p><p>  其bug出現(xiàn)的原因是因?yàn)樵诜胖帽P子后沒有將move_flag修改為false.</p><p>  4.2

49、 游戲界面屬性設(shè)置</p><p>  游戲界面屬性設(shè)置主要是采用Checkbox類設(shè)計(jì),其布局管理器為GridBagLayout。鼠標(biāo)點(diǎn)擊游戲-》選項(xiàng)即可出現(xiàn)如圖4.3</p><p><b>  圖 4.3 選項(xiàng)</b></p><p>  其中初稿主要的問題是由于GameSettingS類是JFrame的一個(gè)子類,其 與主窗口為不同的進(jìn)程

50、因此修改的屬性值無法在主窗口中體現(xiàn)出來。后來將游戲區(qū)tower作為參數(shù)傳入直接重繪。</p><p><b>  4.3 外觀設(shè)置</b></p><p>  盤子與背景色的設(shè)置主要是通過JColorChooser.showDialog(</p><p>  component, title, initialColor)方法來設(shè)置的。鼠標(biāo)點(diǎn)擊游

51、戲-》外觀-》背景顏色,如圖4.4選擇顏色,其結(jié)果如圖4.5</p><p>  4.3 自動(dòng)移動(dòng)演示</p><p><b>  如圖4.5</b></p><p>  圖4.4 背景色設(shè)置</p><p>  圖 4.5 自動(dòng)移動(dòng)演示</p><p>  5 設(shè)計(jì)總結(jié)和心得體會</p&

52、gt;<p>  本次課程由于老師已經(jīng)將部分源代碼分發(fā)以及星期一、二的上課,可以說對整個(gè)游戲的結(jié)構(gòu)已經(jīng)比較清晰了。其中主要的問題是數(shù)據(jù)傳遞問題以及線程問題。</p><p>  數(shù)據(jù)傳遞問題在調(diào)試與結(jié)果分析 4.2游戲界面屬性設(shè)置中已經(jīng)提及了,接下來在詳細(xì)的說明。由于GameSettingS與HannoiWindow兩個(gè)類的實(shí)例是兩個(gè)不同的SWI線程,所以其執(zhí)行順序不定,如果只是單純的依賴方法傳遞參

53、數(shù)則極有可能無法進(jìn)行目標(biāo)的數(shù)據(jù)交流,由于兩者操作平臺都是Tower的對象tower,所以可以將其作為兩者的共享數(shù)據(jù),通過此來進(jìn)行數(shù)據(jù)交流,此為簡單的線程間通信。</p><p>  還有時(shí)間計(jì)數(shù)的問題,主要是如在正在游戲是突然間設(shè)置游戲?qū)傩?,則時(shí)間計(jì)數(shù)可能不準(zhǔn)確。如在游戲時(shí)中途設(shè)置游戲難度為中級,在初稿中則會出現(xiàn)計(jì)數(shù)器無法重新計(jì)數(shù)。其中最最要的問題是游戲未至結(jié)束階段,所以時(shí)間計(jì)數(shù)線程仍就并發(fā)的執(zhí)行,所以在設(shè)置難度

54、時(shí)將時(shí)間計(jì)數(shù)線程重置即可。</p><p>  本次課程設(shè)計(jì)中還有一個(gè)問題尚未解決,那就是盤子的大小改變時(shí),如何同時(shí)以適當(dāng)比率改變窗口大小等。二稿中用 ComponentAdapter監(jiān)聽窗口大小,以比率系數(shù)來改變盤子等的大小,但是其中比率系數(shù)以及坐標(biāo)變化等難以確定故放棄。</p><p>  總的來說,在本次課程設(shè)計(jì)中學(xué)到了很多,如StartUML軟件的使用以及如何活用適配器以及監(jiān)聽接口

55、、內(nèi)部類等。</p><p><b>  附錄</b></p><p><b>  1 參考書籍</b></p><p>  [1] 李剛. 瘋狂Java講義[M]. 第二版. 電子工業(yè)出版社, 2012-12.</p><p>  [2] 辛云偉. Java程序設(shè)計(jì)[M]. 第二版. 清華大學(xué)出版

56、社, 2012-3.</p><p>  [3] 張廣彬, 王小寧, 高靜. Java課程設(shè)計(jì)案例精編[M]. 第2版. 清華大學(xué)出版社, 2011-6.</p><p><b>  2 源代碼</b></p><p>  HannoiWindow類</p><p>  public class HannoiWindow

57、 extends JFrame implements ActionListener{</p><p>  private Tower tower;</p><p>  private char [] towerName={'A','B','C'};</p><p>  private JMenuBar bar_hann

58、oi;</p><p>  private JMenugame,surface;</p><p>  private JMenuItem gStart,gSetting,gBColor,gFColor,gExit;</p><p>  private GameSettingS set;</p><p>  private JMenu hel

59、p;</p><p>  private JMenuItem helpword,helpAuto;</p><p>  public HannoiWindow(){</p><p><b>  //設(shè)置游戲界面</b></p><p>  tower=new Tower(towerName);</p>&l

60、t;p>  tower.setMaxDiscWidth(120);</p><p>  tower.setMinDiscWidth(50);</p><p>  tower.setDiscHeight(16);</p><p>  tower.putDiscOnTower();</p><p>  add(tower,BorderLay

61、out.CENTER);</p><p><b>  //游戲下拉欄</b></p><p>  bar_hannoi=new JMenuBar();</p><p>  surface=new JMenu("外觀");</p><p>  game=new JMenu("游戲")

62、;</p><p>  gStart=new JMenuItem("新游戲");</p><p>  gSetting=new JMenuItem("選項(xiàng)");</p><p>  gFColor=new JMenuItem("盤子顏色");</p><p>  gBColor=ne

63、w JMenuItem("背景顏色");</p><p>  gExit=new JMenuItem("退出");</p><p>  surface.add(gFColor);</p><p>  surface.add(gBColor);</p><p>  game.add(gStart);<

64、;/p><p>  game.add(gSetting);</p><p>  game.add(surface);</p><p>  game.add(gExit);</p><p>  bar_hannoi.add(game);</p><p>  gStart.addActionListener(this);<

65、;/p><p>  gExit.addActionListener(this);</p><p>  gBColor.addActionListener(this);</p><p>  gFColor.addActionListener(this);</p><p>  gSetting.addActionListener(this);<

66、/p><p>  set=new GameSettingS(tower,this);</p><p><b>  //幫助下拉欄</b></p><p>  help=new JMenu("幫助");</p><p>  helpword=new JMenuItem("關(guān)于Hannoi"

67、;);</p><p>  helpAuto=new JMenuItem("Hannoi演示");</p><p>  help.add(helpword);</p><p>  help.add(helpAuto);</p><p>  bar_hannoi.add(help);</p><p>

68、  helpword.addActionListener(this);</p><p>  helpAuto.addActionListener(this);</p><p>  setJMenuBar(bar_hannoi);</p><p>  setTitle("漢羅塔");</p><p>  setResizab

69、le(false); </p><p>  setVisible(true);</p><p>  setBounds(60,60,450,450);</p><p>  validate();</p><p>  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); </p>&

70、lt;p><b>  }</b></p><p>  //判斷盤子顏色與背景顏色相同否</p><p>  private boolean equalsColor(){</p><p>  Color back=Tower.towerColor;</p><p>  Color fron=Tower.discsCo

71、lor;</p><p>  int i=back.getRGB();</p><p>  int k=fron.getRGB();</p><p>  if(back.getRGB()==fron.getRGB()){</p><p>  return true;</p><p><b>  }</b

72、></p><p>  return false;</p><p><b>  }</b></p><p><b>  @Override</b></p><p>  public void actionPerformed(ActionEvent e) {</p><p&

73、gt;  if(e.getSource()==gStart){</p><p>  tower.getHandleMouse().setThreadField();</p><p>  tower.putDiscOnTower();</p><p><b>  }</b></p><p>  else if(e.getS

74、ource()==gExit){</p><p>  System.exit(0);</p><p><b>  }</b></p><p>  else if(e.getSource()==gSetting){</p><p>  tower.getHandleMouse().setThreadField();<

75、/p><p>  set.setVisible(true);</p><p><b>  }</b></p><p>  else if(e.getSource()==gBColor){</p><p>  Tower.towerColor=JColorChooser.showDialog(this,"請選擇背景

76、色" ,new Color(255,0,0));</p><p>  if(equalsColor()){</p><p>  JOptionPane.showMessageDialog(null, "背景色與盤子顏色相同,設(shè)置無效");</p><p><b>  return;</b></p>

77、<p><b>  }</b></p><p>  tower.setBackground(Tower.towerColor);</p><p><b>  }</b></p><p>  else if(e.getSource()==gFColor){</p><p>  Tower.d

78、iscsColor=JColorChooser.showDialog(this,"請選擇背景色" ,new Color(255,0,0));</p><p>  if(equalsColor()){</p><p>  JOptionPane.showMessageDialog(null, "背景色與盤子顏色相同,設(shè)置無效");</p>

79、<p><b>  return;</b></p><p><b>  }</b></p><p>  tower.putDiscOnTower();</p><p><b>  }</b></p><p>  else if(e.getSource()==hel

80、pword){</p><p>  tower.getHandleMouse().setThreadField();</p><p>  String help="游戲規(guī)則如下\n下方盤子必須必上方盤子大\n所有盤子從A移B或C則獲勝";</p><p>  JOptionPane.showMessageDialog(null,help);<

81、;/p><p><b>  }</b></p><p>  else if(e.getSource()==helpAuto){</p><p>  tower.getHandleMouse().setThreadField();</p><p>  tower.putDiscOnTower();</p><

82、;p>  int x=this.getBounds().x+this.getBounds().width;</p><p>  int y=this.getBounds().y;</p><p><b>  //設(shè)置對話框位置</b></p><p>  tower.getAutoMoveDisc().setLocation(x,y);&

83、lt;/p><p>  tower.getAutoMoveDisc().setSize(400,this.getBounds().height); </p><p>  tower.getAutoMoveDisc().setVisible(true);</p><p><b>  }</b></p><p><b&g

84、t;  } </b></p><p>  public static void main(String[] args) {</p><p>  HannoiWindow hannoi=new HannoiWindow();</p><p><b>  }</b></p><p><b>  }<

85、;/b></p><p>  TowerPoint類</p><p>  import java.awt.*;</p><p>  import cn.edu.hnie.HannoiV2.Disc;</p><p>  public class TowerPoint {</p><p>  private int

86、 x,y;//坐標(biāo)</p><p>  boolean haveDisc=false;//判斷坐標(biāo)點(diǎn)上是否有盤子</p><p>  Disc disc=null;</p><p>  public TowerPoint(int x,int y){</p><p><b>  this.x=x;</b></

87、p><p><b>  this.y=y;</b></p><p><b>  }</b></p><p>  public void setHaveDisc(boolean flag){</p><p>  haveDisc=flag;</p><p><b>  }

88、</b></p><p>  public boolean getHaveDisc(){</p><p>  return this.haveDisc;</p><p><b>  }</b></p><p>  public int getX(){</p><p><b>

89、  return x;</b></p><p><b>  }</b></p><p>  public int getY(){</p><p><b>  return y;</b></p><p><b>  }</b></p><p>

90、  //判斷兩個(gè)坐標(biāo)點(diǎn)是否相等</p><p>  public boolean equals(TowerPoint p){</p><p>  if(p!=null){</p><p>  if(this.getX()==p.getX()&&this.getY()==p.getY()){</p><p>  return t

91、rue;</p><p><b>  }</b></p><p><b>  }</b></p><p>  return false;</p><p>  }//end_equals</p><p>  public void putDisc(Component com,C

92、ontainer con){</p><p>  disc=(Disc)com;</p><p>  con.setLayout(null);</p><p>  //獲取disc的大小相關(guān)信息</p><p>  int w=disc.getBounds().width; </p><p>  int h=d

93、isc.getBounds().height;</p><p>  disc.setBounds(x-w/2,y-h/2,w,h);</p><p>  con.add(disc);</p><p><b>  //記錄屬性</b></p><p>  haveDisc=true;</p><p>

94、;  disc.setPoint(this);</p><p>  con.validate(); </p><p><b>  }</b></p><p>  public Disc getDiscOnPoint(){</p><p>  return disc;</p><p><b&g

95、t;  } </b></p><p><b>  //移除盤子</b></p><p>  public void removeDisc(Component com,Container con){</p><p>  if(com!=null) </p><p>  con.remove(com);<

96、/p><p>  con.validate(); </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  Disc類</b></p><p>  import java.awt.Color;</p&

97、gt;<p>  import javax.swing.JButton;</p><p>  public class Disc extends JButton{</p><p>  private int large;//盤子的大小</p><p>  private TowerPoint point;//盤子的頂點(diǎn)大小</p&

98、gt;<p>  public Disc(){</p><p>  setBackground(Color.cyan);</p><p><b>  }</b></p><p>  //Setter/Getter方法</p><p><b>  }</b></p><

99、;p>  HandleMouse類</p><p>  import java.awt.*;</p><p>  import javax.swing.*;</p><p>  import cn.edu.hnie.HannoiV2.TowerPoint;</p><p>  import cn.edu.hnie.HannoiV2.Di

100、sc;</p><p>  public class HandleMouse implements MouseListener,MouseMotionListener{</p><p>  TowerPoint [] pointA,pointB,pointC; //柱子上的坐標(biāo)信息</p><p>  TowerPoint startPoint,endPoint;

101、//開始點(diǎn)以及結(jié)束點(diǎn)的位置信息</p><p>  int leftX,leftY,X0,Y0;//坐標(biāo)</p><p>  boolean move_flag=false;</p><p>  Container cont;</p><p>  private Thread thread;</p><p>

102、  private TimeCount runThread;</p><p>  private JPanel pan_time;</p><p>  private boolean start_flag=true;</p><p>  private boolean end_flag=false;</p><p>  public Hand

103、leMouse(Container cont){</p><p>  this.cont=cont;</p><p>  runThread=new TimeCount(cont);</p><p><b>  }</b></p><p>  //PointA,PointB,PointC的Setter方法</p&g

104、t;<p><b>  /*</b></p><p>  * 解決進(jìn)程運(yùn)行過程中由于難度重新選擇的問題</p><p>  * 將進(jìn)程所有的相關(guān)兩重新配置</p><p><b>  * 進(jìn)程重啟</b></p><p><b>  */</b></p>

105、;<p>  public void setThreadField(){</p><p><b>  /*</b></p><p>  * 判斷是否是游戲是否為在計(jì)時(shí)</p><p>  * 但是不為游戲狀態(tài)</p><p><b>  */</b></p><p&

106、gt;  if(thread!=null){</p><p>  end_flag=true;</p><p>  start_flag=true;</p><p>  runThread.flag=true;</p><p>  thread.stop();</p><p><b>  }</b>

107、;</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //鼠標(biāo)事件處理</b></p><p><b>  /*</b></p><p>  * 鼠標(biāo)在組件下按下

108、(non-Javadoc)</p><p>  * 判斷盤子是否可以移動(dòng)</p><p><b>  */</b></p><p>  public void mousePressed(MouseEvent e) {</p><p>  if(start_flag){</p><p>  thre

109、ad=new Thread(runThread);</p><p>  thread.start();</p><p>  start_flag=false;</p><p><b>  }</b></p><p>  Disc disc=null;</p><p>  if(e.getSourc

110、e().getClass()==Disc.class){</p><p>  disc=(Disc)e.getSource();</p><p><b>  }</b></p><p>  startPoint=disc.getPoint();</p><p><b>  /*</b></p&

111、gt;<p>  * 注意此處的賦值采用的是e.getX()</p><p>  * 而非startPoint的原因是此處要取得的是鼠標(biāo)的坐標(biāo)</p><p>  * 如果改成startPoint.getX()則會出現(xiàn)鼠標(biāo)位置與組件差距大</p><p>  * 影響mouseDragged()方法的結(jié)果</p><p><

112、;b>  */</b></p><p>  X0=e.getX();</p><p>  Y0=e.getY();</p><p><b>  int m=0;</b></p><p><b>  /*</b></p><p>  * 判斷組件的坐標(biāo)是否是A

113、處的坐標(biāo)</p><p>  * 如果A處有相匹配的坐標(biāo)</p><p>  * 如果有則進(jìn)一步判斷該盤子上方是否有盤子,如無則move_flag置為true</p><p>  * 如果無則將move_flag置false</p><p><b>  */</b></p><p>  for(i

114、nt i=0;i<pointA.length;i++){</p><p>  if(pointA[i].equals(startPoint)){</p><p><b>  m=i;</b></p><p>  //盤子為A處最頂尖的盤子或者盤子上方無盤子</p><p>  if((m==0)||</p&g

115、t;<p>  (m>0&&!pointA[m-1].haveDisc)){</p><p>  move_flag=true;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }

116、</b></p><p>  }//end_for(pointA)</p><p>  for(int i=0;i<pointB.length;i++){</p><p>  //處理move_flag為true的情況,增進(jìn)算法效率</p><p>  if(move_flag){</p><p>&

117、lt;b>  break;</b></p><p><b>  }</b></p><p>  if(pointB[i].equals(startPoint)){</p><p><b>  m=i;</b></p><p>  if((m==0)||</p><

118、;p>  (m>0&&!pointB[m-1].haveDisc)){</p><p>  move_flag=true;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b>

119、;</p><p>  }//end_for(pointB)</p><p>  for(int i=0;i<pointC.length;i++){</p><p>  //處理move_flag為true的情況,增進(jìn)算法效率</p><p>  if(move_flag){</p><p><b> 

120、 break;</b></p><p><b>  }</b></p><p>  if(pointC[i].equals(startPoint)){</p><p><b>  m=i;</b></p><p>  if((m==0)||</p><p>  (

121、m>0&&!pointC[m-1].haveDisc)){</p><p>  move_flag=true;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p&g

122、t;<p>  }//end_for(pointC)</p><p>  }//end_mousePressed(MouseEvent e)</p><p>  //鼠標(biāo)選中組件并拖動(dòng)信息</p><p>  public void mouseDragged(MouseEvent e){</p><p>  Disc disc=

123、null;</p><p>  disc=(Disc)e.getSource(); </p><p>  leftX=disc.getBounds().x;</p><p>  leftY=disc.getBounds().y;</p><p>  int x=e.getX(); <

124、/p><p>  int y=e.getY();</p><p>  leftX=leftX+x;</p><p>  leftY=leftY+y;</p><p>  if(move_flag==true)</p><p>  disc.setLocation(leftX-X0,leftY-Y0);</p>

125、<p>  }//end_mouseDragged(MouseEvent e)</p><p>  //判斷盤子位置是否可以放置于此</p><p>  public void mouseReleased(MouseEvent e) {</p><p>  Disc disc=null;</p><p>  if(e.getSou

126、rce().getClass()==Disc.class){</p><p>  disc=(Disc)e.getSource();</p><p><b>  }</b></p><p>  //獲得組件范圍,位置不確定</p><p>  Rectangle rect=disc.getBounds();</p&

127、gt;<p>  int x=-1;int y=-1;//確定的塔點(diǎn)坐標(biāo)</p><p>  boolean location=false;</p><p><b>  /*</b></p><p>  *判斷是否可以放在此位置</p><p>  *首先是判斷拖到的終點(diǎn)坐標(biāo)是否為A、B、C的上的一

128、個(gè)塔點(diǎn)</p><p>  *如果是,則判斷其下方無盤子或下方盤子比上方的盤子大,條件成立則移動(dòng),否則將盤子放回原有的地點(diǎn)</p><p>  *如果不是,則將盤子放回原有的坐標(biāo)</p><p><b>  */</b></p><p>  for(int i=0;i<pointA.length;i++){<

129、/p><p>  x=pointA[i].getX();</p><p>  y=pointA[i].getY();</p><p>  //如果塔點(diǎn)坐標(biāo)在此組件的邊界之內(nèi)</p><p>  if(rect.contains(x, y)){</p><p>  endPoint=pointA[i];</p>

130、<p>  //如果塔點(diǎn)坐標(biāo)在最上方且無盤子</p><p>  if((i==pointA.length-1) && !pointA[i].haveDisc){</p><p>  location=true;</p><p><b>  break;</b></p><p><b&g

溫馨提示

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

評論

0/150

提交評論