チェスのZRF:解説1

<マクロの定義1>
  • 1歩移動を定義しているブロック:(leap1)
 (define leap1
  ( $1
    (verify not-friend?)
    add
  )
 )
※$1は方向(n,s,e,w,ne,nw,se,sw)が入力されます。
チェスでは利用されません。

  • 2歩移動を定義しているブロック:(leap2)
 (define leap2
  ( $1
    $2
    (verify not-friend?)
    add
  )
 )
※$1には方向(n,s,e,w)が入力されます。
※$2には方向(ne,nw,se,sw)が入力されます。
例)
 n-ne,n-nw,s-ne,s-nw,e-ne,e-se,w-nw,w-sw
※ナイトで利用されます。

  • キングの1歩移動を定義しているブロック:(king-shift)
 (define king-shift
  ( $1
    (verify not-friend?)
    (set-attribute never-moved? false)
    add
  )
 )
※$1には方向(n,s,e,w,ne,nw,se,sw)が入力されます。
※キングで利用されます。
※attributeの「never-moved?」をfalseにします。

  • 任意歩移動を定義しているブロック:(slide)
 (define slide
  ( $1
    (while empty?
        add
        $1
    )
    (verify not-friend?)
    add
  )
 )
※$1には方向(n,s,e,w,ne,nw,se,sw)が入力されます。
※ビショップやクイーンで利用されます。

  • ルークの任意歩移動を定義しているブロック:(rook-slide)
 (define rook-slide
  ( $1
    (while empty?
        (set-attribute never-moved? false)
        add
        $1
    )
    (verify not-friend?)
    (set-attribute never-moved? false)
    add
  )
 )
※$1には方向(n,s,e,w)が入力されます。
※ルークで利用されます。
※attributeの「never-moved?」をfalseにします。

  • ショートキャスリングを定義しているブロック:(O-O)
 (define O-O
  ( (verify never-moved?)
    e ; KB1
    (verify empty?)
    e ; KN1
    (verify empty?)
    cascade
    e ; KR1
    (verify (and friend? (piece? Rook)never-moved?) )
    from
    back ; K1
    ; Save expensive not-attacked?s for last
    (verify not-attacked?)
    e ; KB1
    (verify not-attacked?)
    to
    (set-attribute never-moved? false)
    ; We could check if KN1 is attacked too, but this isn't
    ; really necessary since Zillions doesn't allow any moves
    ; into check
    e ; KN1
    (set-attribute never-moved? false)
    add
  )
 )
※キング側のルークとキャスリングします。

  • ロングキャスリングを定義しているブロック:(O-O-O)
 (define O-O-O
  ( (verify never-moved?)
    w ; Q1
    (verify empty?)
    w ; QB1
    (verify empty?)
    cascade
    w ; QN1
    (verify empty?)
    w ; QR1
    (verify (and friend? (piece? Rook) never-moved?) )
    from
    back ; K1
    {; Save expensive not-attacked?s for last
    (verify not-attacked?)
    w ; Q1
    (verify not-attacked?)
    to
    (set-attribute never-moved? false)
    ; We could check if KN1 is attacked too, but this isn't
    ; really necessary since Zillions doesn't allow any moves
    ; into check
    w ; QB1
    (set-attribute never-moved? false)
    add
  )
 )
※ビショップ側のルークとキャスリングします。

  • ポーンのaddを定義しているブロック:(Pawn-add)
 (define Pawn-add
  ( if (in-zone? promotion-zone)
      (add Knight Bishop Rook Queen)
    else
      add
  )
 )
※「promotion-zone」でなければ、ポーンをaddします。
※「promotion-zone」では、ナイト、ビショップ、ルーク、クイーンから選択させてaddします。

  • ポーンの非キャプチャ移動を定義しているブロック:(Pawn-move)
 (define Pawn-move
  ( n
    (verify empty?)
    (Pawn-add)
    (verify (in-zone? third-rank))
    n
    (verify empty?)
    add
  )
 )
※nがすでに代入されており、方向は入力されません。
※空のマスで(Pawn-add)を呼び出します。
※2回目の空のマスでは直接addします。

  • ポーンのキャプチャ移動を定義しているブロック:(Pawn-capture)
 (define Pawn-capture
  ( $1
    (verify enemy?)
    (Pawn-add)
  )
 )
※$1は方向(neまたはnw)が入力されます。
※敵のマスで(Pawn-add)を呼び出します。

  • アンパッサンを定義しているブロック:(En-Passant)
 (define En-Passant
  ( $1
    (verify enemy?)
    (verify last-to?)
    (verify (piece? Pawn))
    capture
    n
    to
    n
    (verify last-from?)
    add
  )
 )
※$1は方向(nまたはn)が入力されます。


最終更新:2020年08月18日 15:06