Dagaz:常識へのキック(パート6)

画像 ...私のダブルはイヒの家で待っています、彼に会い、チップを上げます[彼]

ビューティフルハウスで彼に会います。

私は3つのチップをピックアップし、2つのチップを見つけました。

...



ラムセス3世の時代のパピルス



これまで、私はそれぞれのフィギュアが「単独で」動作するゲームを検討してきました。 このようなゲームでのフィギュアの相互作用は、敵のフィギュアを「食べる」ことになります。 しかし、すべてのゲームがそのようなわけではありません。 ある人物が別の人物を「強化」または「弱体化」させ、その特性を変更できるゲームは数多くあります。 今日、これについてお話したいと思います。



5.団結して、力



シェイプのプロパティが相対的な位置に依存するという考えは新しいものではありません。 どうやら、この原則は紀元前3500年から知られている古代エジプトのゲームセネットで使用されていたようです。 今日、このゲームの正確なルールを誰も知らないが、エジプト学者によって発見された材料の分析に基づいたいくつかの再構成がある。



1978年に公開されたティモシーケンドールのバージョンによると、セネトの人物の戦いは特別な方法で行われました。 beatられた駒はボードから取り除かれませんでしたが、移動を完了した駒と場所を変えました。 この考えは、 イバウの数字の名前-「ダンサー」とよく一致しています(他のほとんどのゲームとは異なり、 セネは戦いではなくダンスの比phorを使用しました)。 セネットのゲームは、死後の試練を通過する魂の「訓練」と見なされていました(古代エジプト人はこの問題を非常に真剣に受け止めていました)。



ケンドールのルールの重要なポイントは、数字を互いに「保護」する能力です。 「ペア」の一部であるチップを「ビート」することは禁じられています-隣接するボードフィールドにいる1人のプレイヤーに属する2つのチップ。 残念ながら、Kendallの再構築では、いくつかの重要なポイントが指定されていません。 「カップル」を飛び越えることは可能ですか? チップの「トリプル」と「4」を分割することは可能ですか? これらの質問は未回答のままです。 「ハウス」(特別なボード分野)でチップを移動するためのルールもあまり成功していません。 その結果、ゲームはかなり退屈です:







ケンドールのルールにはいくつかの「改善点」がありますが、その中 ドミトリースキリュックの バージョンを強調したいと思います。 このバージョンのルールでは、「ペア」が他のチップのプロモーションを妨げます。 それらを飛び越えることはできません! 「ペア」を壊すことも不可能ですが、3つ以上のチップが連続している場合、これはもはや「ペア」ではありません。 隣接するチップが2つあるチップは「beat打」される可能性があります(「3つ」なので、途中で簡単に「壊れる」)。 単純なルール変更により、Senet Kendallは非常にダイナミックでエキサイティングなゲームになります。 「 ウルの街からのゲーム 」の場合のように、ドミトリーは彼の提案したルールのバージョンを実際にチェックするという素晴らしい仕事をしました。



Cijaは、ピースが一緒に作用する別のエジプトのゲームです。 今日まで生き残ったこの古代のゲームでは、敵の姿は両側で「挟み込み」に「つまむ」ことによって捕らえられます。 Khnefataflなどの他の「引き締め」ゲームもこのゲームから来た可能性があります。







「挟み込み」の方法では、一度に複数の敵のフィギュア(異なる方向で最大3フィギュア)を撮影できますが、これが「生産性の向上」の唯一の可能性ではありません。 チベットのゲーム「 Min Mang 」では、数人の敵のフィギュアを一度に連続して持ち、両側のフィギュアを「閉じ」ます。 「 リバーシ 」でどのように起こるかと同様に、数字は「色を変える」。







波佐見将gi 」のいくつかの地域的なバリエーションはさらに先に進みます。 次のビデオは、ボードの隅にある「コンパクトな」ピースのグループを撮影する方法を示しています。 正直に言うと、これらのルールを形式化することはまだ難しいと思います。 たとえば、説明から、ボードの端にあるピースの取り方が明確ではありません。







フィギュアの「連結性」という考え方は、もう1つの古代のゲームであるGuoで最高の発展を遂げています。 このゲームは、石の「グループ」の概念に基づいています。 ボード上の隣接するポイント(垂直または水平)にある石は、単一のグループを形成します。 グループは、ボードの空いているポイント( dame )に隣接している必要があります。そうでない場合、グループは「死んで」、ボードから完全に削除されます。 驚くべきことに、このような単純なルールは、信じられないほど多様な戦術的な組み合わせにつながります。







「接続性」の概念を使用するゲームは囲Goだけではありません。 たとえば、 Ordoゲームでは、プレーヤーには2つの目標があります。ボードの反対側への突破口と、ピースの「順序」を維持することです。 Goとは異なり、図形は、直交方向だけでなく斜め方向にも接続されていると見なされます。 数字の単一グループを「引き裂く」動きは許可されていません。 敵の攻撃の結果としてグループが破壊された場合、次の動きでその整合性を回復する必要があります(そうでない場合、プレーヤーは損失を計上されます)。 このゲームのビデオ版で、斜めに接続されたフィギュアのグループの移動を許可します:







もちろん、これはボードゲームの発明者の燃えるような幻想が導くことができる場所の制限ではありません。 図をリンクすると、隣接するセルに限定する必要はありません。 Guy Debordの「戦争」ゲーム「 Kriegspiel 」では、アーセナルと送信機からの直線が供給ラインを象徴しています。 そのような線との接触を(直接または近くの人物を介して)失うと、人物は「凍結」し、接触が回復するまで動きの可能性を失います。 誰にもわからないが、スタークラフトのプロトスの「エネルギーネットワーク」の多くを思い出させる。











Guoの規則の定式化の単純さは欺cept的です。 ZRF言語での正しい実装は、あいまいなほど冗長です。 例として、「 Stoical Go 」の実装の一部を示します。



たくさんの奇妙なコード
(define adjacent-to (or (position-flag? $1 n) (position-flag? $1 s) (position-flag? $1 e) (position-flag? $1 w) ) ) (define set-danger-flag (if (and (enemy? $1) (not-neutral? $1) (not-position-flag? safe $1)) (set-position-flag danger true $1) (set-flag Changed true) ) ) (define stone (name Stone) (image Black "images\Stoical Go\pieces\b$1.bmp" White "images\Stoical Go\pieces\w$1.bmp" ) (attribute makes-capture false) (drops ( (verify empty?) (verify (not-position? end)) (set-flag Capturing false) ; if next to enemy (if (or (and (enemy? n) (not-neutral? n) ) (and (enemy? s) (not-neutral? s) ) (and (enemy? e) (not-neutral? e) ) (and (enemy? w) (not-neutral? w) ) ) mark ; *** Initialize safe ; for each point ; if enemy ; if next to empty ; P[safe] = true a1 (while (not-position? end) (set-position-flag safe empty?) next ) back (set-position-flag safe false) a1 (while (not-position? end) (if (and enemy? not-neutral? (adjacent-to safe) ) (set-position-flag safe true) ) next ) ; *** Initialize danger ; for each adjacent ; if enemy ; P[danger] = true back (set-flag Changed false) (set-danger-flag n) (set-danger-flag s) (set-danger-flag e) (set-danger-flag w) (if (flag? Changed) ; *** Spread danger, safe ; Changed = true ; while Changed ; Changed = false ; for each point ; if enemy ; if !P[safe] ; if any adjacent is enemy with P[safe] ; P[safe] = true ; if !P[safe] and !P[danger] ; if any adjacent is enemy with P[danger] ; P[danger] = true ; Changed = true (while (flag? Changed) (set-flag Changed false) a1 (while (not-position? end) (if (and enemy? not-neutral?) (if (and (not-position-flag? safe) (adjacent-to safe)) (set-position-flag safe true) (set-flag Changed true) ) (if (and (not-position-flag? safe) (not-position-flag? danger) (adjacent-to danger) ) (set-position-flag danger true) (set-flag Changed true) ) ) next ) ) ; *** Add captures for stones ; for each point ; if P[danger] and !P[safe] ; capture a1 (while (not-position? end) (if (and (position-flag? danger) (not-position-flag? safe)) capture (set-flag Capturing true) ) next ) back ) ; if Changed ) ; if next to enemy ;!!!!!!! Find out if suicide ; if no captures (if (and (not-flag? Capturing) (not (or (empty? n) (empty? s) (empty? e) (empty? w) ) ) ) ; *** Initialize safe ; for each point ; P[safe] = empty and not-marked a1 (while (not-position? end) (set-position-flag safe empty?) next ) back (set-position-flag safe false) ; Changed = true ; while Changed and not adjacent to safe ; Changed = false ; for each point ; if friend ; if !P[safe] ; if any adjacent is friend with P[safe] ; P[safe] = true ; Changed = true (set-flag Valid (adjacent-to safe)) (set-flag Changed true) (while (and (not-flag? Valid) (flag? Changed) ) (set-flag Changed false) a1 (while (not-position? end) (if (and friend? (not-position-flag? safe) ) (if (adjacent-to safe) (set-position-flag safe true) (set-flag Changed true) ) ) next ) back (set-flag Valid (adjacent-to safe)) ) ; *** Add if not suicide ; verify next to safe square back (verify (flag? Valid)) ) ; if no captures ; *** Add stone (if (flag? Capturing) (go last-to) (if (piece? CapturingStone) (verify friend?) (change-type Stone) ) was-a-capture (change-type yes) back (add CapturingStone) else was-a-capture (if (piece? yes) (change-type no) (go last-to) (change-type Stone) ) back add ) ) ) ; drops )
      
      







コメントがあっても、これに対処することは非常に困難です(コード内のエラーを見つけるのはさらに困難です)。 Axiomでの配列の出現により、状況は多少改善されました(ForthScript言語を使用して可能な限り)。 Ordo実装からのグループ接続を確認するコードの抜粋を以下に示します。



もう少し簡潔ですが、神秘的です
 20 CONSTANT LS 10 CONSTANT SS LS [] list[] VARIABLE list-size SS [] set[] VARIABLE set-size VARIABLE curr-pos : not-in-list? ( pos - ? ) curr-pos ! TRUE list-size @ BEGIN 1- DUP 0 >= IF DUP list[] @ curr-pos @ = IF 2DROP FALSE 0 ENDIF ENDIF DUP 0> NOT UNTIL DROP ; : not-in-set? ( pos - ? ) curr-pos ! TRUE set-size @ BEGIN 1- DUP 0 >= IF DUP set[] @ curr-pos @ = IF 2DROP FALSE 0 ENDIF ENDIF DUP 0> NOT UNTIL DROP ; : add-position ( -- ) list-size @ LS < IF here not-in-list? IF here list-size @ list[] ! list-size ++ ENDIF ENDIF ; : not-from? ( pos -- ? ) DUP from <> SWAP not-in-set? AND ; : check-dir ( 'dir -- ) EXECUTE here not-from? AND friend? AND IF add-position ENDIF ; : check-coherence ( -- ? ) here 0 list[] @ 0 BEGIN DUP list[] @ DUP to ['] n check-dir DUP to ['] s check-dir DUP to ['] w check-dir DUP to ['] e check-dir DUP to ['] nw check-dir DUP to ['] sw check-dir DUP to ['] ne check-dir to ['] se check-dir 1+ DUP list-size @ >= UNTIL 2DROP to TRUE SIZE BEGIN 1- DUP 0 >= IF DUP not-from? IF DUP from <> OVER friend-at? AND IF DUP not-in-list? IF 2DROP FALSE 0 ENDIF ENDIF ENDIF ENDIF DUP 0> NOT UNTIL DROP 0 list-size ! ;
      
      







いずれにせよ、今ではボード全体ではなく、関連する数字のグループのみが表示されるため、生産性に非常に有益です。 接続されたグループを構築するアルゴリズムには、「先頭から」開始された列挙を停止することなく、「末尾に」要素を追加できるキューが必要です。 処理中に追加された要素に到達すると、反復サイクルはそれらの要素と以前のすべての要素を処理する必要があります。 これは、このアルゴリズムが「新しい設計」のように見える方法です。



Dagazの接続テスト
 (define add-piece-neighbors (foreach current-group (all (if (any nsew nw sw ne se) (check is-friend?) (if (not (piece-contains current-group)) (take-piece current-group) ) ) ) ) ) (define check-coherence (if (exists? any-position (check is-friend?) (take-piece current-group) add-piece-neighbors ) (check (not (exists? any-position (check is-friend?) (check (not (piece-contains current-group))) ) ) ) ) )
      
      







前の2つのリストの後、信じがたいかもしれませんが、問題を解決するために必要なものはすべてあります。 友好的な数字を選択し、その隣人のセットに追加し、その隣人の隣人などを追加して、隣人がなくなるまで続けます。 この手順の最後に、構築されたセットに属さない友好的な数字が少なくとも1つ残っている場合、不変式に違反しています。 ZoGAxiomがこの問題を単純に解決できないのは残念です。




All Articles