障害远跡


なんお遅い囜 -女王は蚀った。 -さお、ここで、
あなたは知っおいる、あなたはただ滞圚するだけ速く走らなければならない
同じ堎所に 別の堎所に行きたいなら
少なくずも2倍の速床で実行する必芁がありたす

ルむス・キャロル「 アリス・スルヌ・ザ・ルッキング・グラス 」

今日は、2幎匱前に出䌚った、過小評䟡されおいる玠晎らしいゲヌムに぀いおお話したいず思いたす。 ある意味で、 Dmitry Skiryukず知り合いになったのは、このゲヌムずUrの おかげです 。 圓時、私はボヌドゲヌムに興味を持ち始めおいたした。 私の知識は乏しく、倚くの点で玠朎でした。 チェむスのようなゲヌムは文字通り私に広倧な䞖界を開いた。 今でも、このゲヌムでの䜜業は、倧郚分が探偵小説に䌌おいたす。 この点で、ゲヌム「 チェむス 」は、その名前ず類䌌点の䞡方を、有名なアメリカの䜜家の仮名ず完党に正圓化したした。

ゲヌムはトムクルシェフスキヌによっお開発され、1986幎にTSRによっお開始されたした。 特別なボヌドに加えお、各プレむダヌは10ヘクスのサむコロを持っおいたすが、それにもかかわらず、このゲヌムは偶然のゲヌムではありたせん。 キュヌブは、進行の順序を決定するために䞀床だけスロヌされ、将来的には数字ずしおのみ䜿甚されたす。 䞊偎のポむントの数は、キュヌブを移動できるステップの数を瀺しおいたす。 したがっお、1぀のポむントを持぀キュヌブは、2぀のポむント盎線䞊の2぀のラむン、3぀のラむン、3぀のラむンなどを䜿甚しお、6぀の方向のいずれかに隣接するフィヌルドに移動できたす キュヌブは、指定されたステップ数だけ、正確に移動する必芁がありたす。 移動の過皋で、立方䜓は反察偎を回転したせん䞊面の点の数は倉わりたせん。 初期配眮は次のずおりです。


ルヌルの詳现をご芧ください。
各プレヌダヌの䞊面の合蚈ポむント数は25です。プレヌダヌは、ゲヌムの終了たでこの量を維持する必芁がありたす。 プレむダヌはタヌンを取り、そのうちの1人が1人たたは2人、これも可胜の堎合、察戊盞手はゲヌムから陀去されたポむントの合蚈を最小ポむント数でサむコロに远加する必芁がありたすゲヌムの開始時、これはナニットの1぀です。 その埌、すべおのポむントが分散されない堎合、残りはさらに分散され、垞に最小のポむントを持぀キュヌブから開始されたす。 サむコロの残りが5個未満のプレヌダヌは、ボヌドに残っおいるサむコロに必芁なポむント数を分配できないため、負けずなりたす。


ボヌドの境界は、ピヌスの動きを劚げたせん。 ボヌドの巊右の境界線は互いに「接着」されおおり、図の䞊䞋の境界線からはね返っお跳ね返りたす。 もちろん、これは数字が劚げられずに動くこずを意味したせん。 人物はお互いに「飛び越える」こずはできず、「 商工䌚議所 」の䞭倮フィヌルドも同様です。 察戊盞手の駒をキャプチャするには、その駒が完党な数のステップを盎線で完了するこずによっお、その䞊に「立぀」必芁がありたすチェスキャプチャ。 移動は、その色の数字で終了する堎合がありたす。 この堎合、「 バンピング 」が発生したす。タヌゲットフィヌルドに衚瀺される図圢は、1ステップず぀移動し、移動方向を継続したすボヌドずリバりンドの結合を考慮に入れお。 次のフィヌルドも圌のフィギュアで占められおいる堎合、「 バンピング 」は最初の空のフィヌルドたたは敵のフィギュアで占められおいるフィヌルドたでさらに広がりたす敵のフィギュアは取り陀かれたす。 このような動きを䞍可胜にする障害は1぀だけです。 バンピングを䜿甚しお䞭倮のセルに図圢を「抌し蟌む」こずは犁止されおいたす。

最初の䜍眮から、各プレヌダヌは自分のすべおのピヌスを呚期的にシフトし、いずれかのナニットを2の方向に移動できるこずに気付くこずができたす。 同様の動きが芏則で蚱可されおいたす。 たた、隣接するフィヌルドにある同じ色の数字の間でポむントの「亀換」を蚱可したした。 したがっお、5ず2のペアは、4ず3、たたは1ず6に倉わる可胜性がありたす。 調査されおいない動きは1皮類のみです。 ボヌドの䞭倮のフィヌルド Chamber を通過できるピヌスはありたせんが、このボヌドでの動きを終了できたす。 これが発生した堎合、図はポむントの総数を維持しながら2぀に「分割」されたす。 数字は垞に分割され、受信した数字の1぀のポむントが他の数字のポむントを1以䞋超えないようにしたす。各プレむダヌの数字の合蚈数は10を超えるこずはできたせんこの堎合、ゲヌムの開始時に、各プレむダヌは1぀のダむス予備。


断片の「拡倧」の方向は、矢印の先端に䌌おいたす。 倚数のポむント存圚する堎合を持぀キュヌブは垞に巊に移動したす。 2぀の特殊なケヌスでは、「分割」は䞍可胜です。 たず、䞊蚘で述べたように、1色の立方䜓の数は10を超えるこずはできたせん。さらに、1ポむントで立方䜓を分割できないこずは明らかです。 どちらの堎合も、 郚屋に入る立方䜓はそのたた巊方向に出たす。 商工䌚議所を出た各フィギュアは、自分のフィギュアを叩くか、盞手のフィギュアを手に入れるこずでバンピングを開始できたすこの方法でのみ、䞀床に2぀の敵の駒を手に入れるこずができたす。

Tom KruszewskiずTSRは、朜圚的な芖聎者の胜力を倧きく過倧評䟡しおいるず蚀わざるを埗たせん。 倧衆消費者にずっお、ゲヌムは耇雑すぎたしたチェスもそれほど耇雑ではありたせんが、誰もが慣れおいたす。 補造業者は生産を停止しおおり、珟圚、Chaseはさたざたな芋本垂、オヌクション、販売で手でのみ賌入できたす。 それでも、このゲヌムは20䞖玀の最高のゲヌムの1぀ず考えられおいたす。

簡単な仕事


ゲヌムはボヌドから始たり、チェむスのボヌドは...独特です。 以前は、六角圢のボヌドでゲヌムを䜜成する必芁はありたせんでした。これが最初の非垞に小さな障害でした。 これは興味深い点であり、私はそれに぀いおあなたにもっず䌝えたいです。 ZRFでゲヌミングボヌドを蚘述するためのメカニズムは十分に怜蚎されおおり、飛行機に衚瀺され、ゲヌム䞭に倉化しない限り、ほがすべおのボヌドを実装できたす。

これは芋た目です
(board (image "../Images/Chase/board.bmp") (grid (start-rectangle 48 32 108 82) (dimensions ("a/b/c/d/e/f/g/h/i/j/k/l/m" (60 0)) ("1/2/3/4/5/6/7/8/9" (-30 52)) ) (directions (se 1 1) (w 1 0) (sw 0 1) (nw -1 -1) (e -1 0) (ne 0 -1)) ) (kill-positions j1 k1 l1 m1 j2 k2 l2 m2 a3 k3 l3 m3 a4 k4 l4 m4 a5 b5 l5 m5 a6 b6 l6 m6 a7 b7 c7 m7 a8 b8 c8 m8 a9 b9 c9 d9 ) ) 

モデルの詳现が芖芚化の問題ず混ざるこずは䞻匵したせんが、䞀方を他方から分離する必芁があるたでたずえば、ボヌドをアむ゜メではなく「正盎な」3Dで衚瀺するたで、このアプロヌチは非垞にうたく機胜したす。 この説明をさらに詳しく考えおみたしょう。

  • 説明の䞍可欠な郚分は、ボヌドの画像を含むファむルです。 図圢の幟䜕孊的なサむズず䜍眮はすべおそれに添付されたすこのため、 倉庫番の実装の分垃のほずんどは、さたざたな圢状ずサむズの黒い長方圢です。 ボヌドの画像をBMP圢匏 ZoGはこの圢匏のみを理解で含むファむルは、キヌワヌドimageによっお決定されたす 。 ここでは、耇数のファむルを䞀床にスキン間の切り替えを可胜にするために定矩できたすが、幟䜕孊的な比率は同じです。
  • gridキヌワヌドを䜿甚するず、䜍眮のn次元配列を蚘述できたす。 ほずんどの堎合、これは䜿い慣れた2次元のボヌドですが、異なる次元最倧5぀のボヌドを定矩するこずもできたす。 個々の䜍眮に䞀意の名前が付けられおいる堎合、ボヌドは耇数のグリッドで構成できたす。 「 Quantum Tic-Tac-Toe 」で行われる方法ず同様に、匷い欲求があれば、 グリッドを別のグリッドの䞊に配眮するこずさえできたす。
  • 「セル」のサむズずグリッドの䜍眮は、 start-rectangleキヌワヌドによっお決定されたす。 2組の敎数は、最初巊䞊のセルの巊䞊隅ず右䞋隅の画面座暙x、yを指定したす。
  • 以䞋は「次元」の説明です。 各説明には、2぀の敎数だけでなく、名前の文字列䜍眮の名前はデカルト積によっお結合されたすが含たれたす。 これらの数字には、六角圢や等尺性のボヌドを蚘述するこずができる「魔法」がありたす。 これは、次のグリッドセルをシフトするシフトにすぎたせん。 通垞2次元ボヌドの堎合、1぀の次元では、セルはxのセル幅だけシフトされ、もう1぀の次元では-yのセルの高さだけシフトされたすが、これらのセルをxの幅の半分だけシフトするず、六角圢のボヌドの優れたベヌスを取埗できたす。
  • グリッドの 「マゞック」の2番目のコンポヌネントは方向です。 ボヌドは䜍眮だけでなく、ボヌド間の通信名前付きおよび䞀方向でもありたす。 もちろん、各接続の名前ず䜍眮のペアを指定するこずによっお、各接続を個別に決定する手間はありたせんが、倧きなボヌドを定矩する堎合、このプロセスは面癜くありたせん。 Directionsキヌワヌドを䜿甚するず、䜍眮名ではなく、グリッド内のルヌトを操䜜できたす。
  • 必芁な圢状のボヌドを取埗するには、より倧きなサむズの「長方圢」ボヌドを䜿甚し、次にセルをセルの半分だけシフトしたす。 その結果、ボヌドから「切り離す」必芁がある「䜙分な」ポゞションがありたす。 kill-positionsキヌワヌドを䜿甚するず、以前に定矩された䜍眮名を無効ずしお宣蚀できたす。 もちろん、削陀された䜍眮では、察応する接続​​も切断されたす。


gridキヌワヌドを䜿甚するず、「暙準」ボヌドを蚘述する際の手䜜業の量を倧幅に削枛できたすが、このアプロヌチには特定の欠点がないわけではありたせん。 第1に、敎数座暙ずオフセットのみで動䜜し、遞択した幟䜕孊的寞法に合わせおボヌドの画像が描画されおいない堎合、ボヌドのすべおの䜍眮の䜍眮を完党に揃えるこずは困難です。 䜍眮の個々の説明は簡朔ではありたせんが、互いに独立しお䜍眮を調敎できたす。 同時に、それは単玔な殺人量の手䜜業を必芁ずしたす行われたすべおのタむプミスを修正する必芁性を考慮しお。 このプロセスを簡単にするために、「倧たかな」説明にグリッドを䜿甚したす。その埌、小さなスクリプトを䜿甚しお䜍眮の個別の説明を取埗したす 。

スクリプト
 my @grid; my %kp; my $sx, $sy, $dx, $dy; my $dm = 0; while (<>) { if (/\(start-rectangle\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\)/) { $sx = $1; $sy = $2; $dx = $3 - $1; $dy = $4 - $2; } if (/\(\"([^\"]+)\"\s+\((-?\d+)\s+(-?\d+)\)\)/) { my @a = split(/\//, $1); $grid[$dm]->{ix} = \@a; $grid[$dm]->{x} = $2; $grid[$dm]->{y} = $3; $dm++; } if (/\(kill-positions/) { $fl = 1; } if ($fl) { if (/\s(([a-z0-9]{1,2}\s+)+)/i) { my @a = split(/\s+/, $1); foreach my $p (@a) { $kp{$p} = 1; } } if (/\)/) { $fl = 0; } } } sub try { my ($ix, $pos, $x, $y) = @_; if ($ix < $dm) { my $i = 0; foreach my $p (@{$grid[$ix]->{ix}}) { try($ix + 1, $pos . $p, $x + $i * $grid[$ix]->{x}, $y + $i * $grid[$ix]->{y}); $i++; } } else { if (!$kp{$pos}) { my $a = $sx + $x; my $b = $sy + $y; my $c = $a + $dx; my $d = $b + $dy; print " "; printf "($pos %3d %3d %3d %3d)\n", $a, $b, $c, $d; } } } try(0, '', 0, 0); 


結果
  (positions (a1 48 32 108 82) (a2 18 84 78 134) (b1 108 32 168 82) (b2 78 84 138 134) (b3 48 136 108 186) (b4 18 188 78 238) (c1 168 32 228 82) (c2 138 84 198 134) (c3 108 136 168 186) (c4 78 188 138 238) (c5 48 240 108 290) (c6 18 292 78 342) (d1 228 32 288 82) (d2 198 84 258 134) (d3 168 136 228 186) (d4 138 188 198 238) (d5 108 240 168 290) (d6 78 292 138 342) (d7 48 344 108 394) (d8 18 396 78 446) (e1 288 32 348 82) (e2 258 84 318 134) (e3 228 136 288 186) (e4 198 188 258 238) (e5 168 240 228 290) (e6 138 292 198 342) (e7 108 344 168 394) (e8 78 396 138 446) (e9 48 448 108 498) (f1 348 32 408 82) (f2 318 84 378 134) (f3 288 136 348 186) (f4 258 188 318 238) (f5 228 240 288 290) (f6 198 292 258 342) (f7 168 344 228 394) (f8 138 396 198 446) (f9 108 448 168 498) (g1 408 32 468 82) (g2 378 84 438 134) (g3 348 136 408 186) (g4 318 188 378 238) (g5 288 240 348 290) (g6 258 292 318 342) (g7 228 344 288 394) (g8 198 396 258 446) (g9 168 448 228 498) (h1 468 32 528 82) (h2 438 84 498 134) (h3 408 136 468 186) (h4 378 188 438 238) (h5 348 240 408 290) (h6 318 292 378 342) (h7 288 344 348 394) (h8 258 396 318 446) (h9 228 448 288 498) (i1 528 32 588 82) (i2 498 84 558 134) (i3 468 136 528 186) (i4 438 188 498 238) (i5 408 240 468 290) (i6 378 292 438 342) (i7 348 344 408 394) (i8 318 396 378 446) (i9 288 448 348 498) (j3 528 136 588 186) (j4 498 188 558 238) (j5 468 240 528 290) (j6 438 292 498 342) (j7 408 344 468 394) (j8 378 396 438 446) (j9 348 448 408 498) (k5 528 240 588 290) (k6 498 292 558 342) (k7 468 344 528 394) (k8 438 396 498 446) (k9 408 448 468 498) (l7 528 344 588 394) (l8 498 396 558 446) (l9 468 448 528 498) (m9 528 448 588 498) ) 


これは戊いの半分に過ぎたせん ボヌドの䜍眮名は、䞀般に受け入れられおいる衚蚘法に合わせお修正する必芁がありたす。 さらに、゚ッゞの呚りでボヌドを「ルヌプ」するこずを忘れずに、䜍眮のペアを方向に接続する必芁がありたす。 その結果、かなりの量の手䜜業が必芁になりたしたが、このビゞネス甚のスクリプトは䜜成したせんでしたおそらくそれだけの䟡倀はありたしたが。

理性の眠り


ずっず前にチェむスに䌚ったが、最近たでプレむできなかった。 これには非垞に豪華なボヌドが必芁です。 ある皋床のスキルがあれば、将gi盀9x9でプレむできたすが、私も持っおいたせんでした。 通垞のチェス盀8x8は、このゲヌムにはたったく䞍適切です。 最埌のZilantkonでチェむスのボヌドを獲埗するこずができたしたが、サむコロは含たれおいたせん。 私は買収を遠方の棚に投げたしたが、事件が介入しなければ倱敗したでしょう。

事故は偶然ではありたせん
私の嚘は、私たちが長い間友人であった家族ず䞀緒に誕生日に招埅されたした。 莈り物ずしお、 ボヌドゲヌムが遞ばれたした。数人の倧人が子䟛のカフェに3時間ほど座っおいなければならなかったので、圌らそしお私も䜕かで占領する必芁がありたした。 可胜な遞択肢ずしお、 別のゲヌムが提案されたしたが、私はより抜象的なゲヌムを奜むため、私も䜕かを持っお行くこずにしたした。 圓初、私はUrに぀いお考えたしたが、私が持っおいたキットでは、半円圢の棒の圢で䜜られた圌のD2「骚」 Senetにより兞型的はかなり䞍快で、投げの間に倚くのノむズを出し、他の人ず干枉する可胜性がありたした。

その時、チェむスを思い出したした。 圌のセットに20個のサむコロを補充する必芁がありたしたが、私はただボヌドゲヌムストアギフト甚に向かっおいたので、これは圓時のように思えた問題ではありたせんでした。 このサむトで、私は玠晎らしい半透明のキュヌブそれぞれ70ルヌブルを芋たしたが、人生は調敎されたした。 ストアでは、私が面倒を芋おいたキュヌブが1぀のコピヌにしか含たれおいなかったこずが刀明したした。 カザンはモスクワではありたせん。私は予算オプションに満足し、ico、dode、および他の面䜓の売り手から提䟛されたプレヌサヌから必芁なキュヌブを収集する必芁がありたした。 赀たたは緑のキットを組み立おるこずはできたせんでしたが、青ず癜倧䞈倫、倧䞈倫、 わずかに黄色がかったのキュヌブが甚意されおいたした。

もちろん、私はルヌルを誀っお解釈したした蚘憶に぀いお話したした。 私のプレれンテヌションでは、「レプリケヌタヌ」の出口にある「断片」の飛行経路は矢印ではなく、ラテン文字「 Y 」に䌌おいたした。 どうやら、特定の圹割は、玠粒子の厩壊スキヌムずの類䌌性によっお果たされた。 「フラグメント」は、ルヌルの元のバヌゞョンのように1぀のセルを移動したせんでしたが、「額面」に埓っお移動したした。 さらに、このような移動はブロックするのがはるかに簡単でした。 障害物砎片の邪魔になったり、ボヌド䞊に10個のピヌス​​があったりするなどは、移動できないず解釈されたした。 ルヌルの元のバヌゞョンでは、入力する途䞭で数字を蚭定するこずによっおのみ「 商工䌚議所 」をブロックできたす。

「 砎損した電話 」の別のリンクは、 ドミトリヌ自身でした。 チェむスの説明の䞭で、圌は、捕獲を行った人物が チェッカヌずの類掚によっお再奪取する暩利を持っおいるず述べた。 元の゜ヌスにはこれに぀いおの蚀葉はありたせんでした芪愛なるゲストは圌に通知するこずに倱敗したせんでしたが、その瞬間、私はそれに泚意を払いたせんでした。 私は蚀わなければならない、「チェむス」ず「チェッカヌ」を亀差させるずいうアむデアはすでに倚くの疑問を提起した。 リトレヌス芏則をバンピングに拡匵する必芁がありたすか 図を分割しお埗られる「断片」に 各フラグメントがキャプチャを実行した堎合はどうすればよいですか バンピングはどうですか しかし、私たちが自分で創造するこずができたような困難はありたせん 私は熱心に仕事に取り掛かりたした...

マニュアル日没
もちろん、たず第䞀に、 ドラフトのようなゲヌムにZoGで䜿甚される郚分移動メカニズムを䜿甚しようずしたした。 ごく最近では、非垞に難しいゲヌムを䜜成する過皋で、私にずっお重宝したした。 今たで、Axiomで䜿甚する必芁はありたせんでしたが、すべおが初めお発生したす。 郚分的な動きの本質は、耇雑な耇合的な動きが小さなステップに分割されるこずです。 チェッカヌでは、このような郚分的な動きで盞手の駒を取るこずが実装されたす。 同時に、コヌス実行のいわゆる「モヌド」も䜿甚されたす。これにより、キャプチャを完了するために次の郚分移動も必芁であるこずを瀺すこずができたす。

ZoGでの耇合的な動きの実装に満足しおいないのはそのためです。 たず、ZoGを理解する䞊で、郚分的な移動は、個別の独立したアクションにすぎたせん。 基本的に、それは同じプレむダヌが次々に実行する䞀連の動きです。 郚分的な移動の間に䞭間情報を転送するこずはできたせん グロヌバルフラグず䜍眮フラグは、各タヌンの開始時に自動的にリセットされたす。 これは悪魔的な䞍快感ですが、これは問題の䞀郚にすぎたせん ZoGは、耇合移動を単䞀の゚ンティティず芋なすこずはできたせん特に、このため、「 最倧キャプチャ 」ハヌドコヌドオプションを導入しお「倚数決」ルヌルを実装する必芁がありたした。このハヌドコヌドに適合しない他のアむデアは実装できたせん



これは、Claude Leroyによっお発明されたManaゲヌムの䞀郚です。 各䜍眮のダッシュの数は、フィギュアが移動できるステップ数を瀺したす。 正確な数のステップを実行する必芁があり、その際、運転䞭に匕き返すこずはできたせん。 これは埅ち䌏せが私たちを埅っおいるずころです 非垞にたれですが、2぀のステップを完了した人物が「行き止たり」に陥るこずがありたす。 圌女は動きを続けるこずができたせん。なぜなら、他の郚分が圌女に干枉し、動きを完了しなければならないので、次の䞀歩を螏み出す矩務があるからです そしお、ZoGはこの問題を解決する手段をたったく提䟛しおいたせん

もう1぀の制限は、前の郚分移動によっお移動された同じピヌスのみが耇合移動を続行できるこずです。 それはチェッカヌでたさに起こるこずですが、「チェむス」では状況はもう少し耇雑です。 たずえば、 バンピングを䜿甚しおキャプチャを実行できたす。぀たり、移動を実行したフィギュアではありたせん。 商工䌚議所では 、さらに困難です。 どちらの断片も敵の駒を奪い取り、論理的には次の郚分移動を実行する暩利がありたす。 そしお、圌らは䞡方ずも商工䌚議所に入った人物ではありたせんボヌド䞊の人物はもはや存圚したせん

単語を枛らし、コヌドを増やしたす。
 : val ( -- n ) piece-type mark - ; : mirror ( 'dir -- 'dir ) DUP ['] nw = IF DROP ['] sw ELSE DUP ['] ne = IF DROP ['] se ELSE DUP ['] sw = IF DROP ['] nw ELSE ['] se = verify ['] ne ENDIF ENDIF ENDIF ; : step ( 'dir -- 'dir ) DUP EXECUTE NOT IF mirror DUP EXECUTE verify ENDIF ; : bump ( 'dir -- ) BEGIN here E5 <> verify friend? here from <> AND IF piece-type SWAP step SWAP create-piece-type FALSE ELSE TRUE ENDIF UNTIL DROP ; : slide ( 'dir n -- ) alloc-path ! val SWAP BEGIN step SWAP 1- DUP 0= IF TRUE ELSE my-empty? verify SWAP FALSE ENDIF UNTIL DROP from here move + enemy? IF + cont-type partial-move-type + ENDIF bump enemy? IF alloc-all ELSE alloc-path @ 0= verify ENDIF add-move ; 


最終的には、敵のピヌスを取埗するずきに 衝突を行う前に 郚分移動タむプの呌び出しを远加するこずになりたす。 䞊蚘の制限は匕き続き有効です。 動きが始たった人物によっおキャプチャが実行されなかった堎合 Chamberでの衝突たたは「分裂」の結果、郚分的な動きを実行するこずはできたせんが、この圢匏でもこのコヌドは良い解決策になりたす。 圌が皌いだ堎合


このrebusを解読できず、コヌドをAxiom開発者に送信したした。 グレッグはただ回答しおいたせんが、圌は問題を解決するこずを望んでいるパッチに取り組んでいるようです。 奇劙なこずは、Axiomの郚分的な動きが本圓に機胜するずいうこずです さらに、ZRFの機胜を倧幅に拡匵したす。 これらはすべおドキュメントで詳しく説明されおおり、いく぀かのアプリケヌションで䜿甚されおいたす。 どうやら、私はちょうど運が悪かった。

郚分的な移動が機胜しなかったため、問題を解決する別の方法を探す必芁がありたした。 1回の動きですべおのアクションを完了できない堎合は、いく぀かの動きでストレッチを詊みるこずができたす 私はすでに他のゲヌムでこれを行っおおり、ボヌド䞊に特別な䞍可芖の䜍眮を䜜成し、その䞊に旗のフィギュアを配眮したした。 ピヌスが盞手のものである堎合、プレヌダヌは自分のタヌンをスキップする必芁があるこずを知っおいたした。 これは小さな倉曎ですが、他の人を惹き぀けたした。 移動を続けたピヌスをマヌクする必芁があり移動を開始したピヌスだけでなく、移動の転送順序を耇雑にしなければなりたせんでした。 党䜓ずしお、それはかなり面倒で非垞に厄介な決定でした。

私の努力の結果、ゲヌムの非垞にオリゞナルの修正が行われたしたが、残念ながらオリゞナルずの共通点が少なすぎたした。 さらに、AIの「むンテリゞェンス」によっお、「耇雑な」 タヌンオヌダヌの䜿甚が打ち負かされたした。 圌が䜿甚するミニマックスアルゎリズムは、そのような自由に非垞に吊定的に反応し、「免疫」 怜玢゚ンゞン Axiom AIの代替構成では、深さ怜玢を実装するこずは非垞に困難です。

パンくず甚


さお、私たちは自分で察戊盞手を1぀たたは2぀取り、その埌、若い方から順に残りのポむントに応じおポむントを分配したす。 しかし、若い人物が耇数いる堎合はどうでしょうか たずえば、ゲヌムの最初の段階では、各プレヌダヌには2぀の「1」がありたす。 1〜5ポむントの額面を持぀任意の数字を取埗するず、ポむントの分垃に2぀のオプションが䞎えられ、どちらを遞択するかによっおゲヌムのコヌスが倧きく倉わる可胜性がありたす。

同じ組み合わせ論
ここでは、ほずんど青から、興味深い組み合わせの問題が発生したす。 ポむントをどのようにピヌスを取埗するずきに分配できるかを理解するためには、ゲヌムに衚瀺されるプレむダヌの1人の偎の数字のすべおの組み合わせを想像する必芁がありたす。 次の3぀の条件のみがありたす。

  1. 各図は、1〜6ポむントの額面を持぀こずができたす。
  2. 数字の数は10を超えるこずはできたせん
  3. ポむントの合蚈数は垞に25です

この問題には矎しい分析゜リュヌションがあるこずは間違いありたせんおそらく読者が教えおくれるでしょうが、私はそれを探し始めたせんでした。 スクリプトをコンパむルしお、指定された条件を満たす圢状のすべおの可胜なセットを生成したした。 セット内の数字は額面順に䞊べられたす。これは、取埗したポむントがこの順序で分垃するためです。

スクリプト
 my @d; my %s; sub out { my ($deep) = @_; for (my $i = 0; $i < $deep; $i++) { print "$d[$i]"; } print "\n"; } sub dice { my ($start, $deep, $sum) = @_; if ($sum == 25) { out($deep); } if ($deep < 10 && $sum < 25) { for (my $i = $start; $i <= 6; $i++) { $d[$deep] = $i; dice($i, $deep + 1, $sum + $i); } } } dice(1); 


結果
 1111111666 1111112566 1111113466 1111113556 1111114456 1111114555 1111122466 1111122556 1111123366 1111123456 1111123555 1111124446 1111124455 111112666 1111133356 1111133446 1111133455 1111134445 111113566 1111144444 111114466 111114556 111115555 1111222366 1111222456 1111222555 1111223356 1111223446 1111223455 1111224445 111122566 1111233346 1111233355 1111233445 1111234444 111123466 111123556 111124456 111124555 1111333336 1111333345 1111333444 111133366 111133456 111133555 111134446 111134455 11113666 111144445 11114566 11115556 1112222266 1112222356 1112222446 1112222455 1112223346 1112223355 1112223445 1112224444 111222466 111222556 1112233336 1112233345 1112233444 111223366 111223456 111223555 111224446 111224455 11122666 1112333335 1112333344 111233356 111233446 111233455 111234445 11123566 111244444 11124466 11124556 11125555 1113333334 111333346 111333355 111333445 111334444 11133466 11133556 11134456 11134555 11144446 11144455 1114666 1115566 1122222256 1122222346 1122222355 1122222445 1122223336 1122223345 1122223444 112222366 112222456 112222555 1122233335 1122233344 112223356 112223446 112223455 112224445 11222566 1122333334 112233346 112233355 112233445 112234444 11223466 11223556 11224456 11224555 1123333333 112333336 112333345 112333444 11233366 11233456 11233555 11234446 11234455 1123666 11244445 1124566 1125556 113333335 113333344 11333356 11333446 11333455 11334445 1133566 11344444 1134466 1134556 1135555 1144456 1144555 115666 1222222246 1222222255 1222222336 1222222345 1222222444 122222266 1222223335 1222223344 122222356 122222446 122222455 1222233334 122223346 122223355 122223445 122224444 12222466 12222556 1222333333 122233336 122233345 122233444 12223366 12223456 12223555 12224446 12224455 1222666 122333335 122333344 12233356 12233446 12233455 12234445 1223566 12244444 1224466 1224556 1225555 123333334 12333346 12333355 12333445 12334444 1233466 1233556 1234456 1234555 1244446 1244455 124666 125566 133333333 13333336 13333345 13333444 1333366 1333456 1333555 1334446 1334455 133666 1344445 134566 135556 1444444 144466 144556 145555 16666 2222222236 2222222245 2222222335 2222222344 222222256 2222223334 222222346 222222355 222222445 2222233333 222223336 222223345 222223444 22222366 22222456 22222555 222233335 222233344 22223356 22223446 22223455 22224445 2222566 222333334 22233346 22233355 22233445 22234444 2223466 2223556 2224456 2224555 223333333 22333336 22333345 22333444 2233366 2233456 2233555 2234446 2234455 223666 2244445 224566 225556 23333335 23333344 2333356 2333446 2333455 2334445 233566 2344444 234466 234556 235555 244456 244555 25666 33333334 3333346 3333355 3333445 3334444 333466 333556 334456 334555 344446 344455 34666 35566 444445 44566 45556 55555 


294の可胜なオプションのみ。 しかし、これは戊いの半分に過ぎたせん。 レむアりト自䜓ではなく、どのようにしおそれぞれの図圢にポむントを配眮できるかに興味がありたす。 詳现な掚論で読者を退屈させるこずはせず、スクリプトずその䜜業の最終結果のみを瀺したす。

スクリプト
 my @d; my %s; sub out { my ($deep) = @_; for (my $i = 0; $i < $deep; $i++) { print "$d[$i]"; } print "\n"; } sub proc { my ($x, $r, $m) = @_; if ($x == 0) { $s{$r}++; } else { my $n = $x % 10; for (my $i = 0; $i < $n; $i++) { proc(int($x / 10), $r + $i * $m, $m * 10); } } } sub alloc { my ($x, $deep, $res) = @_; if ($x == 0) { proc($res, 0, 1); } else { my $vl = 6; for (my $i = 0; $i < $deep; $i++) { if ($d[$i] < $vl) { $vl = $d[$i]; } } if ($vl < 6) { my $cn = 0; my $ix = 0; for (my $i = 0; $i < $deep; $i++) { if ($d[$i] == $vl) { $cn++; $ix = $i; } } my $y = $d[$ix]; $d[$ix] = 6; $x -= 6 - $vl; if ($x < 0) { $x = 0; } alloc($x, $deep, $res * 10 + $cn); $d[$ix] = $y; } } } sub dice { my ($start, $deep, $sum) = @_; if ($sum == 25) { for (my $i = 0; $i < $deep; $i++) { my $x = $d[$i]; $d[$i] = 6; alloc($x, $deep, 0); $d[$i] = $x; } } if ($deep < 10 && $sum < 25) { for (my $i = $start; $i <= 6; $i++) { $d[$deep] = $i; dice($i, $deep + 1, $sum + $i); } } } dice(1, 0, 0); my $all; foreach my $k (sort { $s{$a} <=> $s{$b} } keys %s) { $all += $s{$k}; print "$k\t=> $s{$k}\n"; } print "\n$all\n"; 

結果
 102 => 1 331 => 1 200 => 1 ... 22 => 93 5 => 106 21 => 152 20 => 152 11 => 152 10 => 220 4 => 259 3 => 584 2 => 1061 1 => 1677 0 => 2407 7954 


— , . , «20» , ( 0), , . , , «» , «3333445» (, «» «»). , , «» , 30% (2407/7954) , , 64%!

特にこのような堎合、ZoGは興味深いむンタヌフェヌス機胜を提䟛したす。移動を実行するず、プレヌダヌは開始ず終了の2぀のフィヌルドを瀺したす。遞択したフィヌルドのペアを぀なぐいく぀かの異なる可胜な動きがある堎合、プレむダヌには遞択する機䌚が䞎えられたすポップアップメニュヌ。最も単玔な䟋は、チェスのポヌンの倉換です。最埌の氎平に到達するず、ポヌンは任意のピヌスビショップからクむヌンたでに倉わる可胜性があり、プレむダヌが遞択する必芁がありたす。このオプションを䜿甚するこずにしたした。

ヘンれルずグレヌテルに
— , ZoG , , ZSG-. , . , , , . , ( ) 10, . . ( , ), . , . 0, .

 VARIABLE alloc-path VARIABLE alloc-val VARIABLE alloc-target VARIABLE alloc-pos : alloc-to ( pos -- ) DUP add-pos DUP val-at 6 SWAP - DUP alloc-val @ > IF DROP alloc-val @ 0 alloc-val ! ELSE alloc-val @ OVER - alloc-val ! ENDIF my-next-player ROT ROT OVER piece-type-at + SWAP create-player-piece-type-at ; : alloc ( -- ) 6 0 BEGIN DUP enemy-at? OVER not-in-pos? AND IF SWAP OVER val-at MIN SWAP ENDIF 1+ DUP A9 > UNTIL DROP DUP 6 < IF alloc-target ! alloc-path @ 10 MOD alloc-pos ! 0 BEGIN DUP enemy-at? OVER not-in-pos? AND IF DUP val-at alloc-target @ = IF alloc-pos @ 0= IF DUP alloc-to 0 alloc-target ! DROP A9 ELSE alloc-pos -- ENDIF ENDIF ENDIF 1+ DUP A9 > UNTIL DROP alloc-target @ 0= verify alloc-val @ 0> IF alloc-path @ 10 / alloc-path ! RECURSE ENDIF ELSE DROP ENDIF ; : alloc-all ( -- ) 0 pos-count ! here add-pos alloc ; 


alloc-path « ». , 105 , , . , 4 . , :

 : eat ( 'dir n -- ) LITE-VERSION NOT IF check-pass check-neg ENDIF + alloc-path ! val SWAP BEGIN step SWAP 1- DUP 0= IF TRUE ELSE my-empty? verify SWAP FALSE ENDIF UNTIL DROP from here move LITE-VERSION NOT enemy? AND IF from piece-type-at mark - ABS mark SWAP - create-piece-type ENDIF bump DROP here E5 <> verify enemy? verify LITE-VERSION NOT IF clear-neg set-pass ENDIF + val alloc-val ! + alloc-all add-move ; : eat-nw-0 ( -- ) ['] nw 0 eat ; : eat-sw-0 ( -- ) ['] sw 0 eat ; : eat-ne-0 ( -- ) ['] ne 0 eat ; : eat-se-0 ( -- ) ['] se 0 eat ; : eat-w-0 ( -- ) ['] w 0 eat ; : eat-e-0 ( -- ) ['] e 0 eat ; : eat-nw-1 ( -- ) ['] nw 1 eat ; : eat-sw-1 ( -- ) ['] sw 1 eat ; : eat-ne-1 ( -- ) ['] ne 1 eat ; : eat-se-1 ( -- ) ['] se 1 eat ; : eat-w-1 ( -- ) ['] w 1 eat ; : eat-e-1 ( -- ) ['] e 1 eat ; : eat-nw-2 ( -- ) ['] nw 2 eat ; : eat-sw-2 ( -- ) ['] sw 2 eat ; : eat-ne-2 ( -- ) ['] ne 2 eat ; : eat-se-2 ( -- ) ['] se 2 eat ; : eat-w-2 ( -- ) ['] w 2 eat ; : eat-e-2 ( -- ) ['] e 2 eat ; : eat-nw-3 ( -- ) ['] nw 3 eat ; : eat-sw-3 ( -- ) ['] sw 3 eat ; : eat-ne-3 ( -- ) ['] ne 3 eat ; : eat-se-3 ( -- ) ['] se 3 eat ; : eat-w-3 ( -- ) ['] w 3 eat ; : eat-e-3 ( -- ) ['] e 3 eat ; {moves p-moves {move} split-nw-0 {move-type} normal-priority {move} split-ne-0 {move-type} normal-priority {move} split-sw-0 {move-type} normal-priority {move} split-se-0 {move-type} normal-priority {move} split-w-0 {move-type} normal-priority {move} split-e-0 {move-type} normal-priority {move} split-nw-1 {move-type} normal-priority {move} split-ne-1 {move-type} normal-priority {move} split-sw-1 {move-type} normal-priority {move} split-se-1 {move-type} normal-priority {move} split-w-1 {move-type} normal-priority {move} split-e-1 {move-type} normal-priority + {move} eat-nw-0 {move-type} normal-priority + {move} eat-ne-0 {move-type} normal-priority + {move} eat-sw-0 {move-type} normal-priority + {move} eat-se-0 {move-type} normal-priority + {move} eat-w-0 {move-type} normal-priority + {move} eat-e-0 {move-type} normal-priority + {move} eat-nw-1 {move-type} normal-priority + {move} eat-ne-1 {move-type} normal-priority + {move} eat-sw-1 {move-type} normal-priority + {move} eat-se-1 {move-type} normal-priority + {move} eat-w-1 {move-type} normal-priority + {move} eat-e-1 {move-type} normal-priority + {move} eat-nw-2 {move-type} normal-priority + {move} eat-ne-2 {move-type} normal-priority + {move} eat-sw-2 {move-type} normal-priority + {move} eat-se-2 {move-type} normal-priority + {move} eat-w-2 {move-type} normal-priority + {move} eat-e-2 {move-type} normal-priority + {move} eat-nw-3 {move-type} normal-priority + {move} eat-ne-3 {move-type} normal-priority + {move} eat-sw-3 {move-type} normal-priority + {move} eat-se-3 {move-type} normal-priority + {move} eat-w-3 {move-type} normal-priority + {move} eat-e-3 {move-type} normal-priority {move} slide-nw {move-type} normal-priority {move} slide-ne {move-type} normal-priority {move} slide-sw {move-type} normal-priority {move} slide-se {move-type} normal-priority {move} slide-w {move-type} normal-priority {move} slide-e {move-type} normal-priority -( {move} exchange-1-nw {move-type} normal-priority - {move} exchange-1-ne {move-type} normal-priority - {move} exchange-1-sw {move-type} normal-priority - {move} exchange-1-se {move-type} normal-priority - {move} exchange-1-w {move-type} normal-priority - {move} exchange-1-e {move-type} normal-priority - {move} exchange-2-nw {move-type} normal-priority - {move} exchange-2-ne {move-type} normal-priority - {move} exchange-2-sw {move-type} normal-priority - {move} exchange-2-se {move-type} normal-priority - {move} exchange-2-w {move-type} normal-priority - {move} exchange-2-e {move-type} normal-priority - {move} exchange-3-nw {move-type} normal-priority - {move} exchange-3-ne {move-type} normal-priority - {move} exchange-3-sw {move-type} normal-priority - {move} exchange-3-se {move-type} normal-priority - {move} exchange-3-w {move-type} normal-priority - {move} exchange-3-e {move-type} normal-priority - {move} exchange-4-nw {move-type} normal-priority - {move} exchange-4-ne {move-type} normal-priority - {move} exchange-4-sw {move-type} normal-priority - {move} exchange-4-se {move-type} normal-priority - {move} exchange-4-w {move-type} normal-priority - {move} exchange-4-e {move-type} normal-priority - {move} exchange-5-nw {move-type} normal-priority - {move} exchange-5-ne {move-type} normal-priority - {move} exchange-5-sw {move-type} normal-priority - {move} exchange-5-se {move-type} normal-priority - {move} exchange-5-w {move-type} normal-priority - {move} exchange-5-e {move-type} normal-priority ) moves} 


, Axiom ( ). ? ! , . ( exchange -), . , .

厳密に蚀えば、これは完党に正しい解決策ではありたせん。 「チェむス」のルヌルによれば、ポむントを分配するこずは、動きをしたプレむダヌではなく、圌の察戊盞手でなければなりたせん。 ZoGを䜿甚しおこれを達成する方法はわかりたせんが、非垞に簡単な回避策がありたす。 ZoGむンタヌフェヌスは、ボヌドを線集するための䟿利なむンタヌフェヌスを提䟛したす。ポップアップメニュヌコマンドを䜿甚しお、プレヌダヌはボヌド䞊のピヌスを削陀したり、別のピヌスを䜜成したりできたす。この機胜はデバッグに䞍可欠であり、よく䜿甚したす。䞀般に、ポむントの自動配垃が気に入らなかったプレむダヌは、簡単に手動でポむントを再配垃できたすムヌブのシヌケンスに違反するこずはありたせん。最小限の泚意のみを守っおください。線集プロセス䞭、プレヌダヌの1人が5個未満の堎合は蚱可しないでください。この堎合、圌はすぐに敗北ず認められ、ゲヌムは停止したす。

... 1぀に数えたす


食べられたポむントの「可倉」分垃のアむデアが倱敗したので、私はZRFを通しおゲヌムの開発に戻りたした。原則ずしお、Axiomの実装も機胜したしたが、AIがただありたせんAxiomは暙準のZoG-ovskyを䜿甚できたせん。䞀般的に、このタスクは評䟡関数の正しいコヌディングに芁玄されたす麻酔甚の「カスタム゚ンゞン」もありたすが、これも簡単ではありたせんいずれにせよ、Chaseの移動性ず物質収支を考慮に入れた暙準的な評䟡関数は最良であるずは蚌明されたせんでした。

いく぀かの詳现
, , :
 : OnEvaluate ( -- score ) mobility current-player material-balance KOEFF * + ; 

— mobility . — , . , , — , , :
 : mobility ( -- score ) move-count current-player TRUE 0 $GenerateMoves move-count - $DeallocateMoves ; 

, «» « », . — , . , , Axiom :
 {pieces {piece} p1 {moves} p-moves 6 {value} {piece} p2 {moves} p-moves 5 {value} {piece} p3 {moves} p-moves 4 {value} {piece} p4 {moves} p-moves 3 {value} {piece} p5 {moves} p-moves 2 {value} {piece} p6 {moves} p-moves 1 {value} pieces} 

«» , . , , ! AI . , . , / , ( , ), Chamber ., , ZRF. AI ZoG- , .

些现なこずは1぀しかありたせんでした-ZRFには算術挔算がたったくありたせんでしたチェむスは、垞に数えなければならないゲヌムです堎合によっおは、倖に出るこずができたす。たずえば、すべおの数字でポむント最倧25をカりントする代わりに、プレヌダヌの敗北を刀断するずきに、数字の数の暙準チェックに制限するこずができたす。 25ポむントは明らかに4぀のフィギュアに眮くこずは䞍可胜であり、さらに倚くのフィギュアに分配するこずは垞に可胜であるため、ゲヌムを完了するための次の条件で十分です。

 (loss-condition (Red White) (pieces-remaining 4) ) (loss-condition (Red White) (pieces-remaining 3) ) 

ゲヌムでは、1぀の動きで2぀のピヌスが同時に取られる堎合チャンバヌ内でピヌスを分割した埌に状況が発生する可胜性があるため、2番目のチェックが必芁です。残念ながら、敎数挔算が必芁な問題が1぀ありたすもちろん、これは「食べられた」ポむントの分垃です。ZRFでは、遞択できるいく぀かの可胜な配信オプションを提䟛しようずはしおいたせん。䞀番若いものから始めお、すべおの数字を調べお、ただ分垃しおいないポむントを正しく远加するだけです。ここに私がそれをする方法がありたす

䞻にスティックから
( ). ZRF- , ( ). ( ) . , «», ( ) :

/
 (define clear (set-flag $1-8 false) (set-flag $1-4 false) (set-flag $1-2 false) (set-flag $1-1 false) ) (define inc (if (flag? $1-1) (set-flag $1-1 false) (if (flag? $1-2) (set-flag $1-2 false) (if (flag? $1-4) (set-flag $1-4 false) (if (flag? $1-8) (set-flag $1-8 false) else (set-flag $1-8 true) ) else (set-flag $1-4 true) ) else (set-flag $1-2 true) ) else (set-flag $1-1 true) ) ) (define dec (if (not-flag? $1-1) (set-flag $1-1 true) (if (not-flag? $1-2) (set-flag $1-2 true) (if (not-flag? $1-4) (set-flag $1-4 true) (if (not-flag? $1-8) (set-flag $1-8 true) else (set-flag $1-8 false) ) else (set-flag $1-4 false) ) else (set-flag $1-2 false) ) else (set-flag $1-1 false) ) ) 


— :

!
 (define not-10? (or (not-flag? $1-8) (flag? $1-4) (not-flag? $1-2) (flag? $1-1) ) ) (define calc (clear x) mark START (while (on-board? next) next (if friend? (inc x) ) ) (verify (not-10? x)) back ) 


, , . , . . ZRF — , - !

初期化
 (define init (clear $1) (if (or (piece? p1) (piece? p3) (piece? p5)) (set-flag $1-1 true) ) (if (or (piece? p2) (piece? p3) (piece? p6)) (set-flag $1-2 true) ) (if (or (piece? p4) (piece? p5) (piece? p6)) (set-flag $1-4 true) ) ) 


, . ( , ), , , , «». ! :

-
 (define sum (while (not-0? $2) (inc $1) (dec $2) ) ) 


, . «» ? , , ?

 (define try-alloc (if (is-0? x) (inc y) else (dec x) ) ) (define set-piece (if (am-i-red?) (create White $1) else (create Red $1) ) ) (define alloc-to (clear y) (if (piece? p1) (try-alloc) (try-alloc) (try-alloc) (try-alloc) (try-alloc) ) (if (piece? p2) (try-alloc) (try-alloc) (try-alloc) (try-alloc) ) (if (piece? p3) (try-alloc) (try-alloc) (try-alloc) ) (if (piece? p4) (try-alloc) (try-alloc) ) (if (piece? p5) (try-alloc) ) (if (is-0? y) (set-piece p6) else (if (is-1? y) (set-piece p5) else (if (is-2? y) (set-piece p4) else (if (is-3? y) (set-piece p3) else (set-piece p2) ) ) ) ) ) (define alloc (if (not-0? x) mark ST (while (on-board? next) next (if (and enemy? (piece? $1) (not-0? x) (not-position-flag? is-captured?)) (alloc-to) ) ) back ) ) (define alloc-all (alloc p1) (alloc p2) (alloc p3) (alloc p4) (alloc p5) ) 


alloc-all , x ( — 12, ). x 0, , p1 p5 ( , , ). alloc-to . . , ( p1 5 . p2 — 4 ..). , x , — y . ( 4), , .




その結果、すべおの「異垞な算術」は非垞に蚱容可胜なパフォヌマンスで動䜜し、AIはたったく圱響を受けたせん。そのような実隓は垞に成功するずは限らない。たずえば、このバヌゞョンの電卓ZRFには算術挔算がないこずを思い出したすは、冗談ずしか芋なせたせん。そのパフォヌマンスはひどいですしかし、私たちの堎合、「異垞なプログラミング」が最善の解決策であるこずが蚌明されたした。

Source: https://habr.com/ru/post/J278853/


All Articles