2017-09-14 33 views
1

我目前正在編寫一個國際象棋程序,並且在Board類中使用Piece類時遇到問題。在開發國際象棋程序時使用另一個班級(Java)

所以,我的基本思路如下:

我創建了一個包含X片類,y座標,顏色和空的狀態。然後,我創建了一個Board類,它將生成一個2D Piece數組來生成棋盤狀結構。

因此,舉例來說,我想這樣做

Board board = new Board(); // This will generate a 2D array of Piece class. 
Rook r1 = new Rook(0, 0, BLACK, false); //subclass of Piece 
board.movePiece(r1, 1, 1); // moves r1 to 1,1 

但是,我有是問題,

public class Board { 

    private static final int NUM_OF_ROWS = 8; 
    private static final int NUM_OF_COLS = 8; 

    private static final Piece[][] board = generateBoard(); 

    private static Piece[][] generateBoard() { 

     Piece[][] board = new Piece[NUM_OF_ROWS][NUM_OF_COLS]; 

     for(int i = 0; i < NUM_OF_ROWS; i++) { 
      for(int j = 0; j < NUM_OF_COLS; j++) { 

       board[i][j] = new Piece(i, j, null, true); 

      } 
     } 

     return board; 

    } 
} 

如果我這樣做是爲了自動生成2D-件 - 陣列,每當我實例化一個新的董事會,它給了我一個錯誤,我不能實例化新的Piece();因爲它是一個抽象類。如果我擴展Piece類,它會變得更加複雜,並且實際上並不明智地讓董事會擴展一塊。

我該如何解決這種設計明智和代碼明智?我現在缺少什麼東西?我也將下面的代碼放在Piece類中。

public abstract class Piece { 

    int x, y; 
    Players color; 
    boolean isEmpty; 

    Piece(int x, int y, Players color, boolean isEmpty){ 
     this.x = x; 
     this.y = y; 
     this.color = color; 
     this.isEmpty= isEmpty; 
    } 

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

    Players getColor() { 
     return color; 
    } 

} 
+1

你不會實例化'Piece';你會實例化它的具體的後代,比如「Rook」,「Pawn」,「Knight」,「King」或「Queen」。 –

回答

0

我建議你分開邏輯consening有效的地方爲一塊。舉例來說,保留片類僅用於類型並實現不同片​​段的運動。