Java国际象棋游戏的OOP设计(与棋/棋盘互动产生麻烦)

bcl*_*man 5 java oop

我正在尝试用Java编写自己的国际象棋游戏。我已经开始编写类,并且我的高级想法如下:

我有一个与这些领域的计件班:

private String name;
private String color;
Run Code Online (Sandbox Code Playgroud)

最初,我将为每个零件设置一个x和y坐标,但这似乎更像是董事会的财产。带我去...

我有一个具有此类字段的Board类:

Piece[][] myBoard = new Piece[8][8];
Run Code Online (Sandbox Code Playgroud)

我不太确定我应该在哪里/如何跟踪零件的位置。到目前为止,我只有一个二维的Piece对象数组。但是,我认为这将带来一些挑战。例如,假设用户单击了一块,想要移动它。我需要弄清楚该移动是否有效,为此,我需要该棋子所在的当前方块。

如果每个零件都有x和y坐标,那么我将在两个位置(在Board类的2d数组中)和当前零件的x和y坐标处更新游戏的状态。好像不好

有什么建议么?

感谢您的帮助,Mariogs

Ami*_*ani 0

我可以提供帮助,因为我已经用 Java 编写了一个完整的国际象棋引擎,您可以在这里找到

有几点需要考虑:

与其让您的棋盘成为 8x8 的棋子数组,不如使用 64 个Tile的一维数组。该类Tile可以是抽象的并具有两个子类,OccupiedTileEmptyTile。每个图块可以有一个整数coordinate,编号为 0 到 63,并且OccupiedTilesPiece上也有一个 。

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...
Run Code Online (Sandbox Code Playgroud)

对于一个片段来说,“知道”它的位置很方便,因此用片段中的整数字段来跟踪它,恕我直言,并不是一件坏事。

Piece还应该有子类,如KnightBishopPawnRookQueenKing。这样他们的toString()方法就可以返回 的固定值pieceName,而不是将其作为成员字段进行跟踪

最后,为什么不调用枚举Alliance来跟踪白棋或黑棋。 String对于这项工作来说非常脆弱,因为调用者可以向它传递任何它真正想要的值。请参阅我的联盟版本。

我在我的程序中创建了这样的一个片段:

King king = new King(Alliance.BLACK, 4);
Run Code Online (Sandbox Code Playgroud)

我认为这是非常可读的。