簡體   English   中英

Java中國際象棋游戲的OOP設計(片/板交互的麻煩)

[英]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類可以是抽象的,有兩個子類: OccupiedTileEmptyTile 每個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還應該包括KnightBishopPawnRookQueenKing等子類。 這樣,他們的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM