ダガズ:手順

画像 -昔、私はチェッカーを拾いませんでした!

-チチコフは言った、彼のサーベルも動かした。

「あなたがどれほどひどくプレイしているか知っています!」

-サーベルとして話す、Nozdrevは言った。



ニコライ・ヴァシリエヴィチ・ゴゴル「Dead Souls」



私は研究所で私たちに与えられたヘーゲル弁証法を非常に漠然と覚えています。 通常、講義の冒頭で制御不能な眠気に負けました。 「歴史はらせん状に発達している」と言われたことを覚えているだけです。 「否定の否定」の原則に関連しているようです。 私はこの法律の普遍性についてはよくわかりませんが、私に関しては実施されています。 覚えている限り、同じことを何度も繰り返します。 これが私の改善方法です。 そうであっても、私は再びチェッカーを作成しています。 そしてそれは素晴らしいことです!



私が何度も言ったように、チェッカーは難しいです! チェスのゲーム自体はおそらくチェスよりも簡単です(それらを比較することは完全に正しいわけではありませんが、ゲームは根本的に異なります)、それはそれについてではありません。 チェッカーの実装はもっと複雑です! チェスがカスケード移動( キャスリング )で「豚を置く」場合、ドラフトファミリーのゲームでは、さらに2つの複雑な「オプション」が一度にあります。





優先順位がチェッカーを特別なものにします! ほとんどすべてのチェッカーゲーム(例外はほとんどありません)では、キャプチャが必要かどうかに関係なく、キャプチャは必須です。 組み合わせゲーム全体がこれに基づいて構築されています。 敵の駒を1回の打撃で拾う(そして同時に女性を押さえる)ことで、チェッカーに「屈する」ことができます。 より多くを拾うために少なく与えてください! しかし、これは氷山の一角にすぎません!





このゲーム(位置はYu。BarskyとB. Herzensonの「ドラフトボード上の冒険」の本から取られています)では、Whiteは単にピースを犠牲にするのではなく、相手を特定の方法で歩かせます。 彼らは、ブラックがすべての捕獲を完了し、(この時点で)ボード上で彼の作品を自由に動かさなければならないという事実を利用して、最終的なトラップを準備します。 ホワイトは彼の動きで「フラッシュ」を作成します。これは、チェッカーのポジションゲームがどれほど美しいかを示す優れた例です。



ところで、言う
チェッカーのドラフトが常に厳密に必要とされるわけではありませんでした。 そして、ロシアの草案と英語で、そしてさらに初期のAlcuercでさえ、「 怒りのルール 」があり、それは捕獲を完了しなかった「あくび」の図を撮ることを可能にしました。 このような行動は動きとは見なされず、「おかしなことをする」と呼ばれていました(「英語の草案」のハフィング)。 私はまだ幼少期にこのルールを見つけましたが、歴史はすでに最終的な文を通過しているようです。



怒りのルールは、どんな組み合わせゲームにも終止符を打ちます! 経験豊富な製図工は、わざわざわざに陥るのではなく、「あくびをする」姿を失うことを好みます。そのため、ゲーム全体を失うことになります。 現在、このルールはアフリカのさまざまなゲームにのみ適用され、伝統的に大きなボードで高速でプレイされます。



私にとって優先順位は、まず第一に最適化です。 実際、Dagazの「 独自の魔法 」を使用して、後処理段階で以前に形成された動きの実行を禁止することができます(これはまさにチェス ゲームで行うことです)。 さらに、生成された動きを変更したり、新しい動きを追加することもできます。 しかし、これはすべてメモリと時間を犠牲にして行われます( UCTボットが取り上げられると、どちらも非常に重要になります)。 私の場合、パフォーマンスは、コンピューターの対戦相手の「合理性」ほどインタラクティブではありません。 ボットはより高速に動作し、より多くのポジションを解析する時間があります!



チェッカーの場合、動きの生成は2つの可能な状況になります。 キャプチャがない場合、それほど多くの「サイレント」ムーブはありません。 キャプチャが表示されると、すべてが変わります。 私は全体としてすべての化合物の動きを生成するため、組み合わせ論がケースに含まれています。 たとえば、このテストでは、女性との通常の位置で42の可能な動きが生成されます! そして、「 トルコの草案 」のルールに従って、最大数の駒を使って動きをフィルタリングしなかった場合、これらの動きの多くがあります ! このリストに「サイレント」ムーブを追加し、その後のフィルタリングで後処理を行うと、無駄になります。



ここで私は最初の重要なバグを見つけました


ガントレットは非常にダイナミックで非常に興味深いチェッカーゲームです。 1980年にPhillip L.Leducによって設計されました。 ゲームは非対称です。 白は最後の水平線まで(少なくとも1つ)突き抜ける必要があります。 黒-これを防ぐようにしてください。 キャプチャはチェッカーに似ていますが、すべてのピースが一方向にのみ移動するため、複合移動の完全な実装は必要ありません(ところで、同様のキャプチャメカニズムを持つ別の伝統的なハワイのゲームがあります)。 それどころか、このゲームでは、キャプチャが必須であり、これがゲームの重要なコンポーネントであるため、優先順位が使用されます。



特定の状況では、モデルは動きを生成しなくなり、ゲームが即座に停止しました。 エラーが優先順位処理メカニズムに関連していることは明らかでしたが、私はすぐに問題が何であるかを理解しませんでした。 最初は、フィルタリングロジックを拡張機能に移動し、優先度を無効にしました(これはパフォーマンスの問題にすぎません)。 チェッカーでエラーが繰り返され始めたとき、問題に対処する必要があることが明らかになりました。



このコードがすべてです
var priors = []; _.chain(_.keys(this.pieces)) .filter(function(pos) { return Dagaz.Model.sharedPieces || Dagaz.Model.isFriend(this.pieces[pos], this.player); }, this) .each(function(pos) { var piece = this.pieces[pos]; _.chain(design.pieces[piece.type]) .filter(function(move) { return (move.type == 0); }) .each(function(move) { var g = Dagaz.Model.createGen(move.template, move.params, this.game.design); g.init(this, pos); addPrior(priors, move.mode, g); }, this); }, this); ... for (var i = 0; i <= design.modes.length; i++) { var f = false; if (!_.isUndefined(priors[i])) { while (priors[i].length > 0) { var g = priors[i].pop(); g.generate(); if (g.completed && !g.move.isPass()) { if (cont && (g.moveType == 0)) { CompleteMove(this, g); } f = true; } } } if (f) break; if (i >= design.modes.length) break; }
      
      





ここでは、プレーヤーのすべての数字が整理され、それぞれの可能な動きに対してジェネレーターが作成されます。 ジェネレーターは、移動の優先度に従って、小さなハッシュに配置されます。 次に、最も高い優先度からハッシュがスキャンされます。 少なくとも1つの動きを生成できる場合、優先順位の低い動きのジェネレーターは考慮されません。



エラーは、最初のキャプチャで、事前に生成された移動としてマークしたことです。 その結果、ジェネレーターはキャプチャを見て、動きをマークし、次に移動して、彼が作品を置くことになっていた場所で忙しいフィールドに出くわしました。 これにより、ほぼ完了した移動がリセットされましたが、移動がすでにマークされているため、優先順位の低い「サイレント」移動は単純に破棄されました。 修正した後、AIガントレットはより良くプレイし始めました。 パフォーマンスが重要です!



ドラフトについて少し話す時間だと思います。 私たちの多くは、このゲームのロシア語版、そしておそらく国際版のみに精通しています。 実際、ドラフトが増えています(従来のゲームのみを検討している場合でも)。 はるかに! ゲームは互いに非常によく似ており、多くの場合、細部だけが異なります。







写真はクリック可能です。 二回! 参考として、中世の「 アルクエルク 」と「 キツネとガチョウ 」をご覧ください 。 これらは、複合テイクが登場した最初のゲームのようです。 ここでの考え方は、「チェッカー」キャプチャを完了した後、そのピースは別のピースを取得することで移動を続行する権利を獲得するということです。 そして、連れて行く人がいる限り。



ダイアグラム内のリンクは非常にarbitrary意的です。 それらは歴史的な発展を反映していません(私たちの時代では、すでに復元される可能性は低いです)、むしろゲームのルールの異なるバージョンの相互接続を反映しています。 したがって、例えば、「 セネガルチェッカー 」は「 トルコチェッカー 」の先駆者ではなく、したがって「直交」方向全体ではありません。 それらはより古風であり、これは事実ですが、最も可能性が高いのは、いくつかの未知の共通の祖先から並行した開発があったことです。



別の家族の側から、2つの重要な歴史的出来事が同時に発生しました-直交運動の拒否(対角線の動きを好む)と伝統的なチェス盤の使用(チェスの人気の高まりをきっかけに、この決定はゲームの分布に最も有益な影響を与えました) 繰り返しますが、いつどこで起こったのかわかりません。 おそらく、接続リンクは、フィリピンのドラフトであるDanaだったとは言えません。



英語チェッカー 」は、ルールの最も原始的なバージョンを使用するため、「対角線」ファミリーのルートです。 それらの非回転人物は後方に移動することはできません(撮影中であっても)、女性はあらゆる方向に移動する権利があるという点でのみ異なります。 これは非常にゆったりしたゲームです。 イタリア人はボードを90度「回転」させ、女性たちに触れられないようにしました(単純な人物はそれらを「チョップ」できません)。 ところで、このアイデアを発展させる興味深い種類のゲームがあります。





Spanish Checkers 」では、ボードも90度回転しますが、「飛ぶ」長距離の女性がいます(シンプルなピースはまだ「チョップ」できません)。 女性は非常に強くなり、初めて「捕まえる」タスクが発生します。



すべての製図工がこれを行える必要があります!
3人の女性が1人を捕まえます(彼女が「ビッグ」、つまりボードのメインの対角線を占有しなかった場合)。 これは、少なくとも2つの戦術的構成を使用できる解決策として興味深いタスクです。有名なペトロフ三角形とあまり知られていないシュティクゴニャエフです。





練習したい人はここでできます



このゲームのアルゼンチン版とタイ版では、女性の機動性が制限されているため、撮影した数字の後ろの最初のフィールドでのみ停止できます(もちろん、無料の場合)。 ちなみに、まったく同じように、「 ギリシャのチェッカー 」は「トルコの女性」の機動性を制限します。 次に、おなじみのゲームのバリエーションがあり、単純な数字で「取り戻す」ことができます。



テイクについてもう少し
長距離ダムを備えたドラフトのほとんどすべてのバリエーション(「トルコ語」と「ギリシャ語」を除く)は、「 トルコのストライキ 」ルールを使用します。これは、ダムの移動を制限することも目的としています。 その本質は、取られたピースが移動の最後にのみボードから取り除かれることです。 これは女性を制限し、彼女の動きを妨げます(もちろん、コース中に繰り返し数字を撮ることは禁止されています)。 現在の反復の2番目の複雑なバグは、このルールに関連付けられていました。



私はそれを簡単にすることにしました-複合移動のすべてのテイクを最後の部分移動に移動します。 これは意図したとおりに機能しました。ピースはコース全体にわたってボード上に残り、完了後にボードから削除されました。 もちろん、ピースの再取得を防ぐためにモデル変更する必要がありました (そうでなければ、移動ジェネレーターは単にサイクルをたどり、「拡張魔法」に到達しませんでした)。 残念ながら、私は主なことをするのを忘れていました-この変更後にテストを実行してください! その結果、私は多くの時間を費やしました。 複合キャプチャのロジックは、かなり自明ではなく、目立たない方法で「壊れた」。 突然でひどいものでした。 すべてが壊れています!



最後に、解決策を見つけました
 ZrfMoveGenerator.prototype.isCaptured = function(pos, level) { if (this.parent) { return this.parent.isCaptured(pos, level); } if (_.isUndefined(this.captured)) { this.captured = []; } if (this.captured[pos] && (this.captured[pos] < level)) return true; _.each(Dagaz.Model.getDesign().allPositions(), function(p) { if (this.captured[p] && (this.captured[p] >= level)) { delete this.captured[p]; } }, this); this.captured[pos] = level; return false; } ZrfMoveGenerator.prototype.capturePiece = function(pos) { if (Dagaz.Model.deferredStrike) { if (this.isCaptured(pos, this.level)) return false; } this.move.capturePiece(pos, this.level); if (!Dagaz.Model.deferredStrike) { this.setPiece(pos, null); } return true; }
      
      





しかし、これには多くの時間と労力が費やされました。 テストを忘れないでください! そして、まだ、このようにしないでください:

 _.chain(move.actions) .filter(function(action) { return (action[0] !== null) && (action[1] === null); }) .each(function(action) { action[3] = mx; });
      
      



結果は素晴らしいものになりますが、あなたはそれを好まないでしょう! 反復するコレクション内のフィールド(最も害のないフィールドであっても)を変更しないでください。 再作成し、不変のままにしてください:



 var actions = []; _.each(move.actions, function(action) { var pn = action[3]; if ((action[0] !== null) && (action[1] === null)) { pn = mx; } actions.push([ action[0], action[1], action[2], pn ]); }); move.actions = actions;
      
      





ロシアのドラフト (ちなみに、「大男の女性」問題を解決する別の非常に独創的な方法があります)は、 国際的なものとは異なります(もちろん、ボードのサイズに加えて)重要な詳細は1つだけです。 ロシアのドラフトでは、女王への変身は「オンザフライ」で発生します。 移動は中断されず、図はすでに名誉を奪い続けています(ソフトウェア実装の観点から、これは最も明白な動作でした)。 国際的には、変形の分野に落ちた後でも図形は引き継がれますが、単純な図形のように「カット」され、図形自体が最後の水平で移動を終了した場合にのみ変換自体が発生します。 ここでは特別な拡張機能を作成する必要がありましたが、そのデバッグは問題を引き起こしませんでした。



一方、Alcuirkも進化しました。 開発はチェッカーの開発と並行して行われ、後者からは単純な数字のコース「前方のみ」、「空飛ぶ女性」、さらには「トルコのストライキ」のルールさえも描かれました。 「 Zamma 」と「 Harbagh 」の非常に独創的で非常に独創的なゲームであることが判明しました。チェス盤に飽きている人にお勧めできます。







フィンランド人は私たちのために別の古代のゲームを保存します






このゲームは Alcuercに非常に近いです。 その中に「空飛ぶ女性」はなく、変容すらありません! ゲームには「王」と「王子」がいますが、これらの投稿は一生のものです。 単純な人物は「君主」になることはできません。 また、「タイトル」の数字を脅かすことはできません(この点で、ゲームは「イタリアのチェッカー」に似ています)。 ゲームは非常にゆっくりですが、ファンがいます。



私にとって、 Dablotはより複雑な優先システムに興味がありました。 ゲームでのキャプチャは必須ですが、「王」や「王子」のキャプチャではありません。 つまり、単純なフィギュアで撮影できる場合は、撮影する必要があります(そのような動きがある場合は、「キング」でも撮影できます)が、「キング」または「プリンス」だけが脅威を作成する場合、「サイレント」な動きをすることが許可されます。 これにより、かなり単純な拡張が行われました(ZRFレベルでは、優先順位を無効にする必要がありました)。 ただし、ここで少し耕すことができまし



  if (_.chain(board.moves) .filter(function(move) { return _.isUndefined(move.failed); }) .filter(function(move) { return move.actions.length > 1; }) .filter(function(move) { ... - }).value().length > 1) { + }).value().length >= 1) { _.chain(board.moves) .filter(function(move) { return move.actions.length == 1; }) .each(function(move) { move.failed = true; }); }
      
      





ゲームのこの方向の発展の王冠、マダガスカルファノロナを考えます。 これは、完全に異なるキャプチャメカニズムを使用するため、すでにチェッカーとはまったく異なります。 もちろん、共通の機能があります-キャプチャも複合です。 同時に、Fanoronaは、プレイヤーがキャプチャのチェーンを中断する権利を持つ唯一のゲームです(キャプチャ自体は必須のままです)。





このゲームは私にとって本当の強さのテストになりました。 ここにすべてがありました:モデルを壊し、コントローラーと新しい面白いバグを書き換えます。 しかし、すべては順調に終わり、順調です。 繰り返しは完了し、明確な良心をもって休暇に行くことができます!




All Articles