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

问题描述:

这可能有点难以解释没有图片,但是,我正在检查,看看国王是否在检查过程中。为此,我从国王的位置开始,向上,向左,向下,向右,然后是所有对角线模式。国际象棋,算法找到对角线移动的最后一个位置

为了简化我的代码,我有一个路径检查器方法,它接受一个起始位置和结束位置,并在该路径中的国王遇到任何威胁时返回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远的区别。但我无法弄清楚上升和下降的结果会是什么,下来,左下,右下。

+0

你是什么意思“最后”的位置? – cammil

+0

沿着国王的每个对角线方向走你走到最后的一个地方是什么:(1)左上和下,(2)左和右,(3)右和上,(4)右和下。我已经想出了最后一点是什么时候正确地向上移动。 –

+0

上次在离开董事会之前。所以我可以告诉我的路径检查器方法检查,直到它到达位置X. –

假设,你的坐标是

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

非常感谢。这正是我所期待的。你能解释一下你用什么逻辑来得到答案吗? –

+1

我画了一个例子,找到一个点并找到“最后”的位置。然后我注意到,如果x或y增加,这个“最后”位置如何变化。如果它也增加,那么你必须添加x或y。如果它减少,你必须减去x或y。然后我看着对角线,其中9-x = y或x = y并计算出-8或+8常数:(考虑“向右”:如果y = 9-x,则行= x + yC = x + 9-x)-C = 9-C === 1 => C = 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 
}; 

然后你可以从一种位置开始,并增加了增量x和y坐标,直到你打1个或8值。你也可以计算出骑士的路径是这样的:

int knightDeltas[][] {{1, 2}, {2, 1}, {-1, 2}, {-2, 1}, 
        {1, -2}, {2, -1}, {-1, -2}, {-2, -1}}; 
+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以上的对角线8-R分支总是被选择,并且在对角线以下总是选择8-C分支。它们在对角线上相等。在的上下文中考虑这一点 - 在NE方向开始于上面对角线方块从(R,C)=(R + 8-R,C + 8-R)

顺便说一句射线的

因此,上元件主教合法移动障碍(目前)...感兴趣的地方,你最终在你的问题