象棋,算法找到最后一个位置对角线移动



如果没有图片,这可能有点难以解释,但我正在检查国王是否在检查中。为了做到这一点,我从国王的位置开始,向上、向左、向下、向右,然后是所有的对角线图案。

为了简化我的代码,我有一个路径检查器方法,它接受一个开始位置和结束位置,如果在该路径中有任何对国王的威胁,则返回true。因此,我将这种方法称为:

board.incheckPath(kingLocation, new Location(8, kingY))

这将检查从国王到最上面一行,同一列。我对左、下和右都有类似的表述。

问题是,我试图用同样的方式来处理对角线图案,但我无法找到一个简单的算法来计算最后一个位置。如果你的位置比右边高,那么如果你向上和向右倾斜,你会在到达最右边的列之前到达最上面的一行。我发现这个位置的算法是:

if x > y { row = 8; column = 8-(x-y) } else { row = 8-(x-y); column = 8; }

因为你降落的地方将是x和y之间的差值,远离顶行或右列。但我不知道向上向左、向下向左或向下向右会有什么结果。

假设您的坐标是

/| y
 |              col8
 +---+ ... +---+---+
 |   |     |   |   | <- row 8
 +---+ ... +---+---+
 |   |     |   |   | 
 +---+ ... +---+---+
 ...............
 +---+ ... +---+---+
 |   |     |   |   | <- row 1
 +---+ ... +---+---+--->
                       x

扩展您的解决方案,它将看起来像

// Up right
if (y > x) { row = 8; column = 8-(y-x) } else { row = 8-(x-y); column = 8; }
// Down left
if (x > y) { row = 1; column = 1+(x-y) } else { row = 1+(y-x); column = 1; }
// Up left
if (9-x < y) { row = 8; column = x+y-8 } else { row = x+y-1; column = 1; }
// Down right
if (9-x > y) { row = 1; column = x+y-1 } else { row = x+y-8; column = 8; }

我建议您用另一种更合适的方式定义路径:

 int pathDeltas[][] = {
     {1, 0}, {0, 1}, {-1, 0}, {0, -1}, // Up, down, left, right
     {1, 1}, {-1, 1}, {1, -1}, {-1, -1}, // diagonal paths
 };

然后,您可以从种类位置开始,将delta添加到x和y坐标,直到达到1或8的值。你也可以这样计算骑士路径:

int knightDeltas[][] {{1, 2}, {2, 1}, {-1, 2}, {-2, 1},
                     {1, -2}, {2, -1}, {-1, -2}, {-2, -1}};

至M Cliatt,2013,从(R,C)(其中R和C来自[1..8])定义的正方形到8x8板上撞到墙上的每个方向的bishop对角线步数

NE = Min(8 - R, 8 - C)
NW = Min(8 - R, C - 1)
SE = Min(R - 1, 8 - C)
SW = Min(R - 1, C - 1)

板上的瞬间反射显示这些沿着对角线(NE,SW以这种方式分裂)和反对角线(NW,SE)分裂。。。例如对于NE,总是选择对角线上方的8-R分支,并且总是选择对角线下方的8-C分支。它们在对角线上相等。

因此,从(R,C)=(R+8-R,C+8-R)对角线上方的正方形开始的NE方向上的射线的最后一个元素

顺便说一句,在主教法律行动阻碍的背景下思考这一点(目前)。。。感兴趣的是你的问题

最新更新