版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)報(bào)告--hannoi塔
- java課程設(shè)計(jì)----課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告-
- java課程設(shè)計(jì)報(bào)告--beatbox
- JAVA課程設(shè)計(jì)報(bào)告.doc
- java語言課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--java日歷設(shè)計(jì)
- java課程設(shè)計(jì)-猜數(shù)游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告---java實(shí)現(xiàn)畫筆系統(tǒng)
- java課程設(shè)計(jì)-蜘蛛紙牌游戲設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告——蜘蛛紙牌
- java課程設(shè)計(jì)--掃雷游戲報(bào)告
- java代購網(wǎng)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告---方程求根
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論