将棋のZRF:解説2

<マクロの定義2>
  • 成りのない1歩移動を定義しているブロック:(shift)
(define shift
 ( (verify (in-zone? play-zone))
   $1
   (verify not-friend?)
   (prisoner-check)
   add
 )
)

※(in-zone? play-zone)で盤上の駒かどうか確認します。
※空きマスまたは敵のいるマスの場合、進めます。
※敵の場合に持駒にするため、「add」の前に(prisoner-check)を呼び出します。
※金将、玉将、と金、成金3種、竜王、竜馬で利用されます。

  • 成りのある1歩移動を定義しているブロック:(shiftP)
(define shiftP
 ( (verify (in-zone? play-zone))
   (set-flag came-from-zone (in-zone? promotion-zone))
   $1
   (verify not-friend?)
   (prisoner-check)
   (if (in-zone? $3)
      add
   )
   (verify (or (flag? came-from-zone) (in-zone? promotion-zone)))
   (if enemy?
     (change-type $2)
     (if (in-zone? $3)
        (first-empty)
        (convert-prisoner)
     )
     add
   else
     (add $2)
   )
 )
)

※(in-zone? play-zone)で盤上の駒かどうか確認します。
※空きマスまたは敵のいるマスの場合、進めます。
※敵の場合に持駒にするため、「add」の前に(prisoner-check)を呼び出します。
※歩兵、銀将で利用されます。

  • 成りのある2歩移動を定義しているブロック:(shift2P)
(define shift2P
 ( (verify (in-zone? play-zone))
   (set-flag came-from-zone (in-zone? promotion-zone))
   $1
   $2
   (verify not-friend?)
   (prisoner-check)
   (if (in-zone? $4)
      add
   )
   (verify (or (flag? came-from-zone) (in-zone? promotion-zone)))
   (if enemy?
     (change-type $3)
     (if (in-zone? $4)
        (first-empty) (convert-prisoner)
     )
     add
   else
     (add $3)
   )
 )
)

※(in-zone? play-zone)で盤上の駒かどうか確認します。
※空きマスまたは敵のいるマスの場合、進めます。
※敵の場合に持駒にするため、「add」の前に(prisoner-check)を呼び出します。
※桂馬で利用されます。

  • 成りのない任意歩移動を定義しているブロック:(slide)
(define slide
 ( (verify (in-zone? play-zone))
   $1
   (while empty?
       add
       $1
   )
   (verify not-friend?)
   (prisoner-check)
   add
 )
)

※(in-zone? play-zone)で盤上の駒かどうか確認します。
※空きマスまたは敵のいるマスの場合、進めます。
※敵の場合に持駒にするため、「add」の前に(prisoner-check)を呼び出します。
※竜王、竜馬で利用されます。

  • 成りのある任意歩移動を定義しているブロック:(slideP)
(define slideP
 ( (verify (in-zone? play-zone))
   (set-flag came-from-zone (in-zone? promotion-zone))
   $1
   (while empty?
       (if (in-zone? promotion-zone)
          (set-flag came-from-zone true)
       )
       (if (in-zone? $3)
          add
       )
       (if (flag? came-from-zone)
          (add $2)
       )
       $1
   )
   (verify not-friend?)
   (prisoner-check)
   (if (in-zone? $3)
      add
   )
   (verify (or (flag? came-from-zone) (in-zone? promotion-zone)))
   (if enemy?
      (change-type $2)
      (if (in-zone? $3)
        (first-empty) (convert-prisoner)
      )
      add
   else
      (add $2)
   )
 )
)

※(in-zone? play-zone)で盤上の駒かどうか確認します。
※空きマスまたは敵のいるマスの場合、進めます。
※敵の場合に持駒にするため、「add」の前に(prisoner-check)を呼び出します。
※香車、飛車、角行で利用されます。


最終更新:2020年08月18日 17:40