我正在尝试用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
答案 0 :(得分:0)
我可以提供帮助,因为我已经用Java编写了一个完整的国际象棋引擎,你可以找到here
需要考虑的一些事项:
为什么不使用64 Tile's的单维数组,而不是让你的棋盘成为8x8阵列。 Tile
类可以是抽象的,有两个子类OccupiedTile
和EmptyTile
。每个图块可以有一个整数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
对于这项工作来说非常脆弱,因为调用者可以将它想要的任何值传递给它。查看我的Alliance版本。
我在程序中创建了这样的作品:
King king = new King(Alliance.BLACK, 4);
我觉得这很可读。
答案 1 :(得分:0)
你的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 - 其中移动的可能性取决于棋盘上的其他棋子(你实际上需要更多信息可以正确处理传递,但与手头的问题没什么关系。
我绝对同意你在每件作品中保持坐标的说法,听起来像是一个可怕的想法。
答案 2 :(得分:0)
您的描述中可能缺少另一个对象:BoardTile。每个BoardTile都知道它的位置,推断它的颜色和相邻的瓷砖。它也知道它是空的还是有任何一块。此外,BoardTile和董事会相互了解(显然!)
鉴于一件作品的行为很大程度上取决于它在棋盘中的位置,它应该知道它在哪个瓦片中。因此,当您首次将所有部分放入董事会时,董事会应为每个部分分配相应的磁贴(请注意,此知识对应于ChessGame的规则,而不是董事会,因为您可能想要使用董事会和部分换句话说,就像国际象棋的变种一样。)同样地,当一块棋子从棋盘上取下时(大概是由国际象棋游戏),棋子应该丢失它的棋子(通过消灭它。)
使用这三个对象,您将有几种选择。例如,一件作品可以通过回答其拼贴的位置来了解其位置。董事会可以通过询问其瓷砖等来了解每件的位置。