憂鬱の解剖孊

知識は力です。



フランシス・ベヌコン。



...倚くの知恵で倚くの悲しみがありたす。

そしお知識を増やせば、悲しみが増したす。



䌝道の曞。



ゲヌムは自分の人生を生きたす。 それらはどこからでも生たれ、発展し、新しいゲヌムを生み出し、誰もが忘れ、時には忘华から戻っおきたす。 この自然selectionの過皋で敗北したゲヌムの䟋はたくさんありたす。 これらは将Shoのさたざたなバリ゚ヌションであり、日本の人々の文化的遺産に察する敬verな態床のおかげでのみ生き残っおいたす。 倪極将giのようなゲヌムパヌティヌは、数幎数幎ではないにしおも匕きずられる可胜性がありたす。 しかし、 平安時代のこれらのチェス恐竜は、ボヌドゲヌムの「化石」䞖界の最も顕著な代衚ではありたせん。



本圓に玠晎らしいゲヌムに぀いお話をしたいです。 その䞭の脅嚁は明らかではなく、目暙は簡単ではありたせん。 あなたは倚くの方法で勝぀こずができたすが、プレヌは決しお簡単ではありたせん。 Checkersファミリたたはチェスファミリに起因するこずはできたせん。 その起源は霧です。 平均的な玠人にずっお、このゲヌムは魔方陣の䜜成ず同じくらい゚キサむティングです。 それはその名前の1぀を完党に正圓化したす- 哲孊者だけがそれを挔奏できたす。



「数字の戊い」たたは「哲孊者のゲヌム」ずしおも知られるリスモマキアは 、1030幎ごろにアシロずいう僧によっお蚘述されたした。 明らかに根拠のない原䜜者はプラトンに垰属し、ゲヌムのルヌルはボ゚ティりスの算術理論に基づいおいたす。 その埌、ゲヌムのルヌルは別の修道士によっおわずかに倉曎され、 ヘルマンヌスコントラクトスずいう名前で、音楜の理論に関するメモを远加したした。 長い間、リズムマシヌは孊生に数孊を教える際の教材ずしお䜿甚されおいたした。 圓時の知識人たちはRhythmachiaを楜しみながらプレむしおいたしたか぀おはChessよりも人気が高かった、 Robert Burton はMelancholyの解剖孊でそれを蚀及し、 Thomas Moreはこのゲヌムを圌のナヌトピアの䜏民にずっお良いレゞャヌだず考えたした。 その埌、突然、それはすべお終わった。 数孊ずRhythmachiaの興味は分かれ、ゲヌムは忘れられたした。 もちろん、これは圌女を思い出せないずいう意味ではありたせん。



ゲヌムのルヌル



8x16セルの長方圢のボヌド䞊の2人のプレヌダヌがRhythm Machiaをプレむしたす。 移動は順番に行われたす。 各動きは1぀のピヌスを移動したす。 移動の結果ずしお、察戊盞手の1぀たたは耇数のピヌスを取埗できたすボヌドから削陀されたす。 次の皮類の圢状が定矩されおいたす。









図の数倀マヌクを無芖するず以䞋でそれらに぀いお説明したす、2皮類の動きが蚱可されおいるこずがわかりたす。 最初のケヌスでは、フィギュアは盎線的に移動し、邪魔になっおいる他のフィギュアそれ自䜓たたは敵のものによっお停止できたす。 したがっお、円斜めに1぀のセル、䞉角圢盎亀に沿っお厳密に2぀のセル、および正方圢盎亀に沿っお厳密に3぀のセルが移動したす。 もう1぀の可胜性は、チェスの階士の動きず同様に、駒を察象の広堎に「ゞャンプ」するこずです。 したがっお、䞉角圢たたは正方圢は歩くこずができたす。 移動は、空のセルでのみ実行する必芁がありたす。



ナニヌクな人物はピラミッドです。 実際、これは数字ではなく、数字のセットです。 セットの各ピヌス円、䞉角圢、たたは正方圢により、ピラミッドは察応するタむプの動きを実行できたす。 䞊の図は、「最倧構成」でのピラミッドの可胜な動きを瀺しおいたす。 ご想像のずおり、ゲヌムの終わりたでに、「完党性」が倧幅に䟵害される可胜性がありたすずころで、Rhythmachiaのピラミッドは、「郚分的に殺す」こずができる唯䞀の数字です。



「殺す」方法に぀いお説明したす。 Rhythmachiaには、次の4぀がありたす。









最も急進的なのは、フィギュアの包囲です。 次の移動埌にすべおの察角線たたは盎亀方向でブロックされるず、図は削陀されたす。 フィギュアがボヌドの端たたは角にある堎合、ブロックする必芁がある方向は少なくなりたす。 これは、ピラミッド党䜓を䞀床に取埗するための最も簡単なしかし唯䞀ではない方法です。 包囲は、数字の数倀を䜿甚しない唯䞀の方法です。



別の方法は、数倀が䞀臎する図を取るこずです。 移動が完了した埌、ピヌスが次の動きを移動できるフィヌルドにもちろん、このフィヌルドが空だった堎合盞手のピヌスが同じ数倀で配眮されおいる堎合、それが取埗されたす。 この戊闘方法は非察称かもしれないこずに泚意しおください。 䞊の図、癜の動きの埌、数倀16の円は同じ倀の黒の䞉角圢をずるこずができたすが、䞉角圢は他のセルに移動するため、単独では動きたせん。 同時に、25の数倀を持぀癜ず黒の䞉角圢が互いに察称的にビヌトしたすどの数字が発射されるかは、移動の順序によっお決たりたす。



前の改良版は、次の方法です。 今回、「埅ち䌏せ」から、2人の人物が攻撃しおいたす。 それらの数倀の合蚈、差、積たたは商が盞手のフィギュアの数倀ず䞀臎する堎合、そのフィギュアは削陀されたす。 これは、ゲヌムでフィギュアず戊う最も䞀般的に䜿甚される機䌚ですが、倚かれ少なかれ耇雑な䜍眮でそのような脅嚁をすべお芋るのは簡単ではありたせん。



埌者の方法では、遠距離でフィギュアを倒すこずができたす。 補品の結果たたはフィギュアの個人的な数倀ず盞手のフィギュアたでの距離盎亀が察戊盞手のフィギュアの数倀ず䞀臎する堎合、フィギュアは削陀されたす。 戊闘の方向にある他の人物は脅嚁を劚げたせん。 距離を蚈算するずき、開始䜍眮ず終了䜍眮が考慮されたす。 これは、察称的な戊闘方法ですフィギュアの移動ルヌルに䟝存しないため。 移動の順序によっお、どの数字が撮圱されるかが決たりたす。



これらのルヌルがピラミッドにどのように適甚されるかに぀いおはただ話がありたせん。 これにより、すべおが簡単です-数字を取るための蚈算では、ピラミッドは独立した数字その数倀はすべおのコンポヌネントの数倀の合蚈ず䞀臎したすずしお、たたはその䞀郚ずしお機胜できたす。 同様に、ピラミッドは、党䜓ずしおその合蚈倀で、たたは郚分的にその各コンポヌネントは個別に脆匱です取埗するこずができたす。 䞊で述べたピラミッドの移動芏則を考えるず、ピラミッドは最も匷力なそしお最も脆匱な数字になりたす。







数字の初期配眮は、ゲヌムの別の重芁な機胜に関連付けられおいたす。 図のセットは同じですが、数倀は異なりたす。 たた、ピラミッドの「完党なセット」は異なりたすプレヌダヌのそれぞれに぀いお、ボヌドの偎面に衚瀺されたす。 これにより、ゲヌムが非察称になりたす。 黒のプレむダヌの戊術ず戊略は、癜のプレむダヌには適しおいたせん逆の堎合も同様です。 これにより、ゲヌムがより面癜くなりたす。



栄光の勝利



䞊蚘のルヌルはリズムマシヌのプレむを開始するのに十分ですが、ゲヌムの目的が単に盞手のすべおのピヌスをキャプチャするこずである堎合、ゲヌムはそれほど面癜くないでしょう。 はい、この方法で勝぀こずができたすが、これが勝぀唯䞀のそしお最高ではない方法ではありたせん 私はゲヌムが本圓に奜きです。その目的は敵のフィギュアを簡単に「殺す」こずではありたせん。 チェスでは、勝぀ために、すべおのピヌスを「食べる」必芁はたったくなく、キングをチェックメむトすれば十分です 波䜐芋将giの䞀郚のバヌゞョンでは、ゲヌムの目暙はさらに予想倖です勝぀ためには、5぀のチップを「連続しお」䞊べる必芁がありたす。 リズムマシヌもこの点で倱望したせん。 以䞋は、このゲヌムに勝぀方法のリストです「名声」の昇順。





ここでは、ゲヌムの基本的に異なる2぀のタむプの目暙を区別できたす。 䞀般的な勝利は、敵のフィギュアの捕獲に関連付けられおいたす攻撃的なプレむから保護するために、捕獲されたフィギュアの数に制限がありたす。 適切な勝利は、より䟡倀のある結論ず芋なされ、敵の領土での特定の「調和」の回埩に関連付けられたす敵のフィギュアの戊いの可胜性を排陀したせん。







䞊蚘の䟋は、敵のフィギュアが関䞎する可胜性があるこずを瀺しおいたす。 最初のケヌスでは、算術玚数が䜜成されたす16、36、56。 2番目の䟋では、幟䜕孊的な進行4、12、36ず調和的な進行4、6、12を組み合わせおいたす。 3番目のケヌスでは、3぀のタむプの進行がすべお存圚したす自分で芋぀けるこずができたす。 蚀語のカりントに問題がある堎合、Rhythmachyで考えられるすべおの解決策の衚が䜜成されおいたすただし、Rhythmachyは蚀語のカりントに問題がある人には興味がないようです。



可胜なオプション



Rhythmachyは党盛期にすでに倚くの倉曎を受けおいたす。 その埌の改修は状況を改善したせんでした。 このゲヌムのルヌルの説明には倚くの違いがありたす。 䞀郚の゜ヌスでは、ピヌスの初期配眮の代替オプションを提䟛しおいたす8 x 14ボヌドでゲヌムを説明するオプションに出くわしたした。







図圢を移動するための単玔化されたルヌルを持぀オプションがありたす。 これらの芏則に埓っお、図圢は、指定されたセル数だけ盎線盎亀および察角で移動したす。 動きの邪魔をするどんな図圢も動きを止めたす。 チェスの階士の動きのようなゞャンプはありたせん。 ピラミッドは、い぀ものように、そのセットに存圚する人物の動きを組み合わせたす。







さらに、図圢の移動に関する通垞のルヌルを䜿甚するオプションがあり、特別なピラミッドの移動が3぀のセルに斜めに远加されたす。 このような移動は、ピラミッドに元々含たれおいた数字の1぀が撮圱されない限り可胜です。 別のオプションは、ピラミッドの最初の数字セットの安党性ず関連しおいたす。 ピラミッドの合蚈倀を䜿甚できるのは、その数字がただ「食べられおいない」ずいう条件がある堎合のみです。 いずれかのコンポヌネントが攻撃された堎合、ピラミッドが完党に削陀されるより単玔なオプションがありたす。



いく぀かのオプションは、数字を取るためのルヌルの倉曎に関連しおいたす。 そのため、オプションの1぀で、「 by Siege 」の図siegeを取埗するには、その「自然な」動きのすべおの方向をブロックする必芁がありたす。 同時に、ブロックされおいるピヌスの近くにピヌスを配眮する必芁はありたせん以䞋の䟋は抂念を瀺しおいたす。 これは非垞に興味深いルヌルです。







「 埅ち䌏せ 」埅ち䌏せ によるキャプチャを「クランプ」タむプのゲヌムのように実行するオプションがありたす䞀方、数字を移動するためのルヌルは無芖されたす。







「 栄光の勝利 」の定矩には倚くの矛盟がありたす。 倚くの堎合、そのような勝利の条件では、敵のピラミッドの予備砎壊が含たれたす。 たた、ゲヌムを終了するための条件があり、ピラミッドの取埗に限定されたす。 このゲヌムには倚くのオプションがありたす。 いずれにしおも、ゲヌムの開始前に、ルヌルのニュアンスに粟通するこずは堎違いではありたせん。



奜奇心の匷い人のための詳现



ゲヌムの実装は、圓然いく぀かの段階に分かれおいたす。 最も簡単な方法は、動く圢状を実装するこずでした。 これが私が始めた堎所です。 Squaresの動きは次のようになりたす。



移動する正方圢
: leap-n ( 'leap-dir 'shift-dir count ? -- ) IF BEGIN OVER EXECUTE IF on-board? IF 1- DUP 0> IF FALSE ELSE 2DROP TRUE TRUE ENDIF ELSE 2DROP FALSE TRUE ENDIF ELSE 2DROP FALSE TRUE ENDIF UNTIL IF EXECUTE IF on-board? empty? AND IF from here DUP last-position ! move capture-all add-move ENDIF ENDIF ELSE DROP ENDIF ELSE 2DROP DROP ENDIF ; : shift-n ( 'shift-dir count ? -- ) IF BEGIN OVER EXECUTE IF on-board? empty? AND IF 1- DUP 0> IF FALSE ELSE 2DROP TRUE TRUE ENDIF ELSE 2DROP FALSE TRUE ENDIF ELSE 2DROP FALSE TRUE ENDIF UNTIL IF from here DUP last-position ! move capture-all add-move ENDIF ELSE 2DROP ENDIF ; : s-move-n ( -- ) ['] North 3 TRUE shift-n ; : s-move-s ( -- ) ['] South 3 TRUE shift-n ; : s-move-w ( -- ) ['] West 3 TRUE shift-n ; : s-move-e ( -- ) ['] East 3 TRUE shift-n ; : s-move-nw ( -- ) ['] Northwest ['] North 2 TRUE leap-n ; : s-move-ne ( -- ) ['] Northeast ['] North 2 TRUE leap-n ; : s-move-sw ( -- ) ['] Southwest ['] South 2 TRUE leap-n ; : s-move-se ( -- ) ['] Southeast ['] South 2 TRUE leap-n ; : s-move-wn ( -- ) ['] Northwest ['] West 2 TRUE leap-n ; : s-move-ws ( -- ) ['] Southwest ['] West 2 TRUE leap-n ; : s-move-en ( -- ) ['] Northeast ['] East 2 TRUE leap-n ; : s-move-es ( -- ) ['] Southeast ['] East 2 TRUE leap-n ; {moves s-moves {move} s-move-n {move} s-move-s {move} s-move-w {move} s-move-e {move} s-move-nw {move} s-move-ne {move} s-move-sw {move} s-move-se {move} s-move-wn {move} s-move-ws {move} s-move-en {move} s-move-es moves}
      
      







ピラミッドの動䜜は、珟圚どのピヌスが含たれおいるかによっお決定されるため、ピラミッドでは倚少の困難が生じたした。 私は圌らにすべおの可胜な動きを説明しなければなりたせんでした、そしお動きをするずき、セット内の察応する数字の存圚を確認しおください



移動ピラミッド
 : is-correct-type? ( piece-type -- ? ) not-empty? IF piece-type PYRAMID > IF here SWAP a1 to BEGIN friend-p IF DUP is-piece-type? IF DROP TRUE TRUE ELSE FALSE ENDIF ELSE DROP FALSE TRUE ENDIF UNTIL SWAP to ELSE DROP FALSE ENDIF ELSE DROP FALSE ENDIF ; : pr-move-ne ( -- ) ['] Northeast ROUND is-correct-type? leap-0 ; : pr-move-se ( -- ) ['] Southeast ROUND is-correct-type? leap-0 ; : pr-move-nw ( -- ) ['] Northwest ROUND is-correct-type? leap-0 ; : pr-move-sw ( -- ) ['] Southwest ROUND is-correct-type? leap-0 ; {moves p-moves {move} pr-move-ne {move} pr-move-se {move} pr-move-nw {move} pr-move-sw ... moves}
      
      







数字の戊いの実行は、本圓の「生存競争」に倉わりたした。 4぀の完党に異なる非垞に重芁なキャプチャメ゜ッドを実装する必芁がありたした。 同時に、蚈算​​のオヌバヌヘッドを最小限に抑えるために、フィヌルドビュヌの数を制限したいず考えおいたした移動は既に䞍圓に長く蚈算されおいたす。 その結果、私はいく぀かのアレむを事前に埋めるずいうアむデアに決着したした。フィギュアの戊いの条件を次のようにチェックしたした。



バトル方法
 MAXV [] attacking-values[] MAXS [] current-positions[] MAXS [] current-values[] MAXS [] eruption-values[] : fill-current ( pos -- ) 1 current-count ! DUP 0 current-positions[] ! DUP piece-type-at PYRAMID > IF a1 to 0 BEGIN enemy-p IF not-empty? IF piece piece-value current-count @ MAXS < IF here current-count @ current-positions[] ! DUP current-count @ current-values[] ! current-count ++ ENDIF + ENDIF FALSE ELSE TRUE ENDIF UNTIL ELSE DUP piece-at piece-value ENDIF 0 current-values[] ! to ; : get-eruption-values ( n -- ) 0 sum-value ! PYRAMID is-piece-type? IF here a1 to BEGIN friend-p IF not-empty? eruption-count @ MAXE < AND IF OVER piece piece-value DUP sum-value @ + sum-value ! * eruption-count @ eruption-values[] ! eruption-count ++ ENDIF FALSE ELSE TRUE ENDIF UNTIL to sum-value @ ELSE piece piece-value ENDIF eruption-count @ MAXE < IF * eruption-count @ eruption-values[] ! eruption-count ++ ELSE 2DROP ENDIF ; : get-attacking-values ( piece-type -- ) 0 sum-value ! FALSE sum-flag ! PYRAMID is-piece-type? IF here a1 to BEGIN friend-p IF not-empty? attacking-count @ MAXV < AND IF piece piece-value sum-value @ + sum-value ! OVER is-piece-type? IF TRUE sum-flag ! piece piece-value attacking-count @ attacking-values[] ! attacking-count ++ ELSE ENDIF ENDIF FALSE ELSE TRUE ENDIF UNTIL to DROP sum-flag @ attacking-count @ MAXV < AND IF sum-value @ attacking-count @ attacking-values[] ! attacking-count ++ ENDIF ELSE is-piece-type? attacking-count @ MAXV < AND IF piece piece-value attacking-count @ attacking-values[] ! attacking-count ++ ENDIF ENDIF ; : check-siege-od ( 'dir -- ) EXECUTE IF predict-move on-board? NOT friend? OR IF siege-counter -- ENDIF on-board? friend? AND IF 2 get-eruption-values ENDIF to ELSE siege-counter -- ENDIF ; : check-siege-dd ( 'dir -- ) EXECUTE IF predict-move on-board? NOT friend? OR IF siege-counter -- ENDIF on-board? friend? AND IF ROUND get-attacking-values ROUND check-equality-piece ENDIF to ELSE siege-counter -- ENDIF ; : check-siege ( pos -- ) 4 siege-counter ! DUP to ['] North check-siege-od DUP to ['] South check-siege-od DUP to ['] West check-siege-od DUP to ['] East check-siege-od siege-counter @ 0= IF TRUE is-captured? ! ENDIF 4 siege-counter ! DUP to ['] Northeast check-siege-dd DUP to ['] Southeast check-siege-dd DUP to ['] Northwest check-siege-dd DUP to ['] Southwest check-siege-dd siege-counter @ 0= IF TRUE is-captured? ! ENDIF to ; : check-equality-dd ( 'second-dir count 'first-dir -- ) EXECUTE on-board? AND IF BEGIN 1- DUP 0< IF TRUE ELSE OVER EXECUTE on-board? AND IF predict-move friend? IF OVER count-to-piece-type DUP get-attacking-values check-equality-piece ENDIF to FALSE ELSE TRUE ENDIF ENDIF UNTIL 2DROP ELSE 2DROP ENDIF ; : check-equality-od ( 'second-dir count 'first-dir -- ) EXECUTE on-board? AND empty? AND IF BEGIN 1- DUP 0< IF TRUE ELSE OVER EXECUTE on-board? AND IF predict-move friend? IF OVER count-to-factor get-eruption-values OVER count-to-piece-type DUP get-attacking-values check-equality-piece TRUE ELSE not-empty? ENDIF SWAP to ELSE TRUE ENDIF ENDIF UNTIL 2DROP ELSE 2DROP ENDIF ; : check-equality ( pos -- ) DUP to ['] North 2 ['] North check-equality-od DUP to ['] North 2 ['] Northwest check-equality-dd DUP to ['] North 2 ['] Northeast check-equality-dd DUP to ['] South 2 ['] South check-equality-od DUP to ['] South 2 ['] Southwest check-equality-dd DUP to ['] South 2 ['] Southeast check-equality-dd DUP to ['] West 2 ['] West check-equality-od DUP to ['] West 2 ['] Northwest check-equality-dd DUP to ['] West 2 ['] Southwest check-equality-dd DUP to ['] East 2 ['] East check-equality-od DUP to ['] East 2 ['] Northeast check-equality-dd DUP to ['] East 2 ['] Southeast check-equality-dd to ; : check-ambush-prod ( value -- ? ) value-1 @ value-2 @ * OVER = IF DROP TRUE ELSE DUP value-1 @ * value-2 @ = IF DROP TRUE ELSE value-2 @ * value-1 @ = IF TRUE ELSE FALSE ENDIF ENDIF ENDIF ; : check-ambush-cond ( value -- ? ) value-1 @ value-2 @ + OVER = IF DROP TRUE ELSE DUP value-1 @ + value-2 @ = IF DROP TRUE ELSE DUP value-2 @ + value-1 @ = IF DROP TRUE ELSE check-ambush-prod ENDIF ENDIF ENDIF ; : check-ambush-pair ( -- ) current-count @ BEGIN 1- DUP current-positions[] @ 0< NOT IF DUP current-values[] @ check-ambush-cond IF DUP 0> IF DUP current-positions[] @ DUP enemy-at? IF DUP ChangePieces capture-at ELSE DROP ENDIF -1 OVER current-positions[] ! ELSE TRUE is-captured? ! ENDIF ENDIF ENDIF DUP 0> NOT UNTIL DROP ; : check-ambush ( -- ) attacking-count @ BEGIN 1- attacking-count @ BEGIN 1- 2DUP < IF 2DUP attacking-values[] @ value-1 ! attacking-values[] @ value-2 ! check-ambush-pair ENDIF DUP 0> NOT UNTIL DROP DUP 0> NOT UNTIL DROP ; : fill-eruption-values ( 'dir pos n -- ) value-1 ! to 1 BEGIN 1+ OVER EXECUTE IF predict-move OVER value-1 @ > on-board? friend? AND AND IF OVER get-eruption-values ENDIF to FALSE ELSE TRUE ENDIF UNTIL 2DROP ; : check-eruption-pair ( -- ) current-count @ BEGIN 1- DUP current-positions[] @ 0< NOT IF DUP current-values[] @ value-1 @ = IF DUP 0> IF DUP current-positions[] @ DUP enemy-at? IF DUP ChangePieces capture-at ELSE DROP ENDIF -1 OVER current-positions[] ! ELSE TRUE is-captured? ! ENDIF ENDIF ENDIF DUP 0> NOT UNTIL DROP ; : check-eruption-values ( -- ) eruption-count @ BEGIN 1- DUP eruption-values[] @ value-1 ! check-eruption-pair DUP 0> NOT UNTIL DROP ; : check-eruption ( pos -- ) ['] North OVER 4 fill-eruption-values ['] South OVER 4 fill-eruption-values ['] West OVER 4 fill-eruption-values ['] East OVER 4 fill-eruption-values to check-eruption-values ; : capture-all ( -- ) here ROWS COLS * BEGIN 1- DUP on-board-at? OVER enemy-at? AND IF 0 attacking-count ! 0 eruption-count ! FALSE is-captured? ! DUP fill-current DUP check-siege is-captured? @ NOT IF DUP check-equality ENDIF is-captured? @ NOT IF check-ambush ENDIF is-captured? @ NOT IF DUP check-eruption ENDIF is-captured? @ IF capture-piece ENDIF ENDIF DUP 0> NOT UNTIL DROP to ;
      
      







ピラミッドでの人物の捕獲ず移動は、特別な方法で凊理する必芁がありたした。



数字を撮る
 : capture-piece ( -- ) current-count @ BEGIN 1- DUP 0> IF DUP current-positions[] @ DUP 0< NOT IF DUP enemy-at? IF DUP ChangePieces capture-at ELSE DROP ENDIF ELSE DROP ENDIF FALSE ELSE DUP current-positions[] @ DUP enemy-at? IF DUP ChangePieces capture-at ELSE DROP ENDIF TRUE ENDIF UNTIL DROP ;
      
      







すでにデバッグのプロセスで、すべおのチェックが移動前の時点で実行されるこずに気付きたした。 ピヌスの動きをシミュレヌトする小さな関数を䜜成する必芁がありたしたこれはボヌド䞊の䜍眮の完党な再蚈算ではありたせんが、少しの血でなんずか察凊できたした。



䜍眮倉曎
 : predict-move ( -- pos ) here DUP from = IF last-position @ to ELSE DUP last-position @ = IF from to ENDIF ENDIF ;
      
      







これらすべおの恐怖の䞭で、ゲヌムを終了するための条件を確認するこずは簡単な䜜業のように思えたした。 公理には魔法がありたしたが、䞡芪に芋せるこずを恐れるようなこずは䜕もありたせん。



完了チェック
 15 CONSTANT WINC 1315 CONSTANT WINW 984 CONSTANT WINB : WhitePieces++ ( -- ) WhitePieces ++ ; : BlackPieces++ ( -- ) BlackPieces ++ ; : WhiteValues++ ( -- ) WhiteValues ++ ; : BlackValues++ ( -- ) BlackValues ++ ; : ChangePieces ( pos -- ) DUP piece-at piece-value SWAP player-at White = IF COMPILE WhitePieces++ BEGIN 1- COMPILE WhiteValues++ DUP 0> NOT UNTIL DROP ELSE COMPILE BlackPieces++ BEGIN 1- COMPILE BlackValues++ DUP 0> NOT UNTIL DROP ENDIF ; : OnIsGameOver ( -- gameResult ) #UnknownScore current-player White = IF WhitePieces @ WINC >= IF DROP #LossScore ENDIF WhiteValues @ WINW >= IF DROP #LossScore ENDIF ENDIF current-player Black = IF BlackPieces @ WINC >= IF DROP #LossScore ENDIF BlackValues @ WINB >= IF DROP #LossScore ENDIF ENDIF ;
      
      







この瞬間から、プログラムは既に再生できたしたただし、それはかなり受動的に実行されたした。 実際、評䟡関数およびAIのカスタム実装がない堎合、Axiomは完党な網矅的怜玢を最終䜍眮たで実行しようずしたす。 ゲヌムの終わりが怜玢の可胜な深さの地平線をはるかに超えおいるこずは明らかであり、その結果、芋぀かった動きは特定の意味で異ならない。 䞀般に、AIの歯を远加するこずは残りたす。



評䟡機胜
 : OnEvaluate ( -- score ) current-player material-balance ;
      
      







ここでは、非垞に䟿利なマテリアルバランス関数Axiomが提䟛を䜿甚したした。これは、数倀に䞎えられた重み倀を䜿甚したすRhythmachiaのルヌルを実装するために同じ倀が䜿甚されたした。



図の説明
 {pieces {piece} R0 {moves} r-moves 0 {value} {piece} R1 {moves} r-moves 1 {value} {piece} R2 {moves} r-moves 2 {value} {piece} R3 {moves} r-moves 3 {value} {piece} R4 {moves} r-moves 4 {value} {piece} R5 {moves} r-moves 5 {value} {piece} R6 {moves} r-moves 6 {value} {piece} R7 {moves} r-moves 7 {value} {piece} R8 {moves} r-moves 8 {value} {piece} R9 {moves} r-moves 9 {value} {piece} R16 {moves} r-moves 16 {value} {piece} R25 {moves} r-moves 25 {value} {piece} R36 {moves} r-moves 36 {value} {piece} R49 {moves} r-moves 49 {value} {piece} R64 {moves} r-moves 64 {value} {piece} R81 {moves} r-moves 81 {value} {piece} T0 {moves} t-moves 0 {value} {piece} T6 {moves} t-moves 6 {value} {piece} T9 {moves} t-moves 9 {value} {piece} T12 {moves} t-moves 12 {value} {piece} T16 {moves} t-moves 16 {value} {piece} T20 {moves} t-moves 20 {value} {piece} T25 {moves} t-moves 25 {value} {piece} T30 {moves} t-moves 30 {value} {piece} T36 {moves} t-moves 36 {value} {piece} T42 {moves} t-moves 42 {value} {piece} T49 {moves} t-moves 49 {value} {piece} T56 {moves} t-moves 56 {value} {piece} T64 {moves} t-moves 64 {value} {piece} T72 {moves} t-moves 72 {value} {piece} T81 {moves} t-moves 81 {value} {piece} T90 {moves} t-moves 90 {value} {piece} T100 {moves} t-moves 100 {value} {piece} S0 {moves} s-moves 0 {value} {piece} S15 {moves} s-moves 15 {value} {piece} S25 {moves} s-moves 25 {value} {piece} S28 {moves} s-moves 28 {value} {piece} S36 {moves} s-moves 36 {value} {piece} S45 {moves} s-moves 45 {value} {piece} S49 {moves} s-moves 49 {value} {piece} S64 {moves} s-moves 64 {value} {piece} S66 {moves} s-moves 66 {value} {piece} S81 {moves} s-moves 81 {value} {piece} S120 {moves} s-moves 120 {value} {piece} S121 {moves} s-moves 121 {value} {piece} S153 {moves} s-moves 153 {value} {piece} S169 {moves} s-moves 169 {value} {piece} S225 {moves} s-moves 225 {value} {piece} S289 {moves} s-moves 289 {value} {piece} S361 {moves} s-moves 361 {value} {piece} P0 {moves} p-moves 0 {value} {piece} P91 {moves} p-moves 91 {value} {piece} P190 {moves} p-moves 190 {value} pieces}
      
      







この実装には倚くの機胜が欠けおいたすたずえば、 Glorious Victoriesによるゲヌムの完了の確認。 将来、䞍足しおいる機胜を远加しようずしたす。 ゜ヌスコヌドの珟圚のバヌゞョンは垞にここにありたす 。



結果は䜕ですか



Rhythmachyは、たずその耇雑さに興味を持ちたした。 もちろん、それをZRFに実装する考えはありたせんでした 。 このためにAxiomをマスタヌしなければなりたせんでした 珟圚、 Glorious Victoriesをサポヌトしない単玔化された実装がありたす。 たた、コヌド内のすべおの゚ラヌを発芋したずいう確固たる信念はありたせんForthScriptの1000行-これは深刻です。 これはベヌタ版ですが、党䜓的に動䜜したす







ゲヌムが非垞に早く終了するこずに気付くかもしれたせん。 本圓にそうです。 Common Victoriesの条件に埓っお䞡方のプレむダヌがアグレッシブにプレむする堎合および撮圱するピヌスの数を制限するこずなく、ゲヌムの平均期間は〜10ムヌブです。 同時に、最初のプレヌダヌには深刻な利点がありたす。



 Cumulative results following game 13 of 100: Player 1 "Eval", wins = 13. Player 2 "Eval", wins = 0. Draws = 0
      
      





プレむダヌの1人だけが攻撃的である堎合、ゲヌムは300以䞊の動きに匕きずり蟌たれるこずは面癜いです攻撃的なプレむダヌがほずんど垞に勝ちたす。



 Cumulative results following game 22 of 100: Player 1 "Rithmomachy", wins = 1. Player 2 "Eval", wins = 21. Draws = 0
      
      





コンピュヌタヌを持っおいる人が遊ぶのは難しいです。 戊闘䞭のフィギュアのハむラむトがあっおも、どの特定の駒を動かすために行うべきかを把握するのは難しい堎合がありたすただし、自分のフィギュアを代甚しないこずをお勧めしたす。 今日、このゲヌムは人気があるずは思われたせんが、それを取り去るこずはできたせん。 圌女は口頭でのカりントスキルの開発に優れおいたす。




All Articles