国际象棋,算法找到对角线移动的最后位置

时间:2013-12-17 18:46:02

标签: java algorithm chess diagonal

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

为了简化我的代码,我有一个路径检查器方法,它接收起始位置和结束位置,如果该路径中的国王有任何威胁,则返回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之间的差异,远离顶行或右列。但我无法弄清楚上下左,下,左,右下的结果。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

假设您的坐标为

/|\ 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; }

答案 2 :(得分:0)

到M Cliatt,2013年,每个方向上由(R,C)(其中R和C来自[1..8])定义的方形主教对角线步数,直到你在8x8板上撞墙为止

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以上的NE,总是选择8-R分支,并且在对角线以下总是选择8-C分支。它们在对角线上相等。

因此,从(R,C)=(R + 8-R,C + 8-R)

的对角线上方的正方形开始,NE方向的射线的最后一个元素

顺便说一下 - 在主教法律动作阻碍(目前)的背景下考虑这一点......对你最终解决问题的地方感兴趣