伍濤 蘭全祥
摘要:為了提高Java程序設(shè)計(jì)的趣味性,切實(shí)鍛煉Java程序設(shè)計(jì)能力,實(shí)現(xiàn)了一個(gè)打字母游戲。基于Java的打字母游戲采用Java的圖形圖像技術(shù)、鍵盤監(jiān)聽(tīng)、多線程以及JDBC等技術(shù)實(shí)現(xiàn)了難度設(shè)置、排行榜、分?jǐn)?shù)存儲(chǔ)等功能。對(duì)打字母游戲進(jìn)行了功能設(shè)計(jì)與分析,詳細(xì)介紹了各個(gè)功能模塊的實(shí)現(xiàn)。該游戲能提高Java編程的趣味性,還能在Java事件處理、多線程、JDBC以及Java Swing等知識(shí)的教學(xué)中起到一定的輔助作用,促進(jìn)學(xué)生學(xué)習(xí)積極性。
關(guān)鍵詞:打字母;JDBC;多線程;游戲;事件處理
中圖分類號(hào):TP311.1? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)20-0087-03
開(kāi)放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 背景
打字母游戲一款休閑益智小游戲,玩家通過(guò)鍵盤點(diǎn)擊相應(yīng)按鈕消除界面中對(duì)應(yīng)的下落字母。游戲規(guī)則如下:當(dāng)玩家鍵入的字符與下落字母一致,則消除該字母,并且積分加1;若不一致,則下落字母不消除;若下落字母未被消除,且落出界面,則積分減1。當(dāng)玩家游戲時(shí)間為0(默認(rèn)為100s)或者分?jǐn)?shù)扣減為0(默認(rèn)為50分),則游戲結(jié)束。
開(kāi)發(fā)人員可以通過(guò)Java提供的java.awt包、java.swing包來(lái)進(jìn)行圖形界面設(shè)計(jì)[1]。本游戲在Java Swing 的基礎(chǔ)上,利用Java的圖形化界面和圖形圖像繪制來(lái)實(shí)現(xiàn)游戲界面、字母、積分以及時(shí)間的繪制,使用鍵盤監(jiān)聽(tīng)來(lái)實(shí)現(xiàn)玩家操作監(jiān)聽(tīng),使用多線程技術(shù)實(shí)現(xiàn)字母下落和計(jì)時(shí),使用JDBC[2]來(lái)存儲(chǔ)玩家積分和排行榜功能。
2 總體設(shè)計(jì)
2.1 功能設(shè)計(jì)
通過(guò)對(duì)打字母游戲的游戲規(guī)則進(jìn)行分析,將實(shí)現(xiàn)如圖1所示功能。
1)開(kāi)始游戲
點(diǎn)擊開(kāi)始游戲之后,啟動(dòng)游戲窗口。游戲進(jìn)行初始化,隨機(jī)生成n個(gè)字母,并隨時(shí)監(jiān)聽(tīng)玩家輸入。使用多線程進(jìn)行窗口重繪以及倒計(jì)時(shí)。
2)排行榜
在游戲開(kāi)始之前,玩家可以查看排行榜;在游戲結(jié)束之后,玩家輸入自己的名字并查看排行榜。排行榜中的數(shù)據(jù)通過(guò)JDBC從數(shù)據(jù)庫(kù)中進(jìn)行讀取會(huì)繪制在窗口中。
3)難度設(shè)置
玩家可以通過(guò)數(shù)遍選擇不同的難度。游戲難度分為高級(jí)(每次下落15個(gè)字母)、中級(jí)(每次下落10個(gè)字母)、初級(jí)(每次下落5個(gè)字母)三個(gè)級(jí)別。玩家也可以通過(guò)輸入字母下落個(gè)數(shù)自定義游戲難度。
4)退出游戲
點(diǎn)擊界面中退出游戲按鈕或窗口上的關(guān)閉按鈕可以退出游戲。
2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
本游戲使用MySQL數(shù)據(jù)庫(kù)對(duì)玩家分?jǐn)?shù)進(jìn)行存儲(chǔ)。在MySQL數(shù)據(jù)庫(kù)中建立數(shù)據(jù)庫(kù)Game,并在該數(shù)據(jù)庫(kù)中建立player表,用于存儲(chǔ)玩家信息,數(shù)據(jù)表信息如表1所示。
2.3 結(jié)構(gòu)設(shè)計(jì)
通過(guò)對(duì)游戲功能模塊進(jìn)行分析,對(duì)游戲所需對(duì)象進(jìn)行抽象和封裝,有如圖2所示類圖。
3 游戲?qū)崿F(xiàn)
3.1 游戲初始界面
游戲初始化階段將生成游戲初始界面。該界面中添加了分別是開(kāi)始游戲、排行榜、難度選擇、退出游戲四個(gè)按鈕,并為每個(gè)按鈕設(shè)置監(jiān)聽(tīng)事件。玩家通過(guò)點(diǎn)擊相應(yīng)按鈕進(jìn)行不同的功能操作。
3.2 游戲難度設(shè)置
玩家通過(guò)點(diǎn)擊初始界面中的難度設(shè)置,進(jìn)入難度選擇界面。該界面中添加四個(gè)按鈕,分別為高級(jí)、中級(jí)、初級(jí)和自定義,并為每個(gè)按鈕設(shè)置監(jiān)聽(tīng)事件。當(dāng)玩家點(diǎn)擊前三個(gè)按鈕時(shí),程序會(huì)將默認(rèn)值傳給ballCount;當(dāng)用戶點(diǎn)擊自定義時(shí)游戲,將會(huì)顯示一個(gè)輸入框供玩家出入字母?jìng)€(gè)數(shù),并將值傳給ballCount。游戲開(kāi)始后,程序?qū)⒏鶕?jù)ballCount的值生成字母?jìng)€(gè)數(shù)。代碼如下:
3.3.3 字母下落
CharPanel類通過(guò)Runnable接口中的run()方法執(zhí)行Thread.sleep(30)來(lái)控制重繪時(shí)間。run()方法每隔30毫秒執(zhí)行一次repaint()方法,每執(zhí)行一次該方法中字母的y坐標(biāo)值加上speed(初始值為1),從而實(shí)現(xiàn)字母下落效果[3]。另外,設(shè)置計(jì)數(shù)器count,每調(diào)用一次paint()方法,則count加1;當(dāng)count=5000時(shí),speed加1,并將count置為0,從而實(shí)現(xiàn)字母加速下落。代碼如下:
3.3.4 消除字母并計(jì)分
在字母向下落的過(guò)程中,通過(guò)對(duì)游戲窗口進(jìn)行鍵盤監(jiān)聽(tīng)[4]實(shí)現(xiàn)按鍵消除字母功能。當(dāng)監(jiān)聽(tīng)到鍵盤事件時(shí),CharPanel.count值加1,然后判斷匹配下落字母是否包含玩家鍵入字母,若包含則對(duì)應(yīng)的下落字母消失,并重新生成該字母的坐標(biāo)值(其中x值為1-500內(nèi)的隨機(jī)值,y值為零)和內(nèi)容(隨機(jī)生成),同時(shí)right值和score值加1。當(dāng)下落字母中出現(xiàn)多個(gè)相同字母時(shí),消除最下面的字母。代碼實(shí)現(xiàn)如下:
3.3.5 排行榜
當(dāng)游戲結(jié)束之后,將顯示一個(gè)輸入框供玩家輸入姓名。定義一個(gè)玩家信息類User,游戲結(jié)束后程序?qū)@取當(dāng)前游戲分?jǐn)?shù)、正確數(shù)right、總數(shù)count與玩家姓名,并通過(guò)UserDao類的接口將數(shù)據(jù)存入數(shù)據(jù)庫(kù)中[5]。代碼實(shí)現(xiàn)如下:
當(dāng)用戶點(diǎn)擊排行榜進(jìn)行查看時(shí),程序通過(guò)SQL查詢語(yǔ)句,將數(shù)據(jù)庫(kù)中的信息讀出,然后使用Graphics重寫paint方法繪制在界面上,排行榜效果圖如圖5所示。
4 結(jié)束語(yǔ)
基于Java的打字母游戲設(shè)計(jì)與實(shí)現(xiàn)使用了Java的鍵盤監(jiān)聽(tīng)、鼠標(biāo)點(diǎn)擊、圖形化界面和圖形圖像繪制、多線程以及JDBC等知識(shí),實(shí)現(xiàn)了難度設(shè)置、排行榜、分?jǐn)?shù)存儲(chǔ)等功能。
參考文獻(xiàn):
[1] 茍雨晴, 蘭全祥. 基于Java的拼圖游戲設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2019,15(2): 45-47.
[2] 楊廷發(fā), 蘭全祥. 基于問(wèn)題解決的JDBC教學(xué)方法改革和探討[J]. 赤峰學(xué)院學(xué)報(bào): 自然科學(xué)版,2018, 34(12):148-151.
[3] 張會(huì). 基于Java的指法練習(xí)小游戲的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2017,13(32):85-86, 96.
[4] 潘國(guó)榮. Java中的常見(jiàn)事件及處理探究[J]. 電腦知識(shí)與技術(shù), 2018, 14(29):125-126, 131.
[5] 胡蕊蕊. Java Web程序運(yùn)用中泛型DAO的作用[J]. 電子測(cè)試, 2017(4):46,49.
【通聯(lián)編輯:謝媛媛】