2

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

为了简化我的代码,我有一个路径检查器方法,它接受起始位置和结束位置,如果该路径中的国王有任何威胁,则返回 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 与顶行或右列之间的差异。但我不知道向上和向左、向下和向左或向下和向右的结果是什么。

4

3 回答 3

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

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

int knightDeltas[][] {{1, 2}, {2, 1}, {-1, 2}, {-2, 1},
                     {1, -2}, {2, -1}, {-1, -2}, {-2, -1}};
于 2013-12-17T18:55:38.320 回答
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; }
于 2013-12-17T19:51:08.333 回答
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) 的对角线上方的正方形开始

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

于 2016-06-15T10:36:37.933 回答