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

标签 java algorithm chess diagonal

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

为了简化我的代码,我有一个路径检查器方法,它接受起始位置和结束位置,如果该路径中的国王存在任何威胁,则返回 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/

相关文章:

JavaFX :Editable Configuration Files After Packaging

java - 使用Android Studio遇到错误

java - 面试问题:优化一种函数,该函数可以找到给定范围内包含x或y的数字数量,但不能同时找到两者?

c++ - 矩阵列比较

java - 具有多个条件的 String.equals()(以及对结果的一项操作)

java - 服务器重启时如何处理Quartz简单触发

c++ - 理论上,find_end 是可并行化的吗?

javascript - 在 meteor 项目中集成 Chessboard.js

java - 需要帮助实现 en passant Pawn 捕获和提升

data-structures - 国际象棋棋盘所需的最少位数