我正在试图想出一种方法来有效和巧妙地确定国际象棋中的主教是否有效行动。
该作品将从srcX,srcY移至dstX,dstY
这是我的一个想法的一部分:
if(srcX < dstX && srcY < dstY) {
// Moving towards the top right of the board
// Determine the decrease in X coordinate
int deltaX = dstX-srcX;
// If the move is valid, the Y coordinate will have decreased by the same number as X
int validY = dstY-deltaX;
if(validY == srcY) {
validMove = true;
}
}
但它会有点长时间的啰嗦,这样做是为了永远的角落..任何人都可以想到更好的方式吗?
答案 0 :(得分:10)
我会把它分成两步。
1)这是一个有效的目的地吗? 2)有障碍物吗?
第一个很容易计算。由于主教只能移动对角线,因此deltaX和deltaY必须相等。
所以,if( abs(srcX-dstX) == abs(srcY-dstY) )
排除了逻辑上无效的动作。
然后,在检查障碍物时,迭代两者之间的位置是一件简单的事情。
答案 1 :(得分:1)
如果它是对角线,则x和y移动应该相同,所以......
return Math.abs(srcx - dstx) == Math.abs(srcy - dsty);
答案 2 :(得分:1)
如果符合以下条件,此举有效:
Destx-Desty = SourceX - SourceY OR
16 - DestX- DestY = SourceX - SourceY