给定棋盘上两个皇后的位置,判断她们是否处于可以相互攻击的位置。
在国际象棋中,皇后可以攻击同一行、同一列或同一斜线上的棋子。
棋盘可以用一个 8×8 的数组表示。
所以,如果告诉你白皇后位于c5(从 0 开始索引,即第 2 列第 3 行),黑皇后位于f2(从 0 开始索引,即第 5 列第 6 行),那么这个局面就像这样:
你同样可以回答这两个皇后能否相互攻击。 在这个局面中,答案是肯定的,她们可以,因为两个皇后位于同一条斜线上。
棋盘图片由 habere-et-dispertire 使用 LaTeX 和 Ulrike Fischer 的 chessboard 宏包 制作。
在国际象棋中,行叫做“rank”,列叫做“file”。rank 的取值范围是 1 到 8,file 的取值范围是 A 到 H。
在本练习中,Square 是一种不透明类型,表示棋盘上的一个格子。它的内部使用从 0 开始计数的row和column字段,并保证这两个字段始终有效(即从 0 到 7)。
create 函数接收一个Str作为输入,用官方记谱法表示棋盘上一个有效的格子,例如 "C5"。create 函数必须解析这个Str,验证它确实表示一个有效的格子;如果是,就返回一个Square值,其中包含相应的row和column字段。rank 1 对应 row 0,rank 8 对应 row 7。例如,create("C5") 必须返回一个 row 为 4、column 为 2 的格子。
Square 类型还提供了便捷的rank和file方法。在上面的例子中,rank 必须返回整数 5,file 必须返回字符 'C'。
最后,queen_can_attack 函数接收两个不同的Square值,检查放在这两个格子上的皇后能否互相攻击。
要点:当你想要提供一些保证时,比如row和column始终在 0 到 7 之间,像Square这样的不透明类型就非常合适。不透明类型还会对使用者隐藏实现细节,让 API 更简洁。