版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計 報 告</p><p> 課程名稱 Java程序設計 </p><p> 課題名稱 Hannoi塔 </p><p> 專 業(yè) 計算機科學與技術 </p><p>
2、 班 級 </p><p> 學 號 </p><p> 姓 名 </p><p> 指導教師 </p&
3、gt;<p> 2013 年 6月 27日</p><p> 課 程 設 計 任 務 書</p><p> 課程名稱 Java程序設計 </p><p> 課 題 Hannoi塔 </p><p> 專業(yè)班級
4、 </p><p> 學生姓名 </p><p> 學 號 </p><p> 指導老師 </p><p> 審 批 </p>
5、;<p> 任務書下達日期 2013 年 6 月20 日</p><p> 任務完成日期 2013 年 6 月 27 日</p><p><b> 目錄</b></p><p> 設計要求……………………………………………………………1</p><p> 1.1 界面要求………
6、…………………………………………………1</p><p> 1.2 功能要求…………………………………………………………1 </p><p> 總體設計 ………………………………………………………… 2</p><p> 2.1 總體概述…………………………………………………………2</p><p> 2.2 主要類功能設計……………
7、……………………………………3</p><p> 詳細設計……………………………………………………………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> 調試與結果分析……………………………………………………9</p><p> 4.1
9、 初級游戲…………………………………………………………9</p><p> 4.2 游戲界面屬性設置………………………………………………10</p><p> 4.3 游戲外觀設置……………………………………………………10</p><p> 4.4 自動移動演示……………………………………………………10</p><p> 設計總結
10、與心得體會………………………………………………12</p><p> 附錄 ……………………………………………………………………13</p><p> 1 參考書………………………………………………………………13</p><p> 2 源代碼………………………………………………………………13</p><p><b> 1
11、 設計要求</b></p><p><b> 1.1 界面要求</b></p><p> 用戶界面為GUI界面,其分為菜單欄以及游戲區(qū)兩個部分。游戲區(qū)中分布有三座Hannoi塔,其名字分別為A、B、C。初始狀態(tài)下A座有三個大小不等的盤子,其按照從大到小的順序依次擺放在A座上。</p><p><b> 1.2 功能要
12、求</b></p><p> 1.2.1 游戲規(guī)則</p><p> 用戶用鼠標選中盤子,然后通過拖動鼠標來移動盤子、釋放鼠標來放置該盤子。其中主要的規(guī)則就是:</p><p> 移動盤子時,盤子上方必須無盤子</p><p> 放置盤子時,其位置必須在塔點處,而且盤子必須比下方盤子小</p><p&g
13、t; 游戲結束的條件是:所有的盤子均從A座移到B或C座</p><p> 1.2.2 游戲設置功能</p><p> 用戶可以通過游戲-》選項來設置游戲的一些基本的屬性,如是否播放音樂、難度、盤子大小等等</p><p> 1.2.3 游戲幫助功能</p><p> 用戶可以通過菜單欄中的幫助能過初步了解游戲的相關信息,以及如何操作
14、。其中必須實現(xiàn)游戲的自動完成功能以指導用戶如何操作。</p><p> 1.2.4 游戲外觀設置功能</p><p> 用戶可以通過游戲-》外觀可以設置游戲的背景顏色以及盤子的顏色</p><p><b> 2 總體設計</b></p><p><b> 2.1 總體概述</b></p
15、><p> 在設計Hannoi塔時,需要編寫9個Java源文件:AutoMoveDisc.java、Disc.java、GameMusic.java、GameSettingS.java、HandleMouse.java、HannoiWindow.java、TimeCount.java、Tower.java、TowerPoint.java。</p><p> Hannoi塔除了要編寫的10個
16、Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,如JMenuBar、JMenu、JMenuItem和JButton。Hannnoi塔所用的一些重要的類以及之間的組合關系如圖2.1 所示:</p><p> 圖2.1 類之間的組合關系</p><p> 2.2 主要類功能設計</p><p> 2.2.1 HannoiWindow.java&l
17、t;/p><p> HannoiWindows類主要負責創(chuàng)建Hannoi塔的主窗口,該類包含main()方法,Hannoi塔從此類開始執(zhí)行。HannoiWindows類的成員變量有五種重要類型對象以及一個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類主要的功能是設置游戲區(qū)的所有組件的位置等相關信息以及注冊其中的監(jiān)聽器。</p><p> 2.2.3 HandleMouse
19、.java</p><p> HandleMouse類主要負責的是鼠標移動游戲區(qū)組件所有的事件,其主要實現(xiàn)了 MouseListener,MouseMotionListener兩個接口的方法。其所有的移動都必須遵守1.2.1的游戲規(guī)則。 </p><p> 2.2.4 AutoMoveDisc.java</p><p> AutoMoveDisc類是jav
20、ax.swing.JDialog類的子類,其主要的功能是彈出一個對話框在其中顯示字符移動的全過程,與此同時移動游戲區(qū)的盤子直至游戲結束。其中包含的操作有開始、結束、繼續(xù)、暫停、保存五大操作。</p><p> 2.2.5 GameSettingS.java</p><p> GameSettingS類是javax.swing.JFrame類的子類,其主要的功能是彈出一個界面,其中包含游
21、戲的基本設置項目,通過此界面的操作來調整游戲區(qū)的相關信息。</p><p><b> 3 詳細設計</b></p><p> 3.1 HannoiWindow類 </p><p> 其主要的方法是actionPerformed(ActionEvent e),其是ActionListenter接口的方法的實現(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, "背景色與盤子顏色相同,設置無效");</p><p><b> return;</b></p><p
24、><b> }</b></p><p> tower.putDiscOnTower();</p><p><b> }</b></p><p> 以上代碼是監(jiān)聽到盤子設置菜單選擇點擊事件,系統(tǒng)彈出一個顏色的對話框,選擇顏色后通過tower.putDiscOnTower()刷新游戲區(qū)。</p>
25、<p> 3.2 Tower類</p><p> 其UML圖如下圖3.1所示:</p><p> Tower類中主要的功能就是確定塔、盤子的位置以及畫圖。其中最主要的是位置的確定。其關鍵代碼如下:</p><p> //設置塔點的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圖形界面的坐標系是采用的是倒坐標系,所以pointA或poin
29、tB數(shù)組中最后的一個TowerPoint對象就是A或B座最底下的一個盤子的坐標</p><p> 3.3 HandMouse類</p><p> HandMouse的UML類圖為圖3.2 HandMouse類主要處理的是鼠標對盤子移動。其中主要涉及的是鼠標選中 盤子、鼠標拖動盤子、鼠標放置盤子,所以其中主要的方法有三個:(1)
30、 mousePressed(MouseEvent e)(2)mouseDragged(MouseEvent e)(3)mouseReleased(MouseEvent e) ,下面主要介紹一下mousePress(MouseEvent e)方法對鼠標選中盤子時判斷是否可以移動時的處理,其主要代碼如下:</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座上的盤子同時判斷是否可以移動?&
33、lt;/p><p> 首先通過if(pointA[i].equals(startPoint))判斷是否相等,如果相等則繼續(xù)判斷盤子是否為最上方的盤子或者盤子的上方無盤子,如果仍成立,則將可移動標示設為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的一個子類,其主要的功能可以參考總體設計中2.2主要類的功能設計。其中最主要的代碼是計時器監(jiān)聽,代碼大致結構如下:</p><p> public void actionPerformed(Action
35、Event e) {</p><p> if(e.getSource()==time){</p><p> //移動信息輸入對話框</p><p> //移動游戲區(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> 其設計巧妙的運用了javax
38、.management.timer的相關性質。</p><p> 圖3.3 AutoMoveDisc類UML圖</p><p> 3.5 TimeCount類</p><p> TimeCount類繼承了JLabel類,實現(xiàn)了Runnale接口。其中主要的方法是run()方法即線程體。其中通過取得系統(tǒng)時間與記錄的游戲開始時間的差來刷新其組件上的內容。關鍵代碼結
39、構如下:</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之差以為時:分:秒:毫秒:格式轉為字符串str</p><p> lab_time.setText(str);</p><p&g
41、t;<b> }</b></p><p><b> } </b></p><p> 其中通過flag來保證能夠獲得用戶用鼠標移動第一個盤子的時間,其中主要涉及的問題是如何保證顯示同步,相關內容在5 設計總結與心得體會有講解。</p><p> 本類主要用在HandleMouse類中,其中控制結構如下:</p&
42、gt;<p> //通過start_flag控制是否開始進程</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> //匹配盤子及判斷盤子是否可以移動</p><p><b> }</b></p><p> public void mouseRelea
44、sed(MouseEvent e) {</p><p> //判斷游戲是否結束,如果結束則停止計時線程</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;+"用時"+str);</p><p> Thread.currentThread().stop();</p><p><b> }</b></p><p><b> }</b></p><p> 以上代碼核心為start_flag控制,其他相關控制在5設計總結和心
47、得體會可以解答。</p><p><b> 4 調試與結果分析</b></p><p><b> 4.1 初級游戲</b></p><p> 圖 4.1 初級游戲</p><p> 上圖是游戲難度為初級即盤子數(shù)量為3的Hannoi游戲。從圖中可以看出實現(xiàn)了游戲的基本規(guī)則以及界面要求還有就是計
48、時要求。</p><p> 其中基本規(guī)則在初稿的時候有一個很大的Bug,情況如圖4.2</p><p> 圖4.2 規(guī)則Bug</p><p> 其中的現(xiàn)行條件是必須有一步是按規(guī)則玩的。</p><p> 其bug出現(xiàn)的原因是因為在放置盤子后沒有將move_flag修改為false.</p><p> 4.2
49、 游戲界面屬性設置</p><p> 游戲界面屬性設置主要是采用Checkbox類設計,其布局管理器為GridBagLayout。鼠標點擊游戲-》選項即可出現(xiàn)如圖4.3</p><p><b> 圖 4.3 選項</b></p><p> 其中初稿主要的問題是由于GameSettingS類是JFrame的一個子類,其 與主窗口為不同的進程
50、因此修改的屬性值無法在主窗口中體現(xiàn)出來。后來將游戲區(qū)tower作為參數(shù)傳入直接重繪。</p><p><b> 4.3 外觀設置</b></p><p> 盤子與背景色的設置主要是通過JColorChooser.showDialog(</p><p> component, title, initialColor)方法來設置的。鼠標點擊游
51、戲-》外觀-》背景顏色,如圖4.4選擇顏色,其結果如圖4.5</p><p> 4.3 自動移動演示</p><p><b> 如圖4.5</b></p><p> 圖4.4 背景色設置</p><p> 圖 4.5 自動移動演示</p><p> 5 設計總結和心得體會</p&
52、gt;<p> 本次課程由于老師已經(jīng)將部分源代碼分發(fā)以及星期一、二的上課,可以說對整個游戲的結構已經(jīng)比較清晰了。其中主要的問題是數(shù)據(jù)傳遞問題以及線程問題。</p><p> 數(shù)據(jù)傳遞問題在調試與結果分析 4.2游戲界面屬性設置中已經(jīng)提及了,接下來在詳細的說明。由于GameSettingS與HannoiWindow兩個類的實例是兩個不同的SWI線程,所以其執(zhí)行順序不定,如果只是單純的依賴方法傳遞參
53、數(shù)則極有可能無法進行目標的數(shù)據(jù)交流,由于兩者操作平臺都是Tower的對象tower,所以可以將其作為兩者的共享數(shù)據(jù),通過此來進行數(shù)據(jù)交流,此為簡單的線程間通信。</p><p> 還有時間計數(shù)的問題,主要是如在正在游戲是突然間設置游戲屬性,則時間計數(shù)可能不準確。如在游戲時中途設置游戲難度為中級,在初稿中則會出現(xiàn)計數(shù)器無法重新計數(shù)。其中最最要的問題是游戲未至結束階段,所以時間計數(shù)線程仍就并發(fā)的執(zhí)行,所以在設置難度
54、時將時間計數(shù)線程重置即可。</p><p> 本次課程設計中還有一個問題尚未解決,那就是盤子的大小改變時,如何同時以適當比率改變窗口大小等。二稿中用 ComponentAdapter監(jiān)聽窗口大小,以比率系數(shù)來改變盤子等的大小,但是其中比率系數(shù)以及坐標變化等難以確定故放棄。</p><p> 總的來說,在本次課程設計中學到了很多,如StartUML軟件的使用以及如何活用適配器以及監(jiān)聽接口
55、、內部類等。</p><p><b> 附錄</b></p><p><b> 1 參考書籍</b></p><p> [1] 李剛. 瘋狂Java講義[M]. 第二版. 電子工業(yè)出版社, 2012-12.</p><p> [2] 辛云偉. Java程序設計[M]. 第二版. 清華大學出版
56、社, 2012-3.</p><p> [3] 張廣彬, 王小寧, 高靜. Java課程設計案例精編[M]. 第2版. 清華大學出版社, 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> //設置游戲界面</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("選項");</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("關于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, "背景色與盤子顏色相同,設置無效");</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, "背景色與盤子顏色相同,設置無效");</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> //設置對話框位置</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;//坐標</p><p> boolean haveDisc=false;//判斷坐標點上是否有盤子</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、 //判斷兩個坐標點是否相等</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的大小相關信息</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;//盤子的頂點大小</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; //柱子上的坐標信息</p><p> TowerPoint startPoint,endPoint;
101、//開始點以及結束點的位置信息</p><p> int leftX,leftY,X0,Y0;//坐標</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> * 解決進程運行過程中由于難度重新選擇的問題</p><p> * 將進程所有的相關兩重新配置</p><p><b> * 進程重啟</b></p><p><b> */</b></p>
105、;<p> public void setThreadField(){</p><p><b> /*</b></p><p> * 判斷是否是游戲是否為在計時</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> //鼠標事件處理</b></p><p><b> /*</b></p><p> * 鼠標在組件下按下
108、(non-Javadoc)</p><p> * 判斷盤子是否可以移動</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的原因是此處要取得的是鼠標的坐標</p><p> * 如果改成startPoint.getX()則會出現(xiàn)鼠標位置與組件差距大</p><p> * 影響mouseDragged()方法的結果</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> * 判斷組件的坐標是否是A
113、處的坐標</p><p> * 如果A處有相匹配的坐標</p><p> * 如果有則進一步判斷該盤子上方是否有盤子,如無則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的情況,增進算法效率</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的情況,增進算法效率</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> //鼠標選中組件并拖動信息</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;//確定的塔點坐標</p><p> boolean location=false;</p><p><b> /*</b></p><p> *判斷是否可以放在此位置</p><p> *首先是判斷拖到的終點坐標是否為A、B、C的上的一
128、個塔點</p><p> *如果是,則判斷其下方無盤子或下方盤子比上方的盤子大,條件成立則移動,否則將盤子放回原有的地點</p><p> *如果不是,則將盤子放回原有的坐標</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> //如果塔點坐標在此組件的邊界之內</p><p> if(rect.contains(x, y)){</p><p> endPoint=pointA[i];</p>
130、<p> //如果塔點坐標在最上方且無盤子</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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設計報告--hannoi塔
- java課程設計----課程設計報告
- java課程設計報告
- java課程設計報告-
- java課程設計報告
- java課程設計報告
- java課程設計報告--beatbox
- JAVA課程設計報告.doc
- java語言課程設計報告
- java課程設計實驗報告--java日歷設計
- java課程設計報告---java實現(xiàn)畫筆系統(tǒng)
- java課程設計-猜數(shù)游戲課程設計報告
- java課程設計-蜘蛛紙牌游戲設計課程設計報告
- java課程設計報告——蜘蛛紙牌
- java課程設計--掃雷游戲報告
- java代購網(wǎng)課程設計報告
- java坦克大戰(zhàn)課程設計報告
- java課程設計報告---考試系統(tǒng)
- java火柴游戲課程設計報告
- java課程設計報告—蜘蛛紙牌
評論
0/150
提交評論