ダガズ建築

画像 それはすべおそうアヌキテクチャです

病気を治したす

医者ずしお私を信じお

私の薬はあなたを助けたす。



トリスタンのヒント-「 干し草の䞭の犬 」



前の蚘事で 、 Dagaz move generatorの仕組みに぀いお倚くのこずを話したした。 おそらく私はカヌトを銬の前に眮きたした。 私の最も詳现な説明は、䞻なものを理解するのにたったく圹立ちたせん-これがどのように䜿甚できるか。 実際、それは簡単です。



どこも簡単



移動ゞェネレヌタヌを䜿甚するために、その仕組みを完党に理解する必芁はありたせん。 3぀のクラスのみの目的を理解するこずが重芁です。 そしお最初のものはZrfBoardです。 名前から明らかなように、このクラスはボヌドを衚したす。



正しく理解したい
ボヌドのサむズや圢状に぀いおは話しおいない。 蚱容される䜍眮ボヌドフィヌルドおよびそれらの関係方向に関するすべおの情報は、 ZrfDesignクラスのむンスタンスに保存され、ゲヌム䞭に倉曎されたせん これに぀いおは以前の 蚘事でたくさん曞いたので、繰り返したくありたせん。 ゲヌムデザむンはこの蚘事の䞻題ではありたせん。 これを「ブラックボックス」ず芋なすこずができたす。



ZrfBoardには、特定の動きの開始時のゲヌムの状態の説明が含たれおいたす。 ほずんどの堎合、これはボヌドにフィギュアを配眮するこずに関する情報です。 倉曎するには、2぀の方法で十分です。





すべおの䜍眮は、単に敎数倀倧きな線圢配列のむンデックスです。 より䜿い慣れた文字列衚珟に倉換するにはおよびその逆、グロヌバル関数Model.Game.posToStringおよびModel.Game.stringToPosが䜿甚されたす。 図 ZrfPiece の説明はもう少し耇雑です



コンストラクタヌ
function ZrfPiece(type, player) { this.type = type; this.player = player; }
      
      





図のタむプずその所有者䞡方ずも敎数倀。 これらは䞍倉の倀であるこずを理解するこずが重芁です。 ZrfPieceの同じむンスタンスは、ボヌドの耇数の䜍眮で同時に䜿甚でき、 ZrfBoardのさたざたなコピヌの䜍眮でさえ、異なる時点でのゲヌムの状態を蚘述できたす。



しかし、圢状を倉曎する必芁がある堎合はどうでしょうか
たずえば、チェスのポヌンが最埌の氎平に到達するず、4぀のピヌスのいずれかになり、 リバヌシのようなゲヌムでは、ピヌスの所有者が倉わる可胜性がありたす。 解決策は明らかです。実際、図の「状態」を倉曎するメ゜ッドは、クラスの新しいむンスタンスを返すだけで、叀いオブゞェクトは倉曎されたせん。



圢を倉える
 ZrfPiece.prototype.promote = function(type) { return new ZrfPiece(type, this.player); }
      
      





私はこれに泚意を払いすぎおいるように芋えるかもしれたせんが、実際には重芁です。 実際、タむプず所有者に関する情報に加えお、 ZrfPieceクラスには远加の数倀図の属性を含めるこずができたす。 属性を䜿甚する最も簡単な䟋は、チェスでのキャストです。 フィギュアが以前に移動し、キャスティングに関䞎できないずいう兆候は、その属性の1぀に栌玍できたす。 属性の倀を倉曎するず、既存のむンスタンスを倉曎せずに、 ZrfPieceの新しいむンスタンスも生成されたす。



ZrfBoardを䜿甚するには、さらに2぀の方法を知っおおく必芁がありたす。





setPieceメ゜ッドを䜿甚しおZrfBoardの状態を倉曎できたすが、これを盎接行うべきではありたせん。 代わりに、移動可胜なすべおのリストの1぀を遞択し、 applyメ゜ッドを䜿甚しおボヌドの状態に適甚する必芁がありたす。これにより、 ZrfPieceを倉曎する堎合のように、オブゞェクトの新しいむンスタンスが返されたす。



もちろん、動きはプレむダヌに結び぀いおいたす
ZrfBoardの各むンスタンスは、所有者次の移動を実行するプレむダヌに関連付けられおいたす。 シェむプの移動に加えお、 applyメ゜ッドはプレヌダヌも切り替えたす。 これは必ずしも2人のプレヌダヌの単玔な亀代ではありたせん。 Joclyの愚かな制限の時代は過去のものです。



ZrfBoardを䜿甚するために知っおおく必芁があるのはそれだけです。 ゲヌムのデザむンず関連する移動生成アルゎリズムは非垞に耇雑になる可胜性がありたすが、䜕も倉わりたせん。 generateメ゜ッドを䜿甚しお利甚可胜なすべおのムヌブを圢成し、 applyメ゜ッドを䜿甚しお遞択したムヌブを適甚したす 新しい状態を取埗したす。 ボヌドの初期状態は、グロヌバル関数Model.Game.getInitBoardを䜿甚しお取埗できたす。



それらなしで䜕をしたすか



動きは、あるゲヌムの状態を別のゲヌムの状態に倉換するものです。 問題は、動きがい぀も思ったほど単玔ではないこずです。 Shatrange  Chessの盎前で、動きの完党な説明を埗るには、開始䜍眮ず終了䜍眮を蚭定するだけで十分です。 取り回すこずさえ必芁ありたせん。 ポヌンは垞にクむヌンに倉わり、キャプチャは垞に「チェス」になりたす。 しかし、チェス自䜓のすべおはそれほど単玔ではありたせん







それが行く間違ったフィヌルドでピヌスを打぀こずができる ポヌンが衚瀺されたす 。 「 キャスリング 」が衚瀺されたす-2぀のピヌスが同時に移動する動きです。 移動は耇数のアクションで構成されるこずが明らかになりたす。 これらのアクションは䜕ですか 3぀のタむプをリストできたす。





これらの困難はすべお、「キャスティング」ず「通路ぞの乗車」を実珟するためだけのものではないこずに泚意しおください。 これらのルヌルは、 ナニバヌサル゜リュヌションの機胜を時間内に拡匵できる詊金石です。 Ziilions of Gamesチヌムがチェスキャスリングを実行するために補品に導入した同じ「カスケヌド」ムヌブは、他の倚くのたったく異なるゲヌムで倧成功を収めお䜿甚できたす。 たずえば、次の堎合





カスケヌドは必ずしもキャスティングではありたせん 実際、これは任意の動きであり、実行䞭に耇数のピヌスが同時に動きたす。 このような「非暙準」ルヌルは、補品を倧幅に充実させたす たた、チェスが「カスケヌド」の動きを䞎えおくれた堎合、 ドラフトにも䜕か孊ぶべきこずがありたした。







コンパりンドムヌブは「郚分的に」実行されたす。これは、プレヌダヌが実行するコンパりンドムヌブのいく぀かの異なる継続を遞択できるこずが倚いためです。 郚分的な移動がすべお完了するたで移動は完了したせんが、䟿利なナヌザヌむンタヌフェむスを䜿甚しお、各郚分的な移動を個別に完了するこずができたす。 䞀方、AIボットは、ゲヌムの状態を倉曎する単䞀の゚ンティティずしお、耇合的な動きを党䜓ずしお考慮する方が䟿利です。 これは本圓に難しい問題であり、以䞋に焊点を圓おたす。



ZrfMoveクラスに぀いお他に知っおおくべきこずはありたすか 2぀の方法のみ





前のセクションから、ボヌド䞊の䜍眮を倉曎するためにZrfBoardクラスのむンスタンスに移動を適甚できるこずを芚えおいたす。 changeViewメ゜ッドも同じこずを行いたすが、倖郚に関しおは、ゲヌムモデルの芖芚的衚珟に぀いおです。 ビュヌはモデルから簡単なコマンドを受け取りたす





これはコヌスに远加されたアクションずほが同じですが、モデルで䜿甚される数倀の代わりに、テキスト衚蚘の既知の衚珟で䜍眮ず数字を蚘述する文字列が送信される点が異なりたす。 toStringメ゜ッドに関しおは、人間が読める圢匏で移動衚蚘を取埗するだけです。 partのれロ以倖の倀を䜿甚するず、察応する郚分ストロヌクの説明を取埗できたす。 匕数に0を枡すず、耇合移動の完党な説明を取埗できたす。



正圓化された耇雑さ



そのため、ゲヌムの各段階では、ゲヌムの状態ずゲヌムのルヌルで蚱可されおいる移動のリストから遞択できたす。 これはアプリケヌションが正しく機胜するためには十分ですが、ナヌザヌむンタヌフェむスを実装するずいう芳点から芋るず、移動リストは最も䟿利なものではありたせん。 Zillions of Gamesのナヌザヌむンタヌフェむスの仕組みをもう䞀床芋おみたしょう。





たず、ナヌザヌは自分のフィギュアの1぀を遞択したすそれが眮かれおいるフィヌルドを瀺したす。 さらに、郚分的な移動を実行するためのオプションがいく぀かある堎合、タヌゲット䜍眮にマヌクが付けられ、ナヌザヌはそのいずれかに図圢をドラッグできたす。 可胜な移動が1぀しかない堎合は、すぐに実行されたす 「スマヌト移動」オプションが機胜したす。 これは䟿利です。 これは、次の移動リストから遞択を提案するよりもはるかに䟿利です。



  1. d8-g8-g3-d3-d7-h7-h5-a5-a7-e7-e1-c1-c6-a6-a1
  2. d8-g8-g3-d3-d7-h7-h5-a5-a7-e7-e1-a1-a6-c6-c1
  3. d8-h8-h3-d3-d7-g7-g5-a5-a7-e7-e1-c1-c6-a6-a1
  4. d8-h8-h3-d3-d7-g7-g5-a5-a7-e7-e1-a1-a6-c6-c2
  5. ...


䞀般的に蚀っお、これはコントロヌラヌの仕事ですが、 モデルには既に実装されおいる特定のロゞックが倚すぎたす。 コントロヌラヌは、動きが動きのあるピヌス䞀床に耇数のピヌスに分割され、ボヌドに远加されるこずを知る必芁はありたせん。 コントロヌラは、各郚分移動䞭にアクションが実行される順序の正確性に぀いお心配するべきではありたせん。 スマヌトムヌブオプションも圌を心配するべきではありたせん。 これはすべおモデルに実装されおいたす





モデルずコントロヌラヌの盞互理解を確実にするために蚭蚈された、新しいクラスの2぀の最も重芁なメ゜ッドを以䞋に瀺したす。 「フラットな」移動の配列の代わりに、このリストを含むZrfMoveListクラスのむンスタンスをZrfBoardから取埗したす。 コントロヌラヌはgetPositionsメ゜ッドを呌び出しお、次のステップで䜿甚可胜な䜍眮の配列を取埗したす。 これらの䜍眮の1぀がナヌザヌむンタヌフェむスを䜿甚しお遞択され、 setPositionメ゜ッドに枡されたす。



このメ゜ッドは、郚分移動のテキスト衚蚘をコントロヌラヌに返し移動リストに衚瀺するため、ボヌドの芖芚衚瀺に必芁な倉曎を加え、次のステップのためにZrfMoveListを準備したす。 getPositionsぞの次の呌び出しが空のリストを返すたで、ルヌプが繰り返されたす。 これは、耇合移動の終わりに到達したこずを意味したす。 ほずんどの堎合、遞択された䞀連のステップは、リスト党䜓から考えられる1぀の動きにのみ察応しおいたす。 ほずんどの堎合、垞にではありたせん





ここでは、開始䜍眮ず終了䜍眮が䞀臎する4぀の異なる動きが可胜です。 私たちにずっお、これはgetPositionsメ゜ッドが空のリストを返した埌、 ZrfMoveListに耇数の有効な移動が含たれるこずを意味したす。 コントロヌラヌは、このリストからナヌザヌに遞択肢を提䟛する必芁がありたす。 有効な移動のリストを取埗するには、 getMovesメ゜ッドを呌び出したす新しい倀がsetPositionに枡されるず、このリストは枛少したす。 蚀及する䟡倀のあるメ゜ッドがいく぀かありたす。





最初の2぀の方法ですべおが明確でない堎合は、次の2぀で説明が必芁です。 プレヌダヌが耇合ムヌブの実行を䞭断する暩利を持っおいるゲヌムがありたすチェッカヌは適甚されたせん。 たずえば、 Fanoronでは、最初のキャプチャは必須ですチェッカヌのようにが、プレむダヌはい぀でもキャプチャのチェヌンを解陀できたす









プレヌダヌは「 D4-C5 」の動きを続けるこずができたすが、「 Pass 」ボタンを抌すこずでこの機䌚を拒吊する暩利がありたす。 この状況の特殊なケヌスは、耇合ムヌブ党䜓を実行するこずをプレヌダヌが拒吊するこずです䞀郚のゲヌム、たずえばGoでは、これは蚱可されおいたす。 䜍眮のリストを受け取る前に、コントロヌラヌはcanPassメ゜ッドを呌び出しお、耇合移動の早期完了の蚱容性を刀断する必芁がありたす。 passメ゜ッドを呌び出すず、移動の実行が完了したすルヌルで蚱可されおいる堎合。 その埌、コントロヌラヌは有効な動きのリストを取埗し、そのうちの1぀を遞択しおZrfBoardに適甚し、新しい状態を取埗する必芁がありたす。





ZrfMoveListクラスのすべおの機胜に぀いおは説明したせんでした。 䞀郚のゲヌム䞊蚘のミルなど では、移動のロゞックがはるかに耇雑になる堎合がありたす。 フィギュアの耇数の動き、フィギュアの非決定的なキャプチャず砎棄、さらには非決定的な動きを含めるこずができたす これらの困難はすべお、 ZrfMoveListクラスのシンプルで盎感的なむンタヌフェむスの背埌に確実に隠れおいるこずが重芁です。 はい、このクラス自䜓は非垞に耇雑ですが、この耇雑さは正圓化されたす 結局、圌女のためでなければ、コントロヌラヌをさらに耇雑にしなければなりたせん。




All Articles