ZRF-FAQ

  • Q:繰り返しチェックのデフォルトは?
  • A:ZoGは、どのゲームでも無限に動きを繰り返すことは意味がないと考えているため、同じ局面が3回繰り返されたかどうかを確認します。
  同じ局面が3回繰り返された場合、デフォルトでは引き分けとなります。
  この確認はパズルでは発生しません。
  プレイヤーが正解に到達するまで、同じ局面を何度も繰り返す必要がある場合があるためです。

  • Q:プレーヤーの移動が複数のキャプチャである場合、
  「(loss-condition (opponent) (pieces-remaining n opponent) ) 」では、
  各ジャンプ後にチェックされますか、それともプレーヤーの移動の最後にのみチェックされますか?
  • A:全ての「勝利/引き分け/敗北条件」は、全体の移動の終了後に確認されます。
  チェッカーのジャンプなどの部分移動の後、連続移動の最後のジャンプでない限り、チェックは行われません。

  • Q:プレイヤーが盤上に駒をドロップするゲームを作りましたが、ZoGがステイルメイトと判定するのは、なぜですか?
  • A:「drop」移動を定義しましたが、ゲーム開始時の盤外の駒の所有数を設定しない限り、プレイヤーが駒をdropすることはできません。
  盤上にドロップできる駒があることをZoGに伝えるには、  「board-setup」の「off」を使用します。

  • Q:「move-priorities」において、同じ優先順位を持つ移動を指定できますか?
  例:「(move-priorities move1 (move2 move3 move4) move5(move6 move7) )」
  • A:できません。
  複数の駒の複数の移動に、同じ移動タイプ<move-type>を割り当てることは可能です。
  例えば、ナイトとビショップの両方の移動に、同じ移動タイプ<minor-piece>割り当てることはできます。
  (move-type minor-piece)
 →この場合、ナイトとビショップの移動タイプを区別できなくなってしまいます。

  • Q:「last-from」とは何ですか?
  • A:「ドロップした後に戻る」わけではありません。
  「最後に駒がドロップされた位置」になります。

  • Q:「grid」「kill-positions」「links」「unlink」を使用して六角盤を作成する方法は?
  • A:「grid」は、矩形盤を作成する際に最も簡便です。
  六角盤を直接サポートする機能はありません。
  六角盤の作成方法の例については、「Chinese_Checkers.zrf」を参照して下さい。
  各位置は、本当に六角形になっています。

  • Q:移動中に盤の端から外れると?
  • A:移動ブロックは、盤の端から外れるなど、現在の位置が無効になるたびに終了します。
  移動生成は位置が無効になると、その移動の残りの移動生成は意味をなさないと判断します。
  これにより、「(while true n)」のような無限ループを防ぎます。
  また、処理をより効率的にします。
  この移動生成が途中で終了するリスクなしに、隣接する位置の内容を確認する場合は、次のようにします。
  「sw (piece? Knight) ne」ではなく、
  「(piece? Knight sw)」とします。
  後者は、現在の位置を変更せずに他の位置をテストします。
  これは、方向<sw>に位置がない場合は「false」を返します。
  前者は、実際に現在の位置を方向<sw>に移動します。
  位置が存在しなかった場合、処理は終了します。
  もう1つの方法は、「on-board?」を使用することです。
  「(if (on-board? sw) sw (piece? Knight) )」になります。

  • Q:最初の選択画面はゲームとして実装されていますが、動作が異なります。
 自分で選択画面を作成することはできますか?
  • A:可能です。
  選択画面では、通常メニューから使用できる多くの機能とともに、盤面編集が無効になります。
  ゲームの終了の検出がオフになり、ツールバーが非表示になります。
  バリアントを選択画面にするためには、バリアント内のどこかで「open」を使用します。

  • Q:移動定義の中で、どのバリアントにいるかを調べる方法は?
  • A:直接ではありませんが、間接的にこれを処理する方法は色々あります。
  一例として、ダミー位置「v」を作成し、「board」設定で、各バリアントにそれぞれ異なるダミー駒を配置します。
  例えば、「Variant1」、「Variant2」のようにダミー駒を配置します。
  次に、次のような移動コードでダミー駒を確認することで、最初のバリアントにいるかどうかを確認できます。
  (piece? Variant1 v)

  • Q:移動定義の中で、どのプレイヤーの手番であるかを知る方法は?
  • A:ありますが、直接的な確認ではありません。
  1つの方法は、ゾーンが駒を移動しているプレイヤーに対して相対的であるという事実を利用して、ゾーンを使用することです。
  ミニ将棋の場合:
  (define am-white? (not-in-zone? promotion-zone 1i) )
  (define am-black? (in-zone? promotion-zone 1i) )
  (zone
   (name promotion-zone)
   (players Black)
   (positions 5i 4i 3i 2i 1i)
  )
  (zone
   (name promotion-zone)
   (players White)
   (positions 5v 4v 3v 2v 1v)
  )
  もしあらかじめ定義されたゾーンがない場合は、各プレーヤーに対して1マス分の小さなゾーンを定義すればよいです。

  • Q:「(in-zone? red)」を使用するか、「(set-position-flag red)」を使用してから「(position-flag? red)」を使用するのが良いでしょうか?
  • A:間違いなく、「(in-zone? red)」が良いです。
  1)ゾーン<zone>はゲーム定義の静的な部分ですが、位置フラグ<position-flag>の有効期間は短く、駒の種類の移動の1つに対する移動生成中にのみ存在します。
  位置フラグ<position-flag>は、駒が新しい移動を生成するたびに設定する必要があります。
  ゾーン<zone>は、ZRFが読み込まれるときに1回だけ初期化されます。
  2)位置フラグ<position-flag>が使用されている場合、位置フラグ<position-flag>は全ての移動生成の開始時にいったんfalseに初期化されます。
  そのため、位置フラグ<position-flag>を使用するとパフォーマンスが大幅に低下します。
  位置フラグ<position-flag>を使用しない場合、この初期化はバイパスされ、行われません。

  • Q:ZRFを高速化するためのヒントは?
  • A:
  1)不要な移動コードを避けます。
  多くの場合、移動コードが強化されるか、一行が冗長になります。
  例えば、移動を「add」する直前には、明示的な「to」は通常必要ありません。
  「ZoG」が移動を生成するための処理が少ないほど、良いです。
  2)可能であれば、位置フラグの使用を避けます。
  各位置の位置フラグは、全ての駒の各移動ブロックで初期化する必要があります。
  特に位置がたくさんある場合、これは非常に時間がかかります。
  ゲーム内で位置フラグを使用しない場合、ZoGはこの手順をスキップできます。
  3)可能な場合はゾーンを使用します。
  ゾーンを使用すると、ゲームは各位置の確認を繰り返す必要なく、一回で様々な位置に対して確認できます。
  4)盤の一部にのみドロップする場合は、<drop-def>の代替形式を使用します。
  例えば、
  (moves (my-zone XXX))は、
  (moves ( (verify (in-zone? my-zone)) XXX)
  よりもはるかに高速です。
  前者の場合、ZoGはゾーン<my-zone>内の位置のみを調べます。
  後者では、盤上の全ての位置について評価します(これは、位置フラグの初期化なども同様です)。
  5)位置がどのようにリンクされているかを注意深く検討します。
  例えば、大きな跳躍移動を行う駒がある場合、通常の移動では介在する位置を1つずつ順番に進み、盤の端を確認して、移動先に到達します。
  ただし、跳躍移動できる位置を直接リンクする新しい方向のセットを作成する方がおそらく速いでしょう。



最終更新:2020年09月01日 13:04