[英]OOP Design for Chess Game in Java (Trouble with Piece / Board Interaction)
我正在嘗試用Java編寫自己的國際象棋游戲。 我已經開始編寫課程,我的高級想法如下:
我有這些字段的Piece類:
private String name;
private String color;
最初我會為每件作品設置一個x和y坐標,但這似乎更像是一塊板的屬性。 這讓我想到......
我有一個像這樣的字段的Board類:
Piece[][] myBoard = new Piece[8][8];
我不確定我應該在哪里/如何跟蹤作品的位置。 截至目前,我只有一個2d的Piece對象數組。 但是,我認為這會帶來一些挑戰。 例如,假設用戶點擊一塊,想要移動它。 我需要弄清楚移動是否有效,為此,我需要當前的方塊。
如果我對每個棋子都有一個x和y坐標,我會在兩個地方(在Board類的2d數組中)和當前棋子的x和y坐標更新游戲狀態。 這看起來很糟糕......
有什么建議么?
感謝Mariogs的幫助
我可以提供幫助,因為我用Java編寫了一個完整的國際象棋引擎,你可以在這里找到
需要考慮的一些事項:
而不是讓您的電路板成為8x8陣列,為什么不使用64個Tile的單維數組。 Tile
類可以是抽象的,有兩個子類: OccupiedTile
和EmptyTile
。 每個tile可以有一個整數coordinate
,編號為0到63,而OccupiedTile
也有一個Piece
。
Originally I was going to have an x and y coordinate for each piece but that seems like it's more a property of the board. Which brings me to...
一件作品很方便“知道”它的位置,所以用一塊整數字段跟蹤它是不是壞事。
Piece
還應該包括Knight
, Bishop
, Pawn
, Rook
, Queen
和King
等子類。 這樣,他們的toString()
方法可以返回pieceName
的固定值,而不是將其作為成員字段進行跟蹤
最后,為什么沒有名為Alliance
枚舉來追蹤白色或黑色碎片。 String
對於這個工作來說非常脆弱,因為調用者可以將它想要的任何值傳遞給它。 看我的聯盟版本。
我在我的程序中創建了這樣的一塊:
King king = new King(Alliance.BLACK, 4);
我覺得這很可讀。
你的Piece[8][8]
方法似乎足以跟蹤碎片的位置(除了我寧願把它變成自己的類,里面有一個數組,你可能希望它早晚有更多的邏輯)只是設置和移動件)。 至於確定一件可以移動的位置,這似乎是實際作品的一個功能:
public class BoardCoordinates {
public final char vertical;
public final int horizontal;
public BoardCoordinates(char v, int h) { vertical = v; horizontal = h; }
}
public class Board {
private Piece[8][8] state = new Piece[8][8]{};
public Piece at(BoardCoordinates c) {
state[c.vertical - 'a'][c.horizontal];
}
public void set(Piece what, BoardCoordinates where) {
state[where.vertical - 'a'][where.horizontal] = what;
}
public void move(BoardCoordinates from, BoardCoordinates to) {
set(at(from), to);
set(null, from);
}
}
public class Piece {
....
public List<BoardCoordinates> findMoves(BoardCoordinates from, Board theBoard) {
...
}
}
大多數時候,你不需要第二個參數,但是有必要處理特殊情況 - 比如castling或en passant - 其中移動的可能性取決於棋盤上的其他棋子(你實際上需要更多的信息)適當地處理en passant,但這與手頭的問題沒什么關系。
我絕對同意你在每件作品中保持坐標的說法,這聽起來像是一個糟糕的主意。
您的描述中可能缺少另一個對象:BoardTile。 每個BoardTile都知道它的位置,推斷它的顏色和相鄰的瓷磚。 它也知道它是空的還是有任何一塊。 此外,BoardTile和董事會相互了解(顯然!)
鑒於棋子的行為很大程度上取決於它在棋盤中的位置,它應該知道它在哪個瓦片中。 因此,當您首次將所有部分放入董事會時,董事會應為每個部分分配相應的磁貼(請注意,此知識對應於ChessGame的規則,而不是董事會,因為您可能想要使用董事會和部分例如,國際象棋的一種變體。)同樣,當棋子從棋盤中取出(大概是由ChessGame)時,棋子應該丟失它的棋子(通過消滅它)。
有了這三個對象,您將有幾種選擇。 例如,一件作品可以通過回答其拼貼的位置來了解其位置。 董事會可以通過查詢瓷磚等來了解每件的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.