在国际象棋中实现象的规则

3

我正在思考一种高效且整洁的方法来确定在国际象棋中使用主教进行有效移动。

该棋子将从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;
            }

    }

但是这样做每个角落都要花费很长时间,有没有更好的方法?

涉及IT技术。
3个回答

11

我会将其分为两个步骤。

1)它是一个有效的目标吗? 2)是否有障碍物?

第一个很容易计算。由于象只能沿着对角线移动,因此 deltaX 和 deltaY 必须相等。

所以,if( abs(srcX-dstX) == abs(srcY-dstY) )

这排除了逻辑上无效的移动。

然后,简单地迭代穿过中间位置来检查障碍物就可以了,就像您已经做的那样。


1

如果是对角线,x 和 y 的移动应该是相同的,所以...

return Math.abs(srcx - dstx) == Math.abs(srcy - dsty);

你不应该比较 srcx - dstxsrcy - dsty 的绝对值吗? - Maxpm
这完全取决于坐标系,但是没错 :P - Andrew
它完全不依赖于坐标系... 您正在比较向量的x和y分量的大小。 - aaronfarr

1

如果满足以下条件,则移动有效:

      Destx-Desty = SourceX - SourceY      OR 

16 - DestX- DestY = SourceX - SourceY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接