如果没有图片,这可能有点难以解释,但是,我正在检查国王是否处于控制状态。为此,我从国王的位置开始,向上、向左、向下、向右,然后是所有对角线图案。
为了简化我的代码,我有一个路径检查器方法,它接受起始位置和结束位置,如果该路径中的国王存在任何威胁,则返回 true。所以,我这样调用这个方法:
board.incheckPath(kingLocation, new Location(8, kingY))
这将从国王到顶行、同一列进行检查。对于左、下、右我也有类似的说法。
问题是我试图对对角线图案使用相同的方式,但我无法找出一个简单的算法来找出最后一个位置在哪里。如果你比右边的高度高,那么如果你沿对角线向上和向右移动,你会在到达最右边的列之前到达顶行。我发现该位置的算法是:
如果 x > y {
行=8;列 = 8-(x-y)
} 别的 {
行 = 8-(x-y);列 = 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; }
关于java - 国际象棋,找到对角线移动的最后位置的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642228/