- 瘋狂Java實戰演義
- 楊恩雄 麥凱翔編著
- 2042字
- 2018-12-27 17:17:01
1.3 創建游戲的各個對象
這里設計三個類來完成游戲的功能:棋盤類(Chessboard),游戲類(GobangGame)與棋子類(Chessman)(枚舉類),類的關系如圖1.2所示。從圖中可以看出,Chessboard依賴于GobangGame,GobangGame的改變,會影響到Chessboard狀態的改變,而Chessman與GobangGame是一個聚合關系。下面一一介紹。

圖1.2 五子棋類圖
1.3.1 Chessboard類
要進行五子棋游戲,必須要有一個棋盤,而這個類主要控制棋盤的初始化、輸出及增加新的棋子。這個類包含以下方法:
void initBoard(),這個方法用于初始化棋盤,開始新的游戲時,應該調用此方法,初始化出一個新的空棋盤。
void printBoard(),此方法用于在控制臺輸出棋盤,各方每下完一顆棋子后,由于棋盤上棋子的狀態有改變,所以必須調用此方法重新輸出棋盤。
void setBoard( int posX , int posY , String chessman ),posX與posY是新下棋子的x與y坐標,chessman是新下棋子的類型(黑子與白子),每下完一顆棋子后,通過調用此方法把棋子設置到棋盤上。
String[][] getBoard(),返回棋盤,返回類型是保存棋盤的二維數組。
當需要初始化棋盤的時候,可以直接調用Chessboard的initBoard方法,我們需要考慮該方法要實現的功能:初始化棋盤。由于我們將棋盤看做是一個二維數組,因此initBoard需要幫我們創建一個二維數組,創建二維數組可以使用以下代碼:
代碼清單:code\gobang\src\org\crazyit\gobang\Chessboard.java
Object[][] array = new Object[size][size]; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { array[i][j] = new Object(); } }
以上代碼創建了一個固定大小(一維與二維大?。┑亩S數組,并通過嵌套循環為數組中的每一個元素進行賦值。在游戲中如果我們進行了下棋的操作,可以直接改變這個數組的某一個元素值。在創建Chessboard類時,我們就需要發揮面向對象的思維,在我們的程序中,所有看到的或者想到的事物,我們都可以將其抽象成具體的某個對象,并賦予一定的屬性與行為。在設計對象的過程中,如果有某些事物拿捏不準,不知如何設計屬性或者行為,可以將其設計成接口或者抽象類。
Chessboard中提供了一個printBoard方法用于打印棋盤,在本章中,我們只需要將棋盤數組打印到控制臺中,因此該方法可以簡單地調用System.out.print去打印相關的字符串。需要注意的是,由于printBoard方法是沒有參數的,因此我們需要為Chessboard提供一個二維數組變量,當調用printBoard方法的時候,打印對象內的二維數組。我們可以將Chessboard看做一個有狀態的Java對象,有狀態的Java對象可以理解成一個Java對象保存了一些與該對象相關的狀態屬性,如果該對象沒有保存與該對象相關的狀態屬性,那么我們可以將這個對象看成一個無狀態的Java對象。
當外部調用Chessboard的setBoard方法時,就可以將某個值設置到Chessboard中的
二維數組里,告訴Chessboard玩家或者“電腦”在某個位置下了怎樣的棋子。
1.3.2 Chessman類
Chessman類是一個枚舉類,此類是構造器私有的,不能直接創建,里面有BLACK與WHITE兩個靜態屬性,代表黑子與白子枚舉類,兩個靜態屬性都是Chessman類型的。要獲取棋子,需要通過這兩個屬性調用以下的方法:
String getChessman(),返回String類型的棋子實例,“●”或者“○”。
如果需要得到棋子的字符串(“●”或者“○”),可以使用以下的代碼:
代碼清單:code\gobang\src\org\crazyit\gobang\Chessman.java
Chessman.BLACK.getChessman();
1.3.3 GobangGame類
GobangGame類是進行游戲的類,Chessboard依賴于此類,此類負責控制游戲的開始、重玩與結束,并影響Chessboard類。它主要包含以下構造器與方法:
GobangGame(),默認無參數構造器。
GobangGame( Chessboard chessboard ),有參數構造器,以一個Chessboard實例去初始化這個類。
boolean isValid( String inputStr ),此方法驗證控制臺的輸入字符串是否合法,如果合法,返回true,否則返回false。此方法拋出Exception異常。
void start(),開始游戲。此方法拋出Exception異常。
boolean isReplay( String chessman ),是否重新開始游戲,如果是,返回true,否則返回false,參數chessman代表黑子或白子。
int[] computerDo(),“電腦”隨機下棋,由“電腦”自動設置棋盤,并返回包含新下棋子位置x與y坐標的int[]數組類型。
boolean isWon( int posX , int posY , String ico ),判斷輸贏,參數posX與posY代表新下棋子的x與y坐標,ico代表新下的棋子類型,如果贏了,返回true,否則返回false。
GobangGame是我們五子棋游戲的主體類,游戲里面所有的處理都在該類中實現。GobangGame中的isValid方法用于驗證控制臺的輸入,玩家主要在控制臺輸入下棋的坐標,下棋的坐標的字符串形式為:x,y,我們需要對字符串進行處理得到x和y的值,如果玩家輸入的字符串不符合系統要求,則isValid方法返回false,只有當該方法返回true的時候,才會去修改Chessboard二維數組。
GobangGame中提供了一個start方法,用于游戲的開始,我們需要考慮游戲開始的行為,例如需要初始化棋盤(調用Chessboard的initBoard方法),需要開始從控制臺讀取玩家的輸入信息、打印棋盤和驗證控制臺輸入的信息等,這些功能我們將在下面的章節中加以描述。
當輪到“電腦”下棋的時候,我們需要隨機生成其下棋坐標,GobangGame中的computerDo方法用于隨機產生坐標。
判斷一局游戲是否勝利,可以調用GobangGame的isWon方法,該方法是五子棋中最主要的方法,五子棋是否可以相連的所有邏輯,都會在該方法中實現。isWon方法會在每次下棋后(玩家下棋或者“電腦”下棋)調用。
至此,游戲中的三個對象已經設計完成,這三個對象中已經定義好了各種方法,并在前面章節中詳細描述了各個方法的作用,在下面章節中我們將開始對這三個對象所定義的方法進行實現。當然,如果需要做到更好的程序解耦,我們可以使用一些設計模式,例如將游戲規則寫成一個具體的算法,可以使用策略模式,如果需要產生出不同的棋子(將控制臺換成其他界面),可以編寫棋子工廠等。但是本章的主要目的是展現一個最簡單的五子棋,因此本章中并不涉及任何具體的設計模式。
- Word 2003、Excel 2003、PowerPoint 2003上機指導與練習
- 大數據管理系統
- LabVIEW虛擬儀器從入門到測控應用130例
- 工業機器人工程應用虛擬仿真教程:MotoSim EG-VRC
- Embedded Programming with Modern C++ Cookbook
- 信息物理系統(CPS)測試與評價技術
- 我也能做CTO之程序員職業規劃
- OpenStack Cloud Computing Cookbook
- Docker on Amazon Web Services
- Microsoft System Center Confi guration Manager
- 網絡管理工具實用詳解
- 電子設備及系統人機工程設計(第2版)
- Flink原理與實踐
- 計算機辦公應用培訓教程
- Windows 7來了