我正在写象棋游戏,在检查移动是否有效时遇到了麻烦。
长话短说,我拥有具有
的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 statement
...
答案 0 :(得分:3)
请勿使用Set<int[]>
,而应使用Set<Set<Integer>>
,因为数组不能实现equals
和hashCode
方法,这就是contains
无法正常工作的原因这就是为什么它返回false
。
一个选项是遍历Set<int[]>
并通过Arrays.equals()
方法比较每个元素。
或者只使用Set<Set>
,因为Set
实现了equals
和hashCode
,您将可以使用contains
方法