如果没有照片,这可能有点难以解释但是,我正在检查国王是否在检查中。为此,我从国王的位置开始向上,向左,向下,向右,然后是所有的对角线模式。
为了简化我的代码,我有一个路径检查器方法,它接收起始位置和结束位置,如果该路径中的国王有任何威胁,则返回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 :(得分: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方向的射线的最后一个元素 顺便说一下 - 在主教法律动作阻碍(目前)的背景下考虑这一点......对你最终解决问题的地方感兴趣