这个问题可能不清楚,所以我将解释我想问的内容。
我的状况看起来真的很混乱:
if (( (startX - endX) == 1 && (startY - endY) == 1 ) ||
( (startX - endX) == 1 && (startY - endY) == 0 ) ||
( (startX - endX) == 1 && (startY - endY) == -1 ) ||
( (startX - endX) == 0 && (startY - endY) == 1 ) ||
( (startX - endX) == 0 && (startY - endY) == -1 ) ||
( (startX - endX) == -1 && (startY - endY) == 1 ) ||
( (startX - endX) == -1 && (startY - endY) == 0 ) ||
( (startX - endX) == -1 && (startY - endY) == -1 ))))
要重构,我列出了包含这些位置的点((1,0),(1,-1)等)
) ArrayList<Point> kingMoveRange = new ArrayList<Point>();
kingMoveRange.add(new Point(1, 0));
kingMoveRange.add(new Point(0, -1));
kingMoveRange.add(new Point(0 , 1));
kingMoveRange.add(new Point(-1, -1));
kingMoveRange.add(new Point(-1, 1));
kingMoveRange.add(new Point(1, -1));
kingMoveRange.add(new Point(1, 1));
看起来像上面。
,但我不确定如何写
之类的东西"If (startX - endX) and (startY - endY) matches ANY one of the pairs in the list "
我试图寻找ArrayList的文档,但找不到清晰的文件。
您可以为类Point
实现equals
方法(该类别为BTW,因为它代表坐标差),然后使用
kingMoveRange.contains(new Point(startX - endX, startY - endY))
如何将原始if
条件简化为:
if (((startX != endX) || (startY != endY)) && // Check we've moved
((Maths.abs(startX - endX) <= 1) && (Maths.abs(startY - endY) <= 1))) { // Check we haven't moved far
// Valid King move
}
您可以简单地使用包含的ArrayList方法,对于您的代码段,它可能就像
Point PointToCheck = new Point((startX - endX), (startY - endY));
if(kingMoveRange.contains(PointToCheck)) {
// TODO for true
}
如果它不起作用,那么您可能必须覆盖等于点类方法