學習軌道
/
Roc
Roc
/
練習
/
皇后攻擊
皇后攻擊

皇后攻擊

簡單

說明

給定西洋棋棋盤上兩個皇后的位置,判斷它們的擺法是否讓彼此能互相攻擊。

在西洋棋中,皇后可以攻擊位於同一行、同一列或同一條對角線上的棋子。

棋盤可以用 8 乘 8 的陣列來表示。

所以,如果有人告訴你白色皇后在 c5(索引從 0 開始,也就是第 2 列、第 3 行),黑色皇后在 f2(第 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值,並檢查放在這兩個格子上的皇后是否能互相攻擊。

重點:當你想提供一些保證時,像Square這樣的不透明型別就很好用,例如row和column永遠介於 0 到 7 之間。 不透明型別也會向使用者隱藏實作細節,讓 API 更簡潔。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Roc Exercism

準備好開始 皇后攻擊 了嗎?

註冊 Exercism,透過 120 個練習 和真人引導來學習並精通 Roc,全部免費。