解説:cascade

  • cascade
 生成された移動の一部を保存します。

 「cascade」の使用により、残りの移動を生成する前に、これまでの移動を保存します。
 移動は、「add」が使用されるまで書き出されません。

 「cascade」を使用すると、1回の手番内で、複数の駒を一度に移動できます。
 これにより、チェスにおけるキャスリングのような複数の駒の移動を、簡単にプログラムできます。

 「cascade」は移動ブロック(moves)またはドロップブロック(drops)で使用できます。
 ドロップブロックで使用すると、複数の駒をドロップできます。


(define O-O
 (
  (verify never-moved?) ・・・キングが未移動の場合
  e ・・・キングを右へ1マス移動(右へ1マス目)
  (verify empty?) ・・・右1マス目が空の場合
  e ・・・キングを右へ1マス移動(右へ2マス目)
  (verify empty?) ・・・右2マス目が空の場合
  cascade キングの移動を保存
  e ・・・右へ1マス移動(右へ3マス目)
  (verify (and friend? (piece? Rook) never-moved?) ) ・・・右へ3マス目が未移動のルークの場合
  from ・・・右へ3マス目を乗り換えた駒の開始点に設定
  back ・・・キングの開始点へ戻る
  (verify not-attacked?) ・・・キングの位置がチェックされていない
 e ・・・右へ1マス移動(右へ1マス目)
  (verify not-attacked?) ・・・右1マス目がチェックされていない
 to ・・・乗り換えた駒の移動先へ設定
  (set-attribute never-moved? false) ・・・乗り換えた駒を移動済みへ変更
  e ・・・右へ1マス移動(右へ2マス目)
※ (verify not-attacked?) ・・・右2マス目がチェックされていない →ZoGがチェック位置への移動を許可しないため不要
  (set-attribute never-moved? false) ・・・キングを移動済みへ変更
  add ・・・キングの移動先へ設定
 )
)

※キングサイドへのキャスリング(キングを右へ2マス移動、右のルークを左へ2マス移動)させます。
 キングは、移動開始時、移動途中、移動終了時のいずれでも敵の攻撃を受けてはいけませんが、チェックされる位置への着手は規制されているため、移動終了時のチェック判定は不要です。

 「cascade」の直後に、ZoGは自動的に次の移動の「開始位置」を現在の位置に設定します。

 これが希望どおりでない場合は、「from」を使用して別の位置に変更できます。


(
 n
 cascade
 (verify not-empty?)
 from
 s
 add
)

※現在の駒で上へ1マス進み、その位置(上に1マス目)が空でなければ、その位置の駒に乗り換えて、そこを開始点にして下へ1マス移動します。
 つまり、上に隣接する駒がある場合、上の駒と位置を入れ替えることになります。

 「add」前の移動ブロックで、1個以上の「cascade」を使用することが可能です。
 これにより、一度に多くの駒を移動できます。

 「cascade」が再生されると、全ての駒の動きが一斉に生じるため、他の駒が着地した場所から離れるように駒を移動させることができます。

 1個以上の駒が移動された場合、「cascade」の最初の移動が「キー移動」です。
 つまり、移動を実行するために、人間のプレイヤーが選び出す必要があるものです。

 結果的な動作は定義されておらず、問題を引き起こす可能性があるため、2つの駒が同時に同じ位置へ移動しないように注意する必要があります。

 デフォルトでは、「add」後、全ての「cascade移動」が呼び出され、その移動ブロック内の後続の「add」にも適用されます。
 これにより、移動ブロックは、新しい移動が「add」されるたびに最初から再生成する必要なく、連続した長い一連の移動を構築できます。

 この動作は、オプション設定の「discard cascades」によって優越されます。

  • (option "discard cascades" true)
 どんな場合でも、「cascade」移動のリストは移動ブロックの最後でクリアされます。

※デフォルトでは、「discard cascades」は「false」です。


最終更新:2020年09月15日 11:10