Java課程設(shè)計(jì)打字游戲_第1頁(yè)
Java課程設(shè)計(jì)打字游戲_第2頁(yè)
Java課程設(shè)計(jì)打字游戲_第3頁(yè)
Java課程設(shè)計(jì)打字游戲_第4頁(yè)
Java課程設(shè)計(jì)打字游戲_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、中南大學(xué)Java課程設(shè)計(jì)報(bào)告題 目 打字游戲 學(xué)生 竇立陽(yáng) 指導(dǎo)教師 陳麗萍 學(xué) 院 信息科學(xué)與工程學(xué)院 專(zhuān)業(yè)班級(jí) 計(jì)科1204 完成時(shí)間 2021年1月15日 目錄第一章 實(shí)驗(yàn)要求.3第2章 總體設(shè)計(jì)2.1 界面設(shè)計(jì) .42.2 運(yùn)行流程 .42.3 邏輯設(shè)計(jì) .42.4 積分設(shè)計(jì) .4第3章 詳細(xì)設(shè)計(jì)3.1 主面板 .53.1.1 兩個(gè)按鍵 .53.1.2 相關(guān)全局變量 .53.1.3 全局變量說(shuō)明 .5 3.1.4 相關(guān)全局函數(shù) .73.2 字符下落模塊 .73.2.1 WordLabel .73.2.2 WordFallControl .83.2.3 WordFallLabel .83

2、.3 速度控制模塊 .83.4 按鍵模塊設(shè)計(jì) .83.5 鍵盤(pán)監(jiān)聽(tīng)事件 .93.6 積分模塊設(shè)計(jì) .93.7 事件模塊設(shè)計(jì) .10第4章 調(diào)試分析4.1 第一次調(diào)試 .114.2 第二次調(diào)試 .114.3 第三次調(diào)試 .12第5章 運(yùn)行結(jié)果 .13第6章 課程設(shè)計(jì)總結(jié) .17第7章 參考文獻(xiàn) .19第8章 附錄:帶注釋的源代碼8.1 Wordfall .208.1.1 WordFallControl類(lèi) .208.1.2 WordLabel類(lèi) .228.1.3 WordFallLabel類(lèi) .238.2 ScoreLabel類(lèi) .248.3 StartButton類(lèi) .258.4 TimeLab

3、el類(lèi) .268.5 AAAAA類(lèi):程序的主函數(shù)入口 .288.6 Maintain類(lèi) .30第1章 實(shí)驗(yàn)要求【問(wèn)題描述】設(shè)計(jì)實(shí)現(xiàn)一個(gè)打字游戲,界面參見(jiàn)圖2-2,具備如下功能:l 點(diǎn)擊“開(kāi)始按鈕,產(chǎn)生隨機(jī)字符從屏幕上方下落;l 點(diǎn)擊鍵盤(pán)上按鈕,如果正確,當(dāng)前的字符消失,產(chǎn)生新的按鈕從上方繼續(xù)落下。l 提供速度調(diào)整和積分功能。圖2-2 打字游戲界面第2章 總體設(shè)計(jì)2.1 界面設(shè)計(jì)根據(jù)實(shí)驗(yàn)要求中的圖2-2,在主面板中,1.1.1 有一個(gè)模塊控制各個(gè)字符的生成并且控制他們的自動(dòng)下落,并在正確觸發(fā)時(shí),字符不可見(jiàn);1.1.2有一個(gè)模塊用于設(shè)置下落速度;1.1.3有兩個(gè)按鍵,分別為“開(kāi)始和“結(jié)束,用于字符

4、下落的開(kāi)始和結(jié)束;1.1.4整個(gè)面板處于鍵盤(pán)事件監(jiān)聽(tīng)中,所以還有一個(gè)模塊負(fù)責(zé)監(jiān)聽(tīng)鍵盤(pán)事件;1.1.5相應(yīng)的,根據(jù)要求,會(huì)有一個(gè)模塊用于將鍵盤(pán)事件和下落的字符進(jìn)行操作,并且計(jì)算出積分。2.2 運(yùn)行流程1.2.1 程序啟動(dòng),程序等待按鍵“開(kāi)始的事件的觸發(fā);1.2.2 當(dāng)“開(kāi)始鍵觸發(fā)后,負(fù)責(zé)字符下落的模塊,將持續(xù)產(chǎn)生字符,并使其下落;1.2.3 鍵盤(pán)開(kāi)始被監(jiān)聽(tīng),從鍵盤(pán)的按鍵觸發(fā),向程序返回值;1.2.3 積分模塊開(kāi)始工作,將字符下落模塊的字符和鍵盤(pán)事件返回的值進(jìn)行比較,得出積分,并且將積分值顯示在面板上;1.2.4 如果點(diǎn)擊“停止按鍵,所有模塊停止工作,等待程序關(guān)閉,或者等待“開(kāi)始按鍵事件的再次觸發(fā)

5、,從1.2.1繼續(xù)這一流程。 2.3 邏輯設(shè)計(jì)1.3.1 字符不斷產(chǎn)生并且下降,需要一個(gè)線程控制產(chǎn)生字符,然后還應(yīng)該有一個(gè)線程對(duì)面一個(gè)字符,控制其下落。1.3.2 鍵盤(pán)被按下后,立刻會(huì)有值返回到程序中,積分模塊會(huì)每隔一段時(shí)間將,鍵盤(pán)事件返回的值,和當(dāng)前需要按下的值進(jìn)行比較。2.4 積分說(shuō)明當(dāng)開(kāi)始產(chǎn)生字符后,會(huì)有很多字符都是可輸入的,但是當(dāng)前可輸入的字符只有一個(gè),所以可以考慮設(shè)計(jì)一個(gè)鏈表,沒(méi)當(dāng)產(chǎn)生一個(gè)字符,便將該字符存入鏈表中,并且有一個(gè)指針永遠(yuǎn)指向當(dāng)前需要輸入的值。由于界面大小有限,當(dāng)字符持續(xù)下落超過(guò)界面大小時(shí),不能夠通過(guò)玩家來(lái)猜測(cè),已經(jīng)不見(jiàn)的當(dāng)前需要輸入字符,所以當(dāng)界面上字符超過(guò)十個(gè)時(shí),便認(rèn)

6、為該玩家反響時(shí)間過(guò)長(zhǎng),判定其為錯(cuò)誤,并且將當(dāng)前需要輸入的字符設(shè)置為下一個(gè)。并且從游戲角度考慮,當(dāng)這種情況出現(xiàn)3次后,便可以判定本輪游戲結(jié)束。第3章 詳細(xì)設(shè)計(jì)3.1 主面板public class GameFrame extends JFrame主面板中主要涉及的是兩個(gè)按鍵,各個(gè)組件在面板上的布置,以及其他的全局變量的設(shè)置。3.1.1兩個(gè)按鍵 JButton btnStart = new JButton() JButton btnStop= new JButton() ScoreLabel scoreLabel KeyEventPanel keyEventPanel WordFallLabel

7、wordFallLabel JSlider slider3.1.2相關(guān)的全局變量boolean START_FLAG = false;ArrayList<Integer> CODE_LIST = new ArrayList<Integer>();ArrayList<WordLabel> wordLabels = new ArrayList<WordLabel>();int CHAR_VALUE = 0;int KEY_VALUE = 0;int POINTER = 0;int MAXFALSE = 3;int SUCCESSTIME = 0;in

8、t TRYTIME = 3;int SPEED = 1400;public static void init()CODE_LIST.clear(); wordLabels.clear();CHAR_VALUE = 0;KEY_VALUE = 0;POINTER = 0;MAXFALSE = 3;SUCCESSTIME = 0;TRYTIME = 3;3.1.3全局變量說(shuō)明:START_FLAG:由于在程序啟動(dòng)時(shí),各個(gè)組件就已經(jīng)開(kāi)始工作,用START_FLAG使他們通過(guò)if語(yǔ)句,不做任何動(dòng)作,當(dāng)START_FLAG = true時(shí),便可以開(kāi)始進(jìn)行游戲,防止了反復(fù)啟動(dòng)線程可能會(huì)造成意外情況的麻煩。

9、CODE_LIST:在游戲線程啟動(dòng)后,會(huì)產(chǎn)生很多的字符,這些字符假設(shè)存放在局部空間內(nèi),很有可能會(huì)出現(xiàn)其他組件需要調(diào)用該值并且需要通過(guò)一系列傳值過(guò)程才能實(shí)現(xiàn),將這些值放在一個(gè)公共空間內(nèi)的列表中,雖然會(huì)出現(xiàn)平安上面的問(wèn)題,但是無(wú)疑為程序的實(shí)現(xiàn)減少了很多的工作,寬且這也只是一個(gè)游戲,在平安上的問(wèn)題可以忽略。wordLabels:這個(gè)全局變量的設(shè)置,主要是為了實(shí)現(xiàn)下落字符的消失。產(chǎn)生的字符會(huì)放在label中,通過(guò)控制label的行為來(lái)控制字符的行為。將每一個(gè)WordLabel實(shí)例放在該列表中,可以通過(guò)在其他空間的控制來(lái)實(shí)現(xiàn)自己的想法。CHAR_VALUE:里面存放的是產(chǎn)生的字符的值,每一個(gè)字符都可以通

10、過(guò)ASCII碼轉(zhuǎn)變?yōu)橐粋€(gè)整數(shù)類(lèi)型的值,通過(guò)比較整數(shù)值來(lái)確定是否匹配。KEY_VALUE:存放了最近一次從鍵盤(pán)內(nèi)獲得的值,由于可能出現(xiàn)連續(xù)出現(xiàn)相同字符的情況,KEY_VALUE里的值必須定時(shí)清空,考慮之后,與每次在每次比較完之后進(jìn)行清空操作比較適宜。POINTER:在CODE_LIST中會(huì)有很多數(shù),但是當(dāng)前正確的值,只有一個(gè),那就是POINTER指向的位置,通過(guò)判斷KEY_VALUE和CHAR_VALUE的值,對(duì)POINTER進(jìn)行操作,具體操作會(huì)在ScoreLabel中說(shuō)明。MAXFALSE,TRYTIME:最大失誤次數(shù),當(dāng)超過(guò)這個(gè)次數(shù)時(shí),當(dāng)局游戲就會(huì)結(jié)束。SUCCESSTIME:本輪當(dāng)前成功次

11、數(shù),統(tǒng)計(jì)成功次數(shù)用來(lái)積分。SPEED:控制字符下落速度,這個(gè)值會(huì)與難度條上的值具有映射關(guān)系。3.1.4全局方法說(shuō)明:public static void init();在新的一輪游戲開(kāi)始前,全局變量中的值任然是上一輪的數(shù)據(jù),需要對(duì)其中的數(shù)據(jù)進(jìn)行初始化,設(shè)置為公共方法便于調(diào)用,其中的操作都是必須的操作,無(wú)多余也無(wú)漏缺。3.2 字符下落模塊3.2.1 public class WordLabel extends JLabel:這個(gè)類(lèi)主要負(fù)責(zé)創(chuàng)立一個(gè)下落的字符。由于共有26個(gè)字母和10個(gè)數(shù)字會(huì)在游戲中被記為字符,通過(guò)隨機(jī)函數(shù)(int)(Math.random()*35) 產(chǎn)生36個(gè)隨機(jī)數(shù),根據(jù)ASC

12、II碼的規(guī)那么,字符0-9對(duì)應(yīng)的職位48-57,根據(jù)產(chǎn)生的值加上48,便可以得到字符0-9,同理字符A-Z對(duì)應(yīng)的值為65-90,根據(jù)產(chǎn)生的值,由于是從10開(kāi)始,所以加上55,就可以得到對(duì)應(yīng)的字母字符,每產(chǎn)生一個(gè)字符,便將該字符添加到CODE_LIST中,以作他用。3.2.2 public class WordFallControl extends Thread:在WordLabel被實(shí)例化后,需要有個(gè)方法控制其下落,由于會(huì)產(chǎn)生喝多字符,對(duì)眾多字符進(jìn)行統(tǒng)一管理,并且還要考慮到字符在其他情況下的動(dòng)作,太過(guò)復(fù)雜,所以在這個(gè)組件中,只考慮字符的下落,每個(gè)字符交由一個(gè)控制對(duì)象控制。每過(guò)SD.SLEEP

13、毫秒的時(shí)間,WordLabel的位置便會(huì)下移一個(gè)單位,這個(gè)單位設(shè)置為50 。交由線程使其實(shí)現(xiàn)持續(xù)下降。3.2.3 public class WordFallLabel extends JLabel implements unnable:將前兩個(gè)組件進(jìn)行組合便是這個(gè)類(lèi)的作用,只要這個(gè)實(shí)例運(yùn)行正常,那么出現(xiàn)問(wèn)題就不會(huì)是該模塊的問(wèn)題,除非是出現(xiàn)對(duì)字符的藝術(shù)化或是下落的幅度的改變這一類(lèi)的需求。3.3 下落速度模塊JSlider slider = new JSlider();JSlider自帶的方法個(gè)頭getValue()可以獲得滑塊的值,向滑塊添加監(jiān)聽(tīng)事件addChangeListener(),在滑塊

14、移動(dòng)時(shí),可以將改變之后的值映射到SD.SPEED上,以控制速度的變化?;瑝K只能在一輪游戲開(kāi)始前滑動(dòng),從程序?qū)崿F(xiàn)角度考慮的理由是,當(dāng)移動(dòng)滑塊時(shí),整個(gè)面板的焦點(diǎn)便會(huì)由按鍵轉(zhuǎn)移到滑塊上來(lái),這是鍵盤(pán)事件監(jiān)聽(tīng)的對(duì)象也會(huì)轉(zhuǎn)移到這個(gè)滑塊部件上來(lái),這時(shí)候有兩種方法:一是在游戲中不允許移動(dòng)滑塊,二是在滑塊中添加鍵盤(pán)監(jiān)聽(tīng)事件。相比較之下第一種簡(jiǎn)單而且符合大多數(shù)人的操作習(xí)慣,完全可以施行。 3.4 按鍵模塊設(shè)計(jì)同上一小節(jié)所說(shuō)的焦點(diǎn)的轉(zhuǎn)移問(wèn)題,將“開(kāi)始和“結(jié)束設(shè)計(jì)為一個(gè)鍵,使整個(gè)面板的焦點(diǎn)可以在游戲開(kāi)始到游戲結(jié)束都一直在同一個(gè)部件上,而且實(shí)現(xiàn)也很簡(jiǎn)單,只要持續(xù)監(jiān)聽(tīng)START_FLAG的值,分辨當(dāng)前的游戲狀態(tài),就能確定

15、是該顯示“開(kāi)始或是結(jié)束“了。 3.5 鍵盤(pán)監(jiān)聽(tīng)設(shè)計(jì)鍵盤(pán)事件不是要向text area 之類(lèi)的部件中輸入字符,而是向KEY_VALUE賦值,重寫(xiě)KeyListener類(lèi),使鍵盤(pán)按下事件的響應(yīng)設(shè)置為KEY_VALUE = event.getKeyCode()。3.6 積分模塊設(shè)計(jì)public class ScoreLabel extends JLabel implements Runnable該模塊涉及到的變量有KEY_VALUE,CHAR_VALUE,CODE_LIST,POINTER,SUCCESSTIME,TRYTIME。此時(shí)鍵盤(pán)事件監(jiān)聽(tīng)中,只要有按鍵被按下,就會(huì)給KEY_VALUE賦一個(gè)值

16、,POINTER指向一個(gè)位置,將CODE_LIST.get(POINTER)的值與KEY_VALUE比較如果相等,那么POINTER的值加一,指向列表中的下一個(gè)值如果列表中還有的話(huà),SUCCESSTIME加一;如果不相等,考慮這個(gè)值存在時(shí)間是否太長(zhǎng)了,每個(gè)值都只有10個(gè)單位周期的生命這個(gè)可以通過(guò)列表的長(zhǎng)度判斷出來(lái),每個(gè)單位周期,都會(huì)向列表中添加一個(gè)新的字符,當(dāng)CODE_LIST.size()-POINTER > 9時(shí),POINTER自加一,指向下一個(gè),TRYTIME減一,否那么不進(jìn)行任何操作。3.7 時(shí)間模塊設(shè)計(jì)這局部主要是為了熟悉一邊線程的用法public class TimeLabe

17、l extends JLabel implements Runnable/* * */private static final long serialVersionUID = 1L;private Date date = new Date();private SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");public TimeLabel()new Thread(this).start();Overridepublic void run() / TODO Auto-genera

18、ted method stubint i = 0;while(i < 10)try date = new Date();this.setText(sdFormat.format(date);new Thread();Thread.sleep(1000); catch (Exception e) / TODO: handle exceptione.printStackTrace();第4章 調(diào)試分析幾乎每寫(xiě)一個(gè)類(lèi)就會(huì)調(diào)試一次,類(lèi)里面的修改也是很多的,下面只是找了三次比較大的改動(dòng)進(jìn)行說(shuō)明。4.1 第一次調(diào)試:第一次調(diào)試沒(méi)有,參加按鈕和難度條,主要是為了確定程序的主體局部能夠正確執(zhí)行。發(fā)現(xiàn)的問(wèn)

19、題有。一超出范圍異常:在所有線程啟動(dòng)后,記分板會(huì)不斷調(diào)用CODE_LIST.get(POINTER)的方法,在第一次成功輸入后由于記分板線程的sleep時(shí)間短于,WordLabel產(chǎn)生線程的sleep時(shí)間,所以,列表內(nèi)還沒(méi)有第二個(gè)值的時(shí)候便會(huì)要取第二個(gè),所以出現(xiàn)這個(gè)問(wèn)題。二 START_FLAG在線程執(zhí)行的過(guò)程中何時(shí)判斷的問(wèn)題,開(kāi)始時(shí)是放在第一位進(jìn)行測(cè)試的,但是線程會(huì)在進(jìn)行到START_FLAG為false就結(jié)束,除非重新實(shí)例化各個(gè)線程,但是,重新實(shí)例化又會(huì)在面板上添加新部件,導(dǎo)致新建一個(gè)游戲面板,所以讓游戲進(jìn)程一直執(zhí)行,遇到START_FLAG為false是不做任何操作,線程并不中斷。4.2

20、 第二次調(diào)試:第二次調(diào)試也可以說(shuō)是第二次大修改的主題內(nèi)容就是全局變量的設(shè)計(jì)。隨著整個(gè)程序添加的不見(jiàn)越來(lái)越多,將各局部產(chǎn)生的值保存在局部,并且調(diào)用get和set方法去獲得值顯得越來(lái)越麻煩,而且很多地方涉及到部件之間的相互取值,如score label和word fall control 兩塊,score 需要里面的字符的值,而word fall 需要score里面對(duì)值的判斷情況,以便字符在被按下后及時(shí)消失。需要在兩個(gè)類(lèi)中添加太多static數(shù)據(jù)和方法,同時(shí),靜態(tài)變量和方法的調(diào)用又出現(xiàn)了很多限制問(wèn)題。最后決定如3.1.1中列出的一系列全局變量,大大簡(jiǎn)化了調(diào)用復(fù)雜度,也使整個(gè)程序顯得簡(jiǎn)潔明了。4.3

21、 第三次調(diào)試:第三次調(diào)試是這次試驗(yàn)中最簡(jiǎn)單的問(wèn)題,也是最復(fù)雜的問(wèn)題,經(jīng)驗(yàn)問(wèn)題。在一步一步添加完所有部件,并且對(duì)所有部件單獨(dú)測(cè)試后,我發(fā)現(xiàn)只要點(diǎn)擊開(kāi)始按鈕后,不能夠正常監(jiān)聽(tīng)鍵盤(pán)事件了。開(kāi)始時(shí),鍵盤(pán)監(jiān)聽(tīng)事件是放在WordLabel中執(zhí)行的,在單獨(dú)測(cè)試時(shí)不會(huì)有任何問(wèn)題。多方面查找資料也沒(méi)有發(fā)現(xiàn)類(lèi)似的問(wèn)題。于是從書(shū)本上的實(shí)例翻起,不經(jīng)意想到,如果兩個(gè)文本框同時(shí)顯示卻只能向獲得焦點(diǎn)的那個(gè)文本框內(nèi)輸入字符這個(gè)情況,瞬間清楚了問(wèn)題所在。在進(jìn)行調(diào)整后,重新執(zhí)行程序,已經(jīng)能夠完成預(yù)期目標(biāo)。第5章 運(yùn)行結(jié)果主在程序調(diào)試完成后,可使用的穩(wěn)定版本的使用情況如下:圖6-1 打字游戲開(kāi)始界面如圖 6-1顯示。程序開(kāi)始時(shí),

22、左上角為記分板,沒(méi)有任何數(shù)據(jù)顯示;右上角為顯示當(dāng)前時(shí)間;中間局部使游戲的主要界面,用來(lái)顯示下落的字符,由于游戲尚未開(kāi)始,沒(méi)有任何顯示;左下角是游戲開(kāi)始的按鈕,當(dāng)前顯示為“開(kāi)始,在點(diǎn)擊后,變?yōu)椤敖Y(jié)束,并且記分板開(kāi)始積分,游戲住界面開(kāi)始下落字符,參照?qǐng)D6-2;右下角為難度調(diào)整框可以設(shè)置難度,左低右高。圖6-2 打字游戲進(jìn)行中如圖 6-2顯示。游戲正常開(kāi)始后,記分板開(kāi)始積分,會(huì)記錄正確的個(gè)數(shù),如果超出時(shí)間為按下正確的字符,剩余時(shí)機(jī)就會(huì)減少一次,在記分板的最后面,會(huì)有提示當(dāng)前應(yīng)當(dāng)輸入的正確字符;游戲主界面會(huì)有字符持續(xù)落下,當(dāng)按下正確的字符后,該字符消失,正確字符更新;左下角的按鈕在點(diǎn)擊使游戲開(kāi)始后,變

23、為“結(jié)束按鈕;右下角的難度條,可以在游戲前移動(dòng),游戲中不可以移動(dòng),具體原因參照在第三章詳細(xì)設(shè)計(jì)中,設(shè)計(jì)鍵盤(pán)監(jiān)聽(tīng)事件的時(shí)候已經(jīng)說(shuō)明。圖6-3 打字游戲正常退出如圖 6-3 顯示。當(dāng)點(diǎn)擊結(jié)束按鈕后,左下角的按鈕將會(huì)變?yōu)椤伴_(kāi)始按鈕;記分板保持顯示,用于玩家查看此次游戲的成績(jī),游戲主界面上不會(huì)在產(chǎn)生下落字符,直到下輪游戲的開(kāi)始;該輪游戲產(chǎn)生的字符繼續(xù)下落完畢,但是此時(shí)已經(jīng)可以開(kāi)始進(jìn)行下輪游戲了。這點(diǎn)是設(shè)計(jì)上的缺憾,在以后會(huì)進(jìn)行修改使其更加完善。圖6-4 打字游戲錯(cuò)誤過(guò)多退出如圖 6-4 顯示。此次本輪游戲結(jié)束的原因是錯(cuò)誤過(guò)多,沒(méi)有剩余時(shí)機(jī)了。玩家仍然可以在記分板上查看到自己的成績(jī)。左下角的按鈕也適時(shí)變

24、為了開(kāi)始“按鈕。第6章 課程設(shè)計(jì)總結(jié)本次實(shí)驗(yàn)的內(nèi)容選取的是打字游戲,最后完成了實(shí)驗(yàn)要求內(nèi)的全部?jī)?nèi)容。實(shí)驗(yàn)過(guò)程中,沒(méi)有借助外力,參考內(nèi)容也只是Java 的API文檔,在這一點(diǎn)上自己還是比較滿(mǎn)意的。實(shí)驗(yàn)完成后,與其他同學(xué)比較的情況是,美工缺乏,界面只是按照實(shí)驗(yàn)要求上的例圖設(shè)計(jì)的,沒(méi)有添加更有意思的東西。這次試驗(yàn)有兩個(gè)小的收獲。一是加深的對(duì)線程的理解。在設(shè)計(jì)之初,出現(xiàn)的一個(gè)最大問(wèn)題就是在一個(gè)線程內(nèi)添加了另外一個(gè)線程,而且副線程不是自啟動(dòng)的,在主線程中斷時(shí),副線程也是出于終端狀態(tài),沒(méi)有被執(zhí)行到,經(jīng)過(guò)屢次斷點(diǎn)測(cè)試發(fā)現(xiàn)了這個(gè)問(wèn)題,這個(gè)結(jié)論可能是錯(cuò)誤的,但是確實(shí)適用于我遇到的情況。二是發(fā)現(xiàn)編程這個(gè)東西,跟技

25、術(shù)有60%的關(guān)系,跟知識(shí)儲(chǔ)藏有30%的關(guān)系,剩下的10%就要看個(gè)人的經(jīng)驗(yàn)。30%看看書(shū),查查資料就行。60%注重的是對(duì)代碼量的考驗(yàn)。10%是對(duì)代碼復(fù)雜度的考驗(yàn),相似的代碼敲一萬(wàn)遍,也還是那樣,時(shí)間長(zhǎng)了不做,就忘了,各個(gè)組件都能正常運(yùn)行,組合在一起后卻會(huì)出現(xiàn)焦點(diǎn)變化的問(wèn)題,如果不是這次遇到,并且發(fā)現(xiàn)了,以后遇到類(lèi)似的問(wèn)題,我還是不知道。這個(gè)問(wèn)題雖然簡(jiǎn)單,我也一直遲遲沒(méi)有請(qǐng)教老師或同學(xué),一是覺(jué)得放不下臉,二也是鍛煉一下自己的思維能力,可能第一次解決沒(méi)有遇到過(guò)的問(wèn)題會(huì)花費(fèi)一天兩天,第二次可能就是半天,而且自己發(fā)現(xiàn)問(wèn)題所在,在自己的鬧鐘印象更加深刻,自己也更加有成就感。大的收獲是,自己這次嘗試著從結(jié)構(gòu)

26、層次的角度考慮程序的設(shè)。將整個(gè)程序分為各個(gè)組件,最后通過(guò)組件的結(jié)合形成整個(gè)程序。程序簡(jiǎn)單,并沒(méi)有很多層次,而且層次對(duì)程序的重要性也不是那么明顯,但是嘗試著這么做,并且在以后的每一次都向這方面努力,我想對(duì)我程序員生活的提升是會(huì)有很大的幫助的。實(shí)驗(yàn)只需要選取一個(gè)實(shí)驗(yàn)完成,但是其他實(shí)驗(yàn)也是老師花費(fèi)心思,想出來(lái)的題目,比方說(shuō)圖形編輯系統(tǒng),好似很少有人選,但是看上去也是挺有意思的,決定在寒假的時(shí)候,著手實(shí)現(xiàn)以下,雖然java的優(yōu)勢(shì)并不在于此,但是從以上所說(shuō)的各個(gè)方面也很有必要。第7章 參考文獻(xiàn)JDK1.5API_CN(全).chm:C:UsersadminDesktopAPIJDK1.5API_CN(全

27、).chm第8章 附錄:帶注釋的源代碼本章附上整個(gè)課程設(shè)計(jì)的游戲源代碼,以及相關(guān)測(cè)試代碼。 相關(guān)組件:Component包: 8.1 Wordfall子包: 8.1.1 wordFallControl類(lèi):字符下落的規(guī)律package release.conponent.wordfall;import javax.swing.JLabel;import release.SD;public class WordFallControl extends Threadprivate JLabel jLabel;private WordLabel wordLabel;private int x = 0;p

28、rivate int y = (int)(Math.random()*10);/control word label fall,where,who and howpublic WordFallControl(JLabel jLabel,WordLabel wordLabel)this.jLabel = jLabel;this.wordLabel = wordLabel;this.jLabel.add(this.wordLabel);this.wordLabel.setBounds( y*SD.WORD_LABEL_WIDTH,x*SD.WORD_LABEL_HEIGHT+50, SD.WORD

29、_LABEL_WIDTH, SD.WORD_LABEL_HEIGHT );new Thread(this).start();Overridepublic void run() / TODO Auto-generated method stubwhile(x<10)try / in every SD.SPEED_ms,word label will fall one 50,x+;this.wordLabel.setBounds(y*SD.WORD_LABEL_WIDTH/5, x*SD.WORD_LABEL_HEIGHT, SD.WORD_LABEL_WIDTH, SD.WORD_LABE

30、L_HEIGHT );if(x = 9)/when word label is beyond the frame,no one can see it,it contains nothingthis.wordLabel.setText(null);sleep(SD.SPEED); catch (Exception e) e.printStackTrace();super.run();package release.conponent.wordfall;import javax.swing.JLabel;import release.SD;public class WordFallLabel ex

31、tends JLabel implements Runnable/* * */private static final long serialVersionUID = 1L;public WordFallLabel()setSize(500,500);new Thread(this).start();System.out.println("world fall start");Overridepublic void run() / TODO Auto-generated method stubint repeat = 0;/thread goes on constantly

32、,if thread runs 100 times,it will stopwhile(0<1&&repeat<100)/if SD.START_FLAG is false,the thread will do nothing,just skip itif(SD.START_FLAG)/characters and fallnew WordFallControl(this, new WordLabel();repeat+;try new Thread();Thread.sleep(SD.SPEED); catch (Exception e) / TODO: hand

33、le exceptione.printStackTrace();else try new Thread();Thread.sleep(SD.SPEED); catch (Exception e) / TODO: handle exceptione.printStackTrace();8.1.2 wordFall類(lèi):產(chǎn)生可控制下落的字符package release.conponent.wordfall;import javax.swing.ImageIcon;import release.SD;public class WordLabel extends JLabel/* * version

34、1.0 */private static final long serialVersionUID = 1L;/初始化word label對(duì)象,里面的值為用隨機(jī)數(shù)產(chǎn)生的字符public WordLabel()setText(getChar().toString();setVisible(true);SD.wordLabels.add(this);private Character getChar()/以相同概率獲得一個(gè)數(shù)字int random_integer = (int)(Math.random()*35);/將該數(shù)字通過(guò)ASCII碼轉(zhuǎn)為對(duì)應(yīng)的字符char int_to_char = rand

35、om_integer>9?(char)(random_integer+55):(char)(random_integer+48);/向SD.CODE_LIST里面添加一個(gè)新生成的word labelSD.CODE_LIST.add(random_integer>9?random_integer+55:random_integer+48);return int_to_char;8.1.3 WordFallLabel類(lèi):整合字符下落這個(gè)過(guò)程package release.conponent.wordfall;import javax.swing.JLabel;import releas

36、e.SD;public class WordFallLabel extends JLabel implements Runnable/* * */private static final long serialVersionUID = 1L;public WordFallLabel()setSize(500,500);new Thread(this).start();System.out.println("world fall start");Overridepublic void run() / TODO Auto-generated method stubint rep

37、eat = 0;/thread goes on constantly,if thread runs 100 times,it will stopwhile(0<1&&repeat<100)/if SD.START_FLAG is false,the thread will do nothing,just skip itif(SD.START_FLAG)/characters and fallnew WordFallControl(this, new WordLabel();repeat+;try new Thread();Thread.sleep(SD.SPEED)

38、; catch (Exception e) / TODO: handle exceptione.printStackTrace();else try new Thread();Thread.sleep(SD.SPEED); catch (Exception e) / TODO: handle exceptione.printStackTrace();8.2 ScoreLabel類(lèi):用于記錄得分package release.conponent;import javax.swing.JLabel;import release.SD;public class ScoreLabel extends

39、JLabel implements Runnable/* * */private static final long serialVersionUID = 1L;/ initialize the label public ScoreLabel()setText("天下武功,唯快不破");new Thread(this).start();System.out.println("scroe start");Overridepublic void run() / TODO Auto-generated method stub/使線程持續(xù)執(zhí)行while(0<

40、;1)try new Thread();Thread.sleep(300); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();if(SD.START_FLAG)/當(dāng)游戲開(kāi)始執(zhí)行時(shí),SD.CODE_LIST里面才會(huì)有值,否那么會(huì)報(bào)空指針異常if(SD.CODE_LIST.size()>0)/將鍵盤(pán)輸入值和應(yīng)當(dāng)輸入的值進(jìn)行比較if(SD.KEY_VALUE = SD.CODE_LIST.get(SD.POINTER)/如果匹配,那么成功次數(shù)加一,指向的字符的位置也會(huì)向下挪一

41、位SD.SUCCESSTIME+;SD.wordLabels.get(SD.POINTER).setVisible(false);SD.KEY_VALUE = 0;SD.POINTER+;else if(SD.CODE_LIST.size()-SD.POINTER)>9)/如果不匹配,當(dāng)該字符從產(chǎn)生到超過(guò)界面時(shí)如果還沒(méi)有被正確按下,剩余嘗試次數(shù)減一,指向的字符的位置也會(huì)向下挪一位,超過(guò)三次,停止計(jì)分SD.POINTER+;SD.TRYTIME-;if (SD.TRYTIME = 0) SD.START_FLAG = false;setText("天下武功,唯快不破")

42、;/顯示當(dāng)前成績(jī)和應(yīng)當(dāng)鍵入的字符char c = 'd'int i = SD.CODE_LIST.get(SD.POINTER);c = (char)i;setText("正確:"+SD.SUCCESSTIME+" 剩余時(shí)機(jī):"+SD.TRYTIME+"正確字符:"+c);else 8.3 StartButton類(lèi):用于控制游戲開(kāi)始和結(jié)束package release.conponent;import javax.swing.JButton;import release.SD;public class StartBut

43、ton extends JButton implements Runnablepublic StartButton()new Thread(this).start();Overridepublic void run() / TODO Auto-generated method stub/根據(jù)監(jiān)視的游戲狀態(tài),控制按鍵字符的顯示while(0<1)if (SD.START_FLAG) this.setText("結(jié)束");else this.setText("開(kāi)始");try new Thread();Thread.sleep(1000); catch

44、 (Exception e) / TODO: handle exceptione.printStackTrace();8.4 TimeLabel類(lèi):用于顯示當(dāng)前時(shí)間package release.conponent;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.JLabel;public class TimeLabel extends JLabel implements Runnable/* * */private static final long serialVersionUID = 1

45、L;private Date date = new Date();private SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");public TimeLabel()new Thread(this).start();Overridepublic void run() / TODO Auto-generated method stubint i = 0;while(i < 10)try date = new Date();this.setText(sdFormat.form

46、at(date);new Thread();Thread.sleep(1000); catch (Exception e) / TODO: handle exceptione.printStackTrace();8.5 AAAAA:整個(gè)程序的主面板package release.maintain;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JLabel;import release.SD;import release.conponent.StartButton;import javax.swing.JSlider;import javax.swing.event.ChangeListener;im

溫馨提示

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

評(píng)論

0/150

提交評(píng)論