轨道
/
Roc
Roc
/
练习
/
皇后攻击
皇后攻击

皇后攻击

简单

说明

给定棋盘上两个皇后的位置,判断她们是否处于可以相互攻击的位置。

在国际象棋中,皇后可以攻击同一行、同一列或同一斜线上的棋子。

棋盘可以用一个 8×8 的数组表示。

所以,如果告诉你白皇后位于c5(从 0 开始索引,即第 2 列第 3 行),黑皇后位于f2(从 0 开始索引,即第 5 列第 6 行),那么这个局面就像这样:

一张国际象棋棋盘,上面有两个皇后。从 c5 处的皇后射出的箭头标出了沿列、行和斜线可以吃子的方向。

你同样可以回答这两个皇后能否相互攻击。 在这个局面中,答案是肯定的,她们可以,因为两个皇后位于同一条斜线上。

致谢

棋盘图片由 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 更简洁。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Roc Exercism

准备好开始 皇后攻击 了吗?

注册 Exercism,借助 120 个练习 和真人导师指导,学习并掌握 Roc,全部免费。