我正在编写国际象棋游戏,但在检查走法是否有效时遇到了麻烦。
长话短说,我得到了 Pawn(扩展 Piece)类
//First element of array represents row, second element of array represents column
Set<int[]> legalMoves = new HashSet<>();
void initLegalMoves() {
if(color == PieceColor.WHITE) {
legalMoves.add(new int[] {-1, 0});
} else {
legalMoves.add(new int[] {1, 0});
}
}
现在我有了另一个类 MoveValidator
,它显然会检查移动是否有效。
private boolean isLegalMove(int oldRow, int oldColumn, int newRow, int newColumn){
int rowDifference = newRow - oldRow;
int columnDifference = newColumn - oldColumn;
board.getSelectedTile().getPiece().getLegalMoves().forEach(x -> {
if(x[0] == rowDifference && x[1] == columnDifference){
System.out.println("Ok move");
}
});
return board.getSelectedTile().getPiece().getLegalMoves().contains(new int[] {rowDifference, columnDifference});
}
虽然好像不行,但是返回值总是false。其余代码似乎是相关的,forEach
我在打印“Ok move”之前放置确实可以移动。我可能可以通过一些 Iterator
和 for loops
实现我想要的,但是为什么 contains
总是返回 false?我是否需要为要检查的类重写 equals()
?不能为 int[]
这样做,对吧? 另一方面,我可以像打印值一样使用 lambda 和 forEach
。尽管如此,我还是不能简单地将 return true
放在 if 语句
中......
请您参考如下方法:
不要使用 Set<int[]>
,而是使用 Set<Set<Integer>>
因为数组没有实现 equals
和 hashCode
方法,这就是为什么 contains
行不通,这就是它返回 false
的原因.
一个选项是遍历 Set<int[]>
并通过 Arrays.equals()
比较每个元素方法。
或者只使用 Set<Set>
因为Set
工具 equals
和 hashCode
你将能够使用contains
方法