標(biāo)題: Java GUI界面的動(dòng)物換位游戲設(shè)計(jì)思路分享 [打印本頁]

作者: 919188581    時(shí)間: 2020-11-5 13:48
標(biāo)題: Java GUI界面的動(dòng)物換位游戲設(shè)計(jì)思路分享
程序分為不同的級(jí)別,左右各有動(dòng)物,中間石頭沒有動(dòng)物,將左右動(dòng)物交換,不可后退。用鼠標(biāo)單擊一個(gè)動(dòng)物,如果該動(dòng)物前方的石頭上沒有動(dòng)物,該動(dòng)物就跳躍到該石頭上,如果該動(dòng)物前方的石頭上有動(dòng)物,但隔位上的石頭沒有動(dòng)物,該動(dòng)物就越過自己前面的動(dòng)物躍到石頭上,其他情形時(shí),該動(dòng)物不能跳躍。不能持續(xù)玩的可以點(diǎn)自動(dòng)演示,將自動(dòng)完成游戲,可以幫助游戲者更好的了解系統(tǒng)的主體功能,通過做鞏固所學(xué)Java語言基本知識(shí),增進(jìn)Java語言編輯基本功,掌握J(rèn)DK、等開發(fā)工具的運(yùn)用,拓寬常用類庫的應(yīng)用。使我們通過該教學(xué)環(huán)節(jié)與手段,把所學(xué)及相關(guān)知識(shí)加以融會(huì)貫通,全面掌握J(rèn)ava語言的編程思想及面向?qū)ο蟪绦蛟O(shè)計(jì)的方法,為今后從事實(shí)際工作打下堅(jiān)實(shí)的基礎(chǔ)。

1.1設(shè)計(jì)目的
1.2設(shè)計(jì)要求和設(shè)計(jì)指標(biāo)
1.3開發(fā)技術(shù)
1.3.1 Java語言簡(jiǎn)介
1.3.2 Java語言的開發(fā)工具包JDK
1.3.3 Eclipse開發(fā)環(huán)境
2 設(shè)計(jì)內(nèi)容
2.1總體設(shè)計(jì)
2.1.1 ChangeAnimalWindow.java(主類)
2.1.2 Animal.java
2.1.3 Point.java
2.1.4 Stone.java
2.1.5 HandleMouse.java
2.1.6 AutoMoveAnimal.java
2.1.7 Customdlg.java
2.1.8 People.java
2.1.9 Record.java
2.1.10 ShowRecordDialog.java
2.2詳細(xì)設(shè)計(jì)
2.2.1 ChangeAnimalWindow類(主類)
2.2.2 Animal類
2.2.3 Point類
2.2.4 Stone類
2.2.5 HandleMouse類
2.2.6 AutoMoveAnimal類
2.2.7 ShowRecordDialog類
2.2.8 People類
2.2.9 Record類
2.2.10 Customdlg類
2.3 程序測(cè)試
2.3.1 主程序調(diào)試
2.3.2 組件調(diào)試
2.3.3 菜單調(diào)試

訓(xùn)練掌握、加深理解并鞏固《Java 2 實(shí)用教程》中所學(xué)到的基本概念、編程思路;
綜合運(yùn)用Java程序設(shè)計(jì)的編程方法,能夠利用這些程序設(shè)計(jì)方法來解決工程和科研中常見的實(shí)際問題;
培養(yǎng)分析問題、解決問題的能力,進(jìn)一步提高進(jìn)行大型程序設(shè)計(jì)的能力。
1.2.   設(shè)計(jì)要求
設(shè)計(jì)GUI界面的動(dòng)物換位游戲,游戲的結(jié)果是讓左右兩組動(dòng)物交換位置。具體要求如下:
(1)程序分為4個(gè)級(jí)別,用戶可以通過界面上提供的菜單選擇“初級(jí)”、“中級(jí)”、“高級(jí)”、“自定義”這4個(gè)級(jí)別。對(duì)于“初級(jí)”級(jí)別,在水平排列的7塊石頭上的左右各有3個(gè)類型相同的動(dòng)物,中間的石頭上沒有動(dòng)物;對(duì)于“中級(jí)”級(jí)別,在水平排列的9塊石頭上的左右各有4個(gè)類型相同的動(dòng)物,中間的石頭上沒有動(dòng)物;對(duì)于“高級(jí)”級(jí)別,在水平排列的11塊石頭上的左右各有5個(gè)類型相同的動(dòng)物,中間的石頭上沒有動(dòng)物;對(duì)于“自定義”級(jí)別,用戶可以輸入自己想設(shè)置的一個(gè)動(dòng)物數(shù)量(輸入的數(shù)必須是偶數(shù)),在水平排列的N塊石頭上的左右各有(N-1)/2個(gè)類型相同的動(dòng)物,中間的石頭上沒有動(dòng)物。
(2)用鼠標(biāo)單擊一個(gè)的動(dòng)物,如果該動(dòng)物前方的石頭上沒有動(dòng)物,該動(dòng)物就跳躍到該石頭上,如果該動(dòng)物前方的石頭上有動(dòng)物,但隔位上的石頭沒有動(dòng)物,該動(dòng)物就越過自己前面的動(dòng)物躍到石頭上,其他情形時(shí),該動(dòng)物不能跳躍(跳躍時(shí)不能超過2塊石頭)。
(3)左面的動(dòng)物只能向右方跳躍,右面的動(dòng)物只能向左方跳躍。
(4)用戶可以通過單擊界面上提供的按鈕,讓程序自動(dòng)完成動(dòng)物換位。
(5)可以隨時(shí)單擊界面上提供的按鈕,重新開始當(dāng)前的級(jí)別。
(6)用戶可以通過菜單選項(xiàng),可以選擇左、右動(dòng)物的圖像。
(7)該游戲提供了游戲成績(jī)記錄,用戶可以單擊界面上的菜單選項(xiàng)查看英雄榜和檢測(cè)是否超時(shí),看看自己水平怎么樣。
(8)該程序也提供了游戲規(guī)則,不知道游戲規(guī)則的可以在菜單中查看幫助。
(9)在進(jìn)行游戲時(shí)具有音效的效果。
1.3. 開發(fā)技術(shù)
1.3.1 Java語言簡(jiǎn)介
Java是一種簡(jiǎn)單易用的編程語言,它采用了一種虛擬機(jī)作為中間層來屏蔽平臺(tái)差異,能夠?qū)崿F(xiàn)跨平臺(tái)運(yùn)行。Java支持面向?qū)ο缶幊,有封裝、繼承、多態(tài)的特性,它還支持多線程,實(shí)現(xiàn)多個(gè)程序流程同時(shí)執(zhí)行,完成不同任務(wù)。
1.3.2 Java語言的開發(fā)工具包JDK
JDK(Java Development Kit)是Java語言的開發(fā)工具包,工具包里除了包含Java語言編譯器、調(diào)試器以及演示程序以外,一般還會(huì)包含Java運(yùn)行環(huán)境(Java Runtime Environment,JRE)。JRE是某一平臺(tái)運(yùn)行Java程序的軟件環(huán)境,包括虛擬機(jī)(JVM)和核心類庫等。
1.3.3 Eclipse開發(fā)環(huán)境
Eclipse是一個(gè)開放源代碼的、基于Java的可擴(kuò)展開發(fā)平臺(tái),是目前非常流行的跨平臺(tái)的自由集成開發(fā)環(huán)境(IDE)。最初主要用于Java語言開發(fā),但是目前也有人通過插件使其作為其他編程語言(如C++、PHP)的開發(fā)工具。Eclipse本身也只是一個(gè)框架平臺(tái),但是眾多插件的支持使得Eclipse擁有其他功能相對(duì)固定的IDE軟件很難具有的靈活性。許多軟件開發(fā)商以Eclipse為框架開發(fā)自己的IDE。
Eclipse本身核心非常小,其設(shè)計(jì)思想是“一切皆為插件”。其他功能都是基于插件的形式與Eclipse無縫結(jié)合,協(xié)同工作,如Eclipse的圖形API、多國語言包等。在Eclipse啟動(dòng)后,要真正用到某個(gè)插件時(shí),該插件才會(huì)被動(dòng)態(tài)載入內(nèi)存,不再被使用的插件會(huì)在適當(dāng)?shù)臅r(shí)候被清除內(nèi)存,所以不必?fù)?dān)心某些不常用的插件消耗內(nèi)存。插件機(jī)制使得Eclipse具有了無限擴(kuò)展的可能。

2.   設(shè)計(jì)內(nèi)容
2.1.   總體設(shè)計(jì)
在設(shè)計(jì)動(dòng)物換位時(shí),需要編寫10個(gè)Java源文件:ChangeAnimalWindow.java、Point.java、Animal.java、Stone.java、HandleMouse.java、AutoMoveAnimal.java、People.java、Record.java、ShowRecordDialog.java和Customdlg.java。
動(dòng)物換位除了需要編寫上述10個(gè)Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,如:JmenuItem、File和Jbutton類等。動(dòng)物換位所用到的一些重要的類以及之間組合關(guān)系如圖2-1所示。
以下是10個(gè)Java源文件的總體設(shè)計(jì)。

ChangeAnimalWindow類負(fù)責(zé)創(chuàng)建動(dòng)物換位的主窗口,該類含有main方法,程序從該類開始執(zhí)行。ChangeAnimalWindow類的成員變量中有七種重要類型的對(duì)象:Animal、Point、Stone、HandleMouse、Customdlg、ShowRecordDialog和AutoMoveAnimal對(duì)象。

2.1.2 Animal.java

Animal類是JPanel的一個(gè)子類,創(chuàng)建的對(duì)象是ChangeAnimalWindow類的重要成員之一,用來表示“動(dòng)物”。

2.1.3 Point.java

Point類負(fù)責(zé)創(chuàng)建確定位置的對(duì)象,使用Point對(duì)象,可以確定Animal以及Stone對(duì)象在窗體中的位置。

2.1.4 Stone.java

Stone類是JButton的一個(gè)子類,創(chuàng)建的對(duì)象表示“石頭”。

2.1.5 HandleMouse.java

HandleMouse類所創(chuàng)建的對(duì)象負(fù)責(zé)處理鼠標(biāo)事件。

2.1.6 AutoMoveAnimal.java

AutoMoveAnimal類所創(chuàng)建的對(duì)象使用算法完成動(dòng)物的自動(dòng)換位。

2.1.7 Customdlg.java

Customdlg類所創(chuàng)建的對(duì)象用來設(shè)置“自定義”級(jí)別的動(dòng)物數(shù)量。

2.1.8 People.java

People對(duì)象封裝用戶的名字和成績(jī),以便ShowRecordDialog對(duì)象可以按成績(jī)的高低排序用戶。

2.1.9 Record.java

Record類是javax.swing包中JDialog對(duì)話框的子類,當(dāng)用戶成功完成相應(yīng)級(jí)別的游戲時(shí),Record創(chuàng)建的對(duì)象負(fù)責(zé)保存用戶的名字和成績(jī)到相應(yīng)的級(jí)別文件中。

2.1.10 ShowRecordDialog.java

ShowRecordDialog類是javax.swing包中JDialog對(duì)話框的子類,當(dāng)用戶單擊查看相應(yīng)的級(jí)別排行榜時(shí),ShowRecordDialog創(chuàng)建的對(duì)象負(fù)責(zé)顯示用戶的成績(jī)。

2.2.   詳細(xì)設(shè)計(jì)2.2.1 ChangeAnimalWindow類(主類)

1)效果圖

ChangeAnimalWindow創(chuàng)建的窗口效果如圖2-2-1所示:

圖2-2-1  ChangeAnimalWindow創(chuàng)建的窗口

ChangeAnimalWindow類是javax.swing包中的JFrame的一個(gè)子類,并實(shí)現(xiàn)了ActionListener接口,標(biāo)明該類的主要成員變量和方法的UML圖如圖2-2-2所示。

以下是UML圖中有關(guān)數(shù)據(jù)和方法的詳細(xì)說明。

2)成員變量
amoutOfAnimal是int型數(shù)據(jù),默認(rèn)值是6。amoutOfAnimal的值用來確定ChangeAnimalWindow窗體中“動(dòng)物”的數(shù)目,即Animal對(duì)象的數(shù)目。
distance是int型數(shù)據(jù),默認(rèn)值是80。distance的值用來確定Point對(duì)象之間的距離,進(jìn)而可以確定Animal之間,Stone之間的距離以及Animal和Stone對(duì)象外觀的大小。
animal是Animal型數(shù)組,其長度為amoutOfAnimal。
point是Point型數(shù)組,其長度為amoutOfAnimal+1。
stone是Stone型數(shù)組,其長度為amoutOfAnimal+1。
handleMouse是HandleMouse類創(chuàng)建的鼠標(biāo)事件監(jiān)視器,用來監(jiān)視animal數(shù)組中Animal對(duì)象觸發(fā)的鼠標(biāo)事件。
autoMoveAnimal是AutoMoveAnimal類創(chuàng)建的對(duì)話框。通過該對(duì)話框可以實(shí)現(xiàn)程序自動(dòng)將左右動(dòng)物交換位置。
bar是JMenuBar創(chuàng)建的菜單條,用來添加菜單。bar被放置在窗口的頂部。
menuGrade是JMenu創(chuàng)建的菜單,其名字為“選擇級(jí)別”。menuImage也是JMenu創(chuàng)建的菜單,其名字為“選擇動(dòng)物圖像(JPG,GIF)”。menuHelp也是JMenu創(chuàng)建的菜單,其名字為“幫助”。menuHero也是JMenu創(chuàng)建的菜單,其名字為“英雄榜”。menuGrade、menuImage、menuHero和menuHelp被添加到菜單條bar中。
oneGradeItem、twoGradeItem、threeGradeItem和custom是JMenuItem創(chuàng)建的菜單項(xiàng),它們的名字依次為“初級(jí)”、“中級(jí)”、“高級(jí)”和“自定義”,這四個(gè)菜單項(xiàng)被添加到菜單項(xiàng)menuGrade中。leftImage、rightImage和defaultImage也是JMenuItem創(chuàng)建的菜單項(xiàng),其名字依次為“左面動(dòng)物的圖像”、“右面動(dòng)物的圖像”和“左右面動(dòng)物的默認(rèn)圖像”,這三個(gè)菜單項(xiàng)被添加到菜單項(xiàng)menuImage中。oneGradeResult、twoGradeResult、threeGradeResult、customGradeResult和limitTime也是JMenuItem創(chuàng)建的菜單項(xiàng),其名字依次為“初級(jí)英雄榜”、“中級(jí)英雄榜”、“高級(jí)英雄榜”、“自定義英雄榜”、“我超時(shí)了嗎”,這五個(gè)菜單項(xiàng)被添加到菜單項(xiàng)menuHero中。helpcontent和aboutUs是JMenuItem創(chuàng)建的菜單項(xiàng),它們的名字依次為“游戲規(guī)則”、和“關(guān)于我們”,這兩個(gè)菜單項(xiàng)被添加到菜單項(xiàng)menuHelp中。oneGradeItem、twoGradeItem、threeGradeItem和custom以及l(fā)eftImage、rightImage和defaultImage等菜單項(xiàng)都將當(dāng)前窗口注冊(cè)為自己的ActionEvent事件監(jiān)視器。
renew、quit和autoButton是JButton創(chuàng)建的按鈕對(duì)象,名字依次為“重新開始”、“撤銷”和“自動(dòng)演示”。renew、quit和autoButton都將當(dāng)前窗口注冊(cè)為自己的ActionEvent事件監(jiān)視器。
3)方法
ChangeAnimalWindow()是構(gòu)造方法,負(fù)責(zé)完成窗口的初始化。
init()方法負(fù)責(zé)完成Animal、Stone和Point對(duì)象的創(chuàng)建。
setAmoutOfAnimal(int)方法負(fù)責(zé)設(shè)置動(dòng)物的個(gè)數(shù),即amountOfAnimal的值。
removeAnimalAndStone()方法負(fù)責(zé)從窗體中移掉動(dòng)物和石頭,即移掉Animal對(duì)象和Stone對(duì)象。
needDoing()方法負(fù)責(zé)執(zhí)行一些經(jīng)常需要重復(fù)執(zhí)行的代碼。
actionPerformed(ActionEvent)方法是ChangeAnimalWindow類實(shí)現(xiàn)的ActionListener接口中的方法。ChangeAnimalWindow創(chuàng)建的窗口是oneGradeItem、twoGradeItem、threeGradeItem、custom、leftImage、rightImage、defaultImage等菜單項(xiàng)和renew、quit、autoButton按鈕的ActionEvent事件監(jiān)視器。當(dāng)用戶選中某個(gè)菜單項(xiàng)或單擊按鈕時(shí),窗口將執(zhí)行actionPerformed(ActionEvent)方法進(jìn)行相應(yīng)的操作。如果用戶選中oneGradeItem、twoGradeItem、threeGradeItem和custom四個(gè)菜單項(xiàng)的某一項(xiàng)時(shí),actionPerformed(ActionEvent)方法所執(zhí)行的操作就是改變amountOfAnimal的值,并執(zhí)行needDoing()方法,完成必要的初始化。如果用戶選中l(wèi)eftImage和rightImage菜單項(xiàng)的某一個(gè)時(shí),actionPerformed(ActionEvent)方法所執(zhí)行的操作就是改變leftImageFile和rightImageFile的引用。當(dāng)用戶單擊renew按鈕時(shí),actionPerformed(ActionEvent)方法所進(jìn)行的操作是保持當(dāng)前的amountOfAnimal的值,并執(zhí)行needDoing()方法,完成必要的初始化,當(dāng)用戶單擊quit按鈕時(shí),actionPerformed(ActionEvent)方法所進(jìn)行的操作是撤銷當(dāng)前“動(dòng)物”的前一次跳躍。當(dāng)用戶單擊autoButton按鈕時(shí),actionPerformed(ActionEvent)方法所進(jìn)行的操作是彈出autoMoveAnimal對(duì)話框,用戶可以通過該對(duì)話框讓程序顯示動(dòng)物換位過程。
main(String)方法是程序運(yùn)行的入口方法。
2.2.2 Animal類
自定義Animal類繼承javax.swing.JPanel,其對(duì)象是數(shù)組animal的單元中的對(duì)象。Animal型數(shù)組animal是ChangeAnimalWindow窗口的重要成員之一。標(biāo)明Animal類的主要成員變量和方法以及和ChangeAnimalWindow類之間組合關(guān)系的UML圖,如圖2-2-3所示。



成員變量
point是Point型對(duì)象,用來確定Animal對(duì)象在窗口中的位置。
isLeft是boolean型數(shù)據(jù),用來確定Animal對(duì)象是否為“左”。
tool是Toolkit對(duì)象,用來獲得Image對(duì)象。
leftImage和rightImage是File類型的對(duì)象,用來確定Animal對(duì)象上繪制的圖像文件。
方法
Animal()是構(gòu)造方法,負(fù)責(zé)完成Animal對(duì)象的初始化。
Animal對(duì)象調(diào)用setLeftImage(File)方法可以設(shè)置leftImage文件對(duì)象。
Animal對(duì)象調(diào)用setRightImage(File)方法可以設(shè)置rightImage文件對(duì)象。
Animal對(duì)象調(diào)用setIsLeft(boolean)設(shè)置自己是否為“左”的動(dòng)物,即設(shè)置isLeft屬性的值。
Animal對(duì)象調(diào)用getIsLeft()方法判斷自己是否為“左”的動(dòng)物,即返回isLeft屬性的值。
Animal對(duì)象調(diào)用setAtPoint(Point)方法設(shè)置自己所在的“點(diǎn)”,即設(shè)置屬性point的對(duì)象引用。
Animal對(duì)象調(diào)用getAtPoint()返回自己所在的“點(diǎn)”,即返回point對(duì)象的引用。
Animal對(duì)象調(diào)用paintComponent(Graphics)方法繪制圖像,即繪制tool對(duì)象根據(jù)leftImage或rightImage文件所創(chuàng)建的Image對(duì)象。
2.2.3 Point類
Point創(chuàng)建的對(duì)象含有兩個(gè)重要int型數(shù)據(jù),分別用來表示窗體坐標(biāo)系中的x軸坐標(biāo)和y軸坐標(biāo)值,窗體坐標(biāo)系的原點(diǎn)是窗體的左上角,向右是x軸的正向,向下是y軸的正向。Point類創(chuàng)建的對(duì)象是數(shù)組point的單元中的對(duì)象。Point型數(shù)組point是ChangeAnimalWindow窗口的重要成員之一,其單元中的Point對(duì)象用來確定Animal對(duì)象和Stone對(duì)象在窗體中的位置。標(biāo)明Point類的主要成員變量和方法以及和ChangeAnimalWindow類之間的組合關(guān)系的UML圖,如圖2-2-4所示。


成員變量
x和y是Point對(duì)象中的兩個(gè)int型數(shù)據(jù),分別用來表示窗體坐標(biāo)系中的x軸和y軸坐標(biāo)值。
haveAnimal是boolean數(shù)據(jù),如果有Animal對(duì)象在該P(yáng)oint對(duì)象上時(shí),該數(shù)據(jù)為true;否則為false。
animal是Animal類聲明的對(duì)象,用來存放一個(gè)Animal對(duì)象的引用,標(biāo)明該Animal對(duì)象在當(dāng)前Point對(duì)象上。
2)方法
Point(int x,int y)是構(gòu)造方法,用來創(chuàng)建Point對(duì)象。
Point對(duì)象調(diào)用isHaveAnimal()方法可以返回一個(gè)boolean數(shù)據(jù),如果當(dāng)前Point對(duì)象上有Animal對(duì)象,isHaveDisc()方法返回true;否則返回false。
Point對(duì)象調(diào)用setIsHaveAnimal(boolean boo)方法可以根據(jù)參數(shù)boo的值設(shè)置當(dāng)前Point對(duì)象上是否有Animal對(duì)象。
Point對(duì)象getX()和getY()方法可以返回其中的x軸坐標(biāo)和y軸坐標(biāo)。
Point對(duì)象調(diào)用equals(TowerPoint p)方法可以判斷當(dāng)前Point對(duì)象是否和參數(shù)p指定的Point對(duì)象相同。
Point對(duì)象調(diào)用setThisAnimal(Animal animal)方法,指定參數(shù)animal在當(dāng)前Point對(duì)象上。
Point對(duì)象調(diào)用getThisAnimal()方法可以返回當(dāng)前Point對(duì)象上的Animal對(duì)象。
Point對(duì)象調(diào)用setThisStone(Stone stone)方法,指定參數(shù)stone在當(dāng)前Point對(duì)象上。
Point對(duì)象調(diào)用getThisStone()方法可以返回當(dāng)前Point對(duì)象上的Stone對(duì)象。
2.2.4 Stone類
Stone類是javax.swing包中JButton按鈕組件的一個(gè)子類,創(chuàng)建的對(duì)象是數(shù)組stone的單元中的對(duì)象。Stone型數(shù)組stone是ChangeAnimalWindow窗口的重要成員之一。標(biāo)明Stone類主要成員變量和方法以及和ChangeAnimalWindow類之間的組合關(guān)系的UML圖,如圖2-2-5所示。


1)成員變量
     point是Point型數(shù)組,用來存放ChangeAnimalWindow窗體中point數(shù)組的引用。
step是ArrayList<Integer>數(shù)組表,用來存放移動(dòng)“動(dòng)物”的步驟。
spendTime用來記錄用戶移動(dòng)“動(dòng)物”所用時(shí)間。
recordTime是計(jì)時(shí)器。
success是boolean型數(shù)據(jù),當(dāng)該變量的值為true時(shí)表示用戶成功地將左右動(dòng)物換位。
countTime是boolean型數(shù)據(jù),當(dāng)該變量的值為true時(shí),將啟動(dòng)計(jì)時(shí)器為用戶計(jì)時(shí);否則不為用戶計(jì)時(shí)。
showTime是JTextField創(chuàng)建的文本框,負(fù)責(zé)顯示用時(shí)。
2)方法
HandleMouse()是構(gòu)造方法,負(fù)責(zé)創(chuàng)建HandleMouse對(duì)象。
handleMouse對(duì)象調(diào)用setPoint(Point[ ])方法將ChangeAnimalWindow窗體中的point對(duì)象的引用傳遞給該對(duì)象中的point,以便handleMouse移動(dòng)窗體中的Animal對(duì)象。
handleMouse對(duì)象調(diào)用initStep()方法清空step中的數(shù)據(jù)。
handleMouse對(duì)象調(diào)用initSpendTime()將spendTime的值設(shè)置為0。
handleMouse對(duì)象調(diào)用setCountTime(boolean)設(shè)置是否啟動(dòng)計(jì)時(shí)器。
handleMouse對(duì)象調(diào)用getStep()返回step對(duì)象。
mousePressed(MouseEvent)是HandleMouse類實(shí)現(xiàn)的MouseListener接口中的方法,當(dāng)用戶用在ChangeAnimalWindow窗體中的Animal對(duì)象上按下鼠標(biāo)時(shí),將觸發(fā)MouseEvent鼠標(biāo)事件,handleMouse對(duì)象將調(diào)用執(zhí)行mousePressed(MouseEvent)方法對(duì)事件作出處理,即根據(jù)規(guī)則移動(dòng)當(dāng)前被鼠標(biāo)單擊的Animal對(duì)象。
mouseReleased(MouseEvent)方法是HandleMouse類實(shí)現(xiàn)的MouseListener接口中的方法,ChangeAnimalWindow窗體中的Animal對(duì)象上釋放鼠標(biāo)時(shí),將觸發(fā)MouseEvent鼠標(biāo)事件,handleMouse對(duì)象將調(diào)用執(zhí)行mouseReleased(MouseEvent)方法對(duì)事件作出處理,其主要操作是判斷用戶是否已經(jīng)成功地將左右動(dòng)物換位。
actionPerformed(ActionEvent)是HandleMouse類實(shí)現(xiàn)的ActionListener接口中的方法。使用Timer類的構(gòu)造方法:Timer(int a,Object b)創(chuàng)建了計(jì)時(shí)器:recordTime,其中的參數(shù)a的單位是毫秒,確定計(jì)時(shí)器每隔a毫秒“振鈴”一次,參數(shù)b是計(jì)時(shí)器的監(jiān)視器。在這里取a=1000,監(jiān)視器b是當(dāng)前handleMouse對(duì)象。計(jì)時(shí)器發(fā)生的振鈴事件是ActionEvent事件,當(dāng)振鈴事件發(fā)生時(shí),監(jiān)視器就會(huì)監(jiān)視到這個(gè)事件,監(jiān)視器就會(huì)調(diào)用actionPerformed(ActionEvent)方法。當(dāng)振鈴每隔1000毫秒發(fā)生一次時(shí),方法actionPerformed(ActionEvent)就被執(zhí)行一次,所執(zhí)行的操作就是按著step指定的步驟移動(dòng)一個(gè)Animal對(duì)象。
2.2.6 AutoMoveAnimal類
AutoMoveAnimal類是javax.swing包中JDialog的子類,并實(shí)現(xiàn)了ActionListener接口,創(chuàng)建的對(duì)象autoMoveAnimal是ChangeAnimalWindow的成員之一。標(biāo)明AutoMoveAnimal類的主要成員變量、方法以及和ChangeAnimalWindow類之間的組合關(guān)系的UML圖,如圖2-2-7所示。

1)成員變量
point是Point型數(shù)組,用來存放ChangeAnimalWindow窗體中point數(shù)組的引用。
step是ArrayList<Integer>型對(duì)象,用來存放移動(dòng)“動(dòng)物”的步驟。
bStart,bStop,bContinue,bClose是JButton按鈕,當(dāng)用戶單擊bStart按鈕時(shí),程序?qū)粗鴖tep中的步驟開始移動(dòng)動(dòng)物;單擊按鈕bStop時(shí),暫停移動(dòng)動(dòng)物;單擊bContinue按鈕時(shí),恢復(fù)移動(dòng)動(dòng)物;單擊bClose按鈕時(shí),關(guān)閉當(dāng)前對(duì)話框,并停止移動(dòng)動(dòng)物。
time是javax.swing包中Timer類創(chuàng)建的計(jì)時(shí)器。使用Timer類的構(gòu)造方法:Timer(int a,Object b)創(chuàng)建一個(gè)計(jì)時(shí)器,其中的參數(shù)a的單位是毫秒,確定計(jì)時(shí)器每隔a毫秒“振鈴”一次,參數(shù)b是計(jì)時(shí)器的監(jiān)視器,在這里我們?nèi)=1000,監(jiān)視器b是當(dāng)前對(duì)話框。計(jì)時(shí)器發(fā)生的振鈴事件是ActionEvent類型事件,當(dāng)振鈴事件發(fā)生時(shí),監(jiān)視器就會(huì)監(jiān)視到這個(gè)事件,監(jiān)視器就回調(diào)ActionListener接口中的actionPerformed方法。當(dāng)振鈴每隔1000毫秒發(fā)生一次時(shí),方法actionPerformed就被執(zhí)行一次,并按著step指定的步驟移動(dòng)一個(gè)動(dòng)物。
2)方法
AutoMoveAnimal()是構(gòu)造方法,用來創(chuàng)建對(duì)象autoMoveAnimal。
autoMoveAnimal對(duì)象調(diào)用setPoint(Point[ ])方法將ChangeAnimalWindow窗體中point數(shù)組的引用傳遞給對(duì)象,以便autoMoveAnimal對(duì)象移動(dòng)ChangeAnimalWindow窗體中的動(dòng)物。
actionPerformed(ActionEvent)是接口ActionListener中的方法。當(dāng)用戶單擊bStart、bStop、bContinue或bClose當(dāng)中任何一個(gè)按鈕時(shí),autoMoveDisc對(duì)象將調(diào)用執(zhí)行actionPerformed(ActionEvent)方法,該方法的操作是,如果用戶單擊了bStart按鈕,就按著moveStep中的步驟開始移動(dòng)盤子;如果單擊了bStop按鈕,就暫停移動(dòng)盤子;如果單擊了bContinue按鈕,就恢復(fù)移動(dòng)盤子;如果單擊了bClose按鈕,就關(guān)閉當(dāng)前對(duì)話框,并停止移動(dòng)盤子。
autoMoveAnimal對(duì)象調(diào)用setStep()方法設(shè)置step對(duì)象中的數(shù)據(jù)。step是ArrayList<Integer>,存放著移動(dòng)“動(dòng)物”的步驟,這些步驟是setStep()用算法生成了整數(shù)序列,例如,當(dāng)step中存放的整數(shù)序列是“4,3,2,4”時(shí),那么該序列表示了兩個(gè)連續(xù)的移動(dòng)步驟:“將point[4]上的動(dòng)物移動(dòng)到point[3]上”和“將point[2]上的動(dòng)物移動(dòng)到point[4]上”。
2.2.7 ShowRecordDialog類
ShowRecordDialog類是javax.swing包中JDialog的子類,并實(shí)現(xiàn)了ActionListener接口,該類創(chuàng)建的對(duì)象showDialog是ChangeAnimalWindow窗口的成員之一。當(dāng)用戶選擇窗口上的“英雄榜”菜單中的選項(xiàng),該對(duì)話框可見,并顯示相應(yīng)級(jí)別文件中存儲(chǔ)的成績(jī)。標(biāo)明ShowRecordDialog類的主要成員變量、方法以及和ChangeAnimalWindow類之間組合關(guān)系的UML圖,如圖2-2-8所示。


1)成員變量
gradeFile是對(duì)話框要讀取的文件,該文件存儲(chǔ)成績(jī)。
clear是注冊(cè)了ActionEvent事件的按鈕。
showArea文本區(qū)顯示對(duì)話框從gradeFile文件中讀出的成績(jī)。
treeSet負(fù)責(zé)將成績(jī)按高低排序。
2)方法
ShowRecordDialog()是構(gòu)造方法,負(fù)責(zé)創(chuàng)建showDialog對(duì)象。
setGradeFile(File)方法。ShowRecordDialog類創(chuàng)建的ShowRecordDialog對(duì)話框是主類ChangeAnimalWindow窗口中的一個(gè)成員。當(dāng)用戶選擇窗口上的“英雄榜”菜單中的菜單項(xiàng)時(shí),ShowRecordDialog對(duì)話框調(diào)用setGradeFile(File)方法將相應(yīng)的級(jí)別文件傳遞給gradeFile。
showRecord()方法。ShowRecordDialog對(duì)話框調(diào)用showRecord()方法讀取gradeFile文件中的成績(jī),為了將成績(jī)按高低順序顯示在showArea文本區(qū)中,showRecord()方法根據(jù)讀取的名字和該名字的對(duì)應(yīng)成績(jī),創(chuàng)建一個(gè)People對(duì)象,并將該P(yáng)eople對(duì)象存放在treeSet樹集中。
actionPerformed(ActionEvent)是ActionListener接口中的方法,clear注冊(cè)了ActionEvent事件,當(dāng)用戶單擊clear按鈕時(shí),actionPerformed(ActionEvent)方法被調(diào)用執(zhí)行,清除gradeFile文件中的內(nèi)容。
2.2.8 People類
People對(duì)象中的數(shù)據(jù)由ShowRecordDialog對(duì)話框從gradeFile文件中讀取的用戶姓名和成績(jī)所構(gòu)成。ShowRecordDialog對(duì)話框?qū)eople對(duì)象作為其treeSet樹集上的節(jié)點(diǎn),以便按著成績(jī)高低排列People對(duì)象。標(biāo)明People的主要成員變量、方法以及和ShowRecordDialog類之間關(guān)系的UML圖,如圖2-2-9所示。


以下是UML圖中有關(guān)數(shù)據(jù)和方法的詳細(xì)說明。
1)成員變量
name是用戶的名字。
time是用戶的用時(shí)。
2)方法
getTime()方法返回time。
getName()方法返回name。
compareTo(Object)是comparable接口中的方法,其操作是確定People對(duì)象的大小關(guān)系。
2.2.9 Record類
Record是javax.swing包中JDialog的子類,并實(shí)現(xiàn)了ActionListener接口,該類創(chuàng)建的對(duì)象record是HandleMouse類的成員之一。當(dāng)用戶成功完成游戲時(shí),程序彈出Record對(duì)話框,用戶使用該對(duì)話框提供的界面將成績(jī)保存到相應(yīng)的文件中。標(biāo)明Record類的主要成員變量、方法以及和HandleMouse類之間關(guān)系的UML圖,如圖2-2-10所示。

1)成員變量
time是用戶的用時(shí)。
yourName是用戶用來輸入名字的文本框。
enter、cancel是按鈕對(duì)象,用戶單擊enter按鈕可保存成績(jī),單擊cancel按鈕可放棄保存成績(jī)。
gradeFile是級(jí)別文件。
2)方法
Record()是構(gòu)造方法,負(fù)責(zé)創(chuàng)建record對(duì)象。
setGradeFile(File)方法。Record類創(chuàng)建的Record對(duì)話框是測(cè)試區(qū)HandleMouse中的一個(gè)成員。當(dāng)用戶成功完成游戲時(shí)測(cè)試區(qū)彈出Record對(duì)話框,Record對(duì)話框?qū)⒄{(diào)用setGradeFile(File)方法將測(cè)試區(qū)中的級(jí)別文件傳遞給Record對(duì)話框gradeFile。
setTime(int)方法。當(dāng)用戶成功完成游戲后,測(cè)試區(qū)彈出Record對(duì)話框,Record對(duì)話框?qū)⒄{(diào)用setTime(int)方法將測(cè)試區(qū)記錄的用戶用時(shí)傳遞給Record對(duì)話框中的time。
actionPerformed(ActionEvent)是ActionListener接口中的方法,enter和cancel按鈕注冊(cè)了ActionEvent事件,當(dāng)用戶單擊enter時(shí),actionPerformed(ActionEvent)方法被調(diào)用執(zhí)行,其操作是將用戶在文本框yourName中輸入的名字以及time的值保存到gradeFile文件中,然后關(guān)閉當(dāng)前對(duì)話框;當(dāng)用戶單擊cancel按鈕時(shí),actionPerformed(ActionEvent)方法將被調(diào)用執(zhí)行,其操作是關(guān)閉當(dāng)前對(duì)話框。
2.2.10 Customdlg類
Customdlg是javax.swing包中JDialog的子類,并實(shí)現(xiàn)了ActionListener接口,該類創(chuàng)建的對(duì)象record是ChangeAnimalWindow類的成員之一。當(dāng)用戶單擊菜單中“自定義”級(jí)別按鈕設(shè)置時(shí),程序彈出Customdlg對(duì)話框,用戶使用該對(duì)話框可以設(shè)置游戲的動(dòng)物數(shù)量。標(biāo)明Customdlg類的主要成員變量、方法以及和ChangeAnimalWindow類之間關(guān)系的UML圖,如圖2-2-11所示。




2.3.   程序測(cè)試2.3.1 主程序
圖2-3-1  主窗口調(diào)試
圖2-3-2  游戲運(yùn)行調(diào)試





2.3.2 組件測(cè)試

圖2-3-3  自動(dòng)演示按鈕調(diào)試
2.3.3 菜單測(cè)試
選擇級(jí)別
選擇級(jí)別菜單調(diào)試如圖2-3-4、圖2-3-5:
圖2-3-4  選擇“中級(jí)”級(jí)別
圖2-3-5  選擇“中級(jí)”級(jí)別后動(dòng)物數(shù)量發(fā)生變化
選擇動(dòng)物圖像菜單測(cè)試如圖2-3-6、圖2-3-7、圖2-3-8所示
圖2-3-6  選擇“左面動(dòng)物的圖像”
圖2-3-7 彈出打開對(duì)話框,選擇pigone.jpg
圖2-3-8  左邊動(dòng)物圖像變成了pigone.jpg
選擇英雄榜中“初級(jí)英雄榜”調(diào)試圖,如圖2-3-9、2-3-10所示
圖2-3-9  選擇“初級(jí)英雄榜”
圖2-3-10  彈出“初級(jí)英雄排行榜”對(duì)話框
選擇英雄榜中“我超時(shí)了嗎”,驗(yàn)證我的游戲時(shí)間,如圖2-3-11、2-3-12、2-3-13:
圖2-3-11 點(diǎn)擊“我超時(shí)了嗎”
圖2-3-12  在超過(動(dòng)物數(shù)量*5)s=6*5=30的時(shí)間里彈出對(duì)話框
圖2-3-13  超過時(shí)間后左右兩邊的圖像會(huì)換掉


選擇“幫助”調(diào)試圖,如圖2-3-14、2-3-15:
圖2-2-14  點(diǎn)擊“游戲規(guī)則”
圖2-3-15  彈出“游戲規(guī)則”對(duì)話框



3.   本設(shè)計(jì)改進(jìn)建議

針對(duì)本設(shè)計(jì)由于時(shí)間和技術(shù)有限,我覺得還有如下需要改進(jìn)的地方:

對(duì)“自定義”級(jí)別動(dòng)物數(shù)量設(shè)置中,數(shù)量輸入時(shí)不能太大,否則在主窗口顯示的動(dòng)物圖像會(huì)非常窄小。建議應(yīng)設(shè)定一個(gè)上限,當(dāng)達(dá)到上限時(shí)彈出提示信息,提醒用戶“您輸入的數(shù)量太大”。對(duì)“我超時(shí)了嗎”,如果超時(shí),則彈出提示消息后,左右兩邊圖像被其他圖像代替。但是如果在沒有關(guān)閉游戲時(shí),重新開始再玩一盤,如果再超時(shí),同樣彈出提示信息,但圖像不會(huì)再調(diào)換。因此,建議能在此改進(jìn),使得能不停調(diào)換。對(duì)“英雄榜”中記錄用戶玩游戲時(shí)的成績(jī),但不能在當(dāng)玩家成績(jī)?cè)谂判邪裰信胚M(jìn)前三彈出提示信息。在此希望在以后的學(xué)習(xí)中繼續(xù)改進(jìn)。


在設(shè)計(jì)的過程中了解到自己的知識(shí)還是比較有限,更肯定了自己在以后學(xué)習(xí)編程的道路.上堅(jiān)定不移的但由于只學(xué)習(xí)了一個(gè)學(xué)期的JAVA語言,自己水平有限,使得程序還有不是很完善; 顧起此次java,至今我仍感慨頗多,的確,從選題到定稿,從理論到實(shí)踐,在整整兩個(gè)星期的日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的的東西


以上的Word格式文檔51黑下載地址(不含程序):

艾克拜爾·伊波拉音.doc (1.33 MB, 下載次數(shù): 9)









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1