2017-09-14 96 views
2

我正在用Java編寫一個國際象棋庫並專注於它的面向對象的設計。我的想法是創建一個名爲Tile的類,它包含座標(x,y),布爾isOccupied和它包含的塊的信息。用Java創建一個二維數組(開發國際象棋)

它看起來像這樣:

public abstract class Tile { 

    boolean isOccupied; 
    int x, y; 
    Piece piece; 

    Tile(boolean isOccupied, int x, int y, Piece piece) { 

     this.isOccupied = isOccupied; 
     this.x = x; 
     this.y = y; 
     this.piece = piece; 

    } 

    //Returns the piece on the tile - will be implemented in the subclass 
    public abstract Piece getPiece(); 

    //Places a piece on the tile - will be implemented in the subclass 
    public abstract void placePiece(Piece piece); 

    public abstract void removePiece(); 

} 

然後,在我的作品類,我試圖做的是檢查的一塊目的地是否是一個有效的位置的方法。該函數聲明可能看起來像:

public abstract boolean isValidLocation(Tile[][] board, int fromX, int fromY, int toX, int toY); 

我期待着創建一個名爲板類瓷磚的二維數組,並設置起點座標和終點座標,做每件子類,看是否計算目標位置是有效的。

我的問題是:

1)是否有可能創建一個類(瓷磚的二維數組)像這樣,讓我想到它的工作?

2)我將不得不添加一個函數,在我的類的任何地方生成'n x n'Tile數組?

3)有沒有更簡單的方法來做到這一點?

+0

你真的需要'Tile'類嗎? 「Piece」數組不會更好,空元素是自由方塊。 – Kayaman

+0

如果我想在將來將其擴展到GUI,我是不是需要Tile或Board類? – user6792790

+0

一個'Board'類對於數組來說是一個很好的容器,但是對於GUI本身並不需要。一個基於數組進行自定義繪製的JPanel子類就足夠了。雖然我相信你認爲'GridLayout'是一個棋盤的完美用例(不是)),所以將每個tile和piece建模爲一個GUI元素都有點粗略。 – Kayaman

回答

0

要anwser您的問題:

1)是的,它是可能的,可能會按預期

2)在構造函數可以初始化二維數組,只是每一個X,Y填充與一個空的瓦片。

3)一個簡單的方法來做到這一點可能只是做一個你的Piece類的2D陣列。 這將是類似Piece[x][y]。 然後你可以設置一個位置爲Piece,當位置是null這意味着該位置沒有Piece,這將是一個有效的舉措。

+0

謝謝。但是如果我想在將來將它擴展到GUI,我不需要Tile或Board類嗎? – user6792790

+0

關於問題(2)的回答,如果我在構造函數中初始化2D Tile數組,它是否會在我初始化Tile對象時自動生成2D Tile數組?如果是這樣,那麼創建另一個名爲Board的課程會更好嗎? – user6792790

+0

@ user6792790完全沒有。爲了創建您的國際象棋遊戲的GUI,您需要具備的全部內容是:棋子及其座標。擁有Piece的二維數組解決了這兩個要求。 – Asew

0

我會親自去使用一個Piece類和一個Board類。我不明白你爲什麼會介紹一個瓷磚類。

該板保持件的陣列,如:)

ArrayList<Piece> pieces = new ArrayList<Piece>(); 

在板類可以實現渲染(;方法將遍歷這兩個arraylist,請求Piece.location,.player(黑/白),.type(典當,國王,塔等)能夠渲染董事會。

你會實現的另一件事是board.movePiece()將嘗試移動一塊的位置。首先它會詢問piece .isValidLocation,它將調用片斷上的一個方法,片斷將指示移動是否合法。之後,它可以看到棋子移動後會發生什麼(它是否碰到任何其他棋子?遊戲是否通過檢查或同伴檢查?),然後通過調用它自己的GUI重新呈現GUI render()方法。

+1

儘管它不是一個壞主意,但我不喜歡這樣一個事實,即您必須迭代整個'Piece'的'ArrayList'來檢查某個位置是否有一個。雙數組''[] []'使得它更容易。 – Asew

+0

@您可以爭論什麼,這取決於您如何設置應用程序的體系結構。 在你的情況下,你假設它的董事會的責任知道件的位置。在我的情況下,我承擔了維持其位置的責任。 這樣你就可以只需要1件就可以重新繪製自己,並且包含該件內的所有邏輯而不必訪問板對象。棋子的位置,是棋子的屬性,而不是棋盤的屬性。 https://en.wikipedia.org/wiki/Domain-driven_design – RoyB