チェス盤上の2つのクイーンの位置が与えられたとき、それらが互いを攻撃できる配置にあるかどうかを判定します。
チェスのゲームでは、クイーンは同じ行、列、または対角線上にある駒を攻撃できます。
チェス盤は8×8の配列で表すことができます。
では、白のクイーンがc5(0から数えて列2、行3)に、黒のクイーンがf2(0から数えて列5、行6)にあるとしましょう。すると、配置は次のようになっていることがわかります。
クイーン同士が互いを攻撃できるかどうかも答えられます。 この場合は「はい、攻撃できます」となります。なぜなら、2つの駒が同じ対角線上にいるからです。
チェス盤の画像は、habere-et-dispertireが、Ulrike FischerによるchessboardパッケージとLaTeXを使って作成したものです。
チェスでは、行は「ランク」、列は「ファイル」と呼ばれます。 ランクは1から8、ファイルはAからHです。
この演習では、Squareはチェス盤上のマスを表す不透明型です。
内部的には0から始まるrowとcolumnフィールドを使用し、それらが常に有効(つまり0から7)であることを保証します。
create関数は、"C5"のような公式表記でチェス盤上の有効なマスを表すStrを入力として受け取ります。
create関数は、このStrを解析し、それが有効なマスを表しているか確認し、もしそうであれば、適切なrowとcolumnフィールドを含むSquare値を返さなければなりません。
ランク1は行0に、ランク8は行7に対応します。
たとえば、create("C5")は、行4、列2のマスを返さなければなりません。
Square型はまた、便利なrankとfileメソッドを公開しています。
上記の例では、rankは整数5を返し、fileは文字'C'を返さなければなりません。
最後に、queen_can_attack関数は、2つの異なるSquare値を受け取り、それらのマスに置かれたクイーンが互いを攻撃できるかどうかをチェックします。
まとめ: Squareのような不透明型は、rowとcolumnが常に0から7の間にあるといった保証を提供したいときに最適です。
また、不透明型はユーザーから実装の詳細を隠すため、APIがよりクリーンになります。