給定西洋棋棋盤上兩個皇后的位置,判斷它們的擺法是否讓彼此能互相攻擊。
在西洋棋中,皇后可以攻擊位於同一行、同一列或同一條對角線上的棋子。
棋盤可以用 8 乘 8 的陣列來表示。
所以,如果有人告訴你白色皇后在 c5(索引從 0 開始,也就是第 2 列、第 3 行),黑色皇后在 f2(第 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值,並檢查放在這兩個格子上的皇后是否能互相攻擊。
重點:當你想提供一些保證時,像Square這樣的不透明型別就很好用,例如row和column永遠介於 0 到 7 之間。
不透明型別也會向使用者隱藏實作細節,讓 API 更簡潔。