連続手番と手番内連続移動

「turn-order」では、自分の手番を連続で繰り返すことができます。
各手番で、別々の駒を移動させることもできます。
パスが許可されている場合を除き、全ての手番で移動を行う必要があります。
(例えば、1手目を動かした後、2手目で動かせる駒がないと、パスはできずステイルメイトとなります)

「add-partial」「add-copy-partial」では、同一手番内で移動を繰り返すことができます。
原則、移動の主体は同じ駒である必要がありますが、別の移動方法を行うことができます。
指定された「move-type」の移動のみを指定して繰り返させることができます。


<連続手番の場合>
 手番が2回来るため、全ての駒に適用されます。
 1回目の手番で動かせる駒(move-1を持つ駒)がなくなったり、2回目の手番で動かせる駒(move-2を持つ駒)がなくなったりすると、ステイルメイトになります。

(turn-order (Black move-1) (Black move-2) (White move-1) (White move-2) )

(piece
 (name Try)
 (moves
  (move-type move-1)
  (try1)
  (move-type move-2)
  (try2)
 )
)

(define try1
 (
  n
  add
 )
)

(define try2
 (
  w
  add
 )
)


<連続移動の場合1>
 「add-partial」を持つ駒のみに適用されます。
 「attribute」をフラグとして使用し、1回目の移動と2回目の移動を区別します。
 1回目の移動は2回目の移動を呼び出し、2回目の移動は移動を終了します。
 1回目の移動が呼び出され続けると無限ループになり、移動が終了できません。
 2回目以降は1回目の移動を呼び出せないように、1回目にはいきなり2回目の移動が呼ばれないようにフラグ管理しています。

(turn-order Black White)

(piece
 (name Try)
 (attribute never? true)
 (moves
  (try1)
  (try2)
 )
)

(define try1
 (
  (verify never?)
  n
  (set-attribute never? false)
  add-partial
 )
)

(define try2
 (
  (verify (not never?))
  w
  (set-attribute never? true)
  add
 )
)
※try2で「(verify (not never?))」を省略すれば、1回目の移動でtry2を行うこともできるようになります。
 try2で「(set-attribute never? true)」しないと、以降の手番で駒を動かせなくなります。
 「move-type」を使用しなくても実装できます。

<連続移動の場合2>
 「add-partial」を持つ駒のみに適用されます。
 「turn-order」で、最初の移動はmove-1のみ可能にします。
 move-1の移動はmove-2の移動を呼び出し、move-2の移動は移動を終了します。
 「(add-partial move-2)」は、move-2のみを呼び出すため、move-1が繰り返されることはありません。

(turn-order (Black move-1) (White move-1) )

(piece
 (name Try)
 (moves
  (move-type move-1)
  (try1)
  (move-type move-2)
  (try2)
 )
)

(define try1
 (
  n
  (add-partial move-2)
 )
)

(define try2
 (
  w
  add
 )
)
※「(turn-order Black White)」に変更すれば、1回目の移動でtry2を行うこともできるようになります。
 「attribute」によるフラグ管理が不要です。


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