中央アメリカのインディアンのゲームをどのようにしたか

中央アメリカのインディアン向けのボードゲームであるAndroid pulookの作成方法についての短い記事をご紹介したいと思います。







私は人間のゲームでコンピューターを「訓練」し始め、プログラミングの方法をほとんど学びませんでした。 最初はMK-61電卓のkalahマンカラの一種)でした。 後に-WolfとSheep 、最初はMS-DOS用、次にAndroid用。







ゲームの概要



HabrでGlukKazanの記事を読んで、世界のさまざまな国のボードゲームの説明を掲載したDmitry Skiryukの興味深いLJに出会いました。 それらの1つ-puluk-は私をとても魅了したので、Androidに実装することにしました。







ゲームの歴史とトウモロコシ作物の神聖な意味は、Dmitry LJで見ることができます。 ここではルールのみを説明します。







プルカボードは11枚のストリップで構成され、最初と最後がプレーヤーチップの「都市」として機能します。 各プレーヤーには5つのチップがあります。 サイコロの代わりに、通常は4つのコーンカーネルが使用され、いずれかの側面が何らかの方法でマークされています。 ポイントは次のように考慮されます。







  1. 4つの穀物の1つが空白側に落ちた-1ポイント
  2. 2つの穀物が空の面を上にして落ちた-2点
  3. 三粒-三点
  4. 4つの穀物-4つのポイント
  5. すべての穀物が落ちた-5ポイント


ゲームの開始時には、すべてのプレーヤーチップは「都市」にあります。 彼のターン中、プレーヤーは穀物を投げ、チップの1つを対応する数のストリップに、相手の「都市」の方向に移動します。







1人のプレーヤーの2つのチップは1つのストリップを占有できません(「都市」を除く)。 ただし、相手のチップが置かれているストリップにチップを置くと、このチップをキャプチャできます。 さらに、この列は1つの(上部)チップとして移動し続け、他の敵チップをキャプチャできます。







コラムが捕虜になった場合、キャプチャを実行したプレイヤー、キャプチャされたプレイヤーの下位チップがすべて解放されます。







プレイヤーがボードの反対側の「都市」に列を持ってくると、キャプチャされたチップはすべてゲームから除外され(ビート)、自分の都市に戻り、再びゲームに参加できます。 敵の「都市」に入る正確なスローは必要ありません。







対戦相手のすべてのチップをキャプチャまたはビートしたプレイヤーが勝ちます。







ドミトリーは次のように書いています。「見かけのシンプルさと非常に小さなボードにもかかわらず、パルクは非常にエキサイティングです。その戦術は独特で、他国のゲームのようには見えません。 「キャッチトラップ」」。







ゲームの私のバージョンでは、2つの変更を加えました。 まず、ポイントカウントをサイコロに似たものにしました。ポイントの数は、落ちた粒の数に対応します。 4つすべての穀物がブランク側を下にした場合、5つのポイントと見なされます。







2番目の変更点は、彼らのチップを捕らわれから解放することです。 ドミトリーは、次のように述べています。 しかし、複数のチップを同時にリリースする場合、それらがすべて1つのストリップを占有する状況が発生します。 そして、これは「1人のプレーヤーの2つのチップが1つのストリップを占めることはできない」というルールと矛盾しています。 英語の規則では、チップのリリースは、列がボードの反対側の「都市」に到達したときにのみ発生します。すべてのチップが解放され、相手のチップが勝ちます。 私のバージョンでは、リリースされたチップはすぐにその都市に移動します。 これは他のルールに違反することはなく、非常に迅速にチップをゲームに戻すことができます。













技術的特徴



開発中は特別なトリックを使用しなかったため、技術的にはゲームはおそらく特別な関心を引くものではありません。 AndEngineフレームワークを使用してAndroidアプリケーションをプログラミングしました。 最近はほとんど開発されていませんが、その能力は私にとっては十分でした。







唯一の微妙な点は、チップの動きのアニメーションです。 最初は、各チップの動きをアニメーション化しました。 たとえば、最上位のチップのみが表示されているにもかかわらず、3つのチップの列を移動すると、プログラムは3つすべてを移動します。 当然、このアプローチはリソースのかなり具体的な消費につながりました。 そのため、動きを示すために2つの疑似列を作成しました。 移動中、移動したチップは最初に見えなくなり、擬似列が希望の高さに設定され、移動アニメーションが開始されました。 アニメーションが完了すると、列は見えなくなり、チップは新しい位置に設定されて見えるようになりました。 このオプションは以前のものよりも少し複雑であることが判明しましたが、コンピューティングリソースを費やす方がはるかに経済的でした。







AI開発



ゲームポイントのドロップアウトがランダムであるため、次の動きを予測できず、たとえば、AIの実装にアルファベータアルゴリズムを使用できません。 プレイヤーは自分のターン中に、可能であれば次のアクションのいずれかを実行できます。









たとえば、次の状況では:













プレイヤーは「都市」から次のチップをフィールドに引き戻すか、3番目のストリップのチップで5番目のストリップの相手のチップをキャプチャするか、8番目のストリップのチップを移動してゲームから相手のチップを削除します。







提示されたアクションのいくつかが同時に利用可能な場合、どちらを選択するかによってゲームの性質が決まります。 各アクションに特定の重みを割り当てると、一般的な用語では、アルゴリズムは次の形式で表すことができます。







  1. 利用可能なすべての動きを見つける
  2. 各動きに重みを割り当てる
  3. ウェイトが最も高い動きを選択します。


異なる重みのセットを使用して、いくつかのAIオプションを取得できます。







public class OpponentAIFirstController extends OpponentAIController { protected static final int WEIGHT_IND_HOME = 0; protected static final int WEIGHT_IND_CAPTURE = 1; protected static final int WEIGHT_IND_RELEASE = 2; protected static final int WEIGHT_IND_CAPTURED_MOVE = 3; protected float movementWeights[]; public OpponentAIFirstController(...) { super(...); initMovementWeights(); } protected void initMovementWeights() { movementWeights = new float[] {1.0f, 1.1f, 1.1f, 1.5f}; } private void calcInitialScores(int pCornsValue) { for(i = mFirstChipIndex; i < mLastChipIndex; i++) { ... int newRow = mFieldController.calcNewRow(curChip, pCornsValue); if (mFieldController.isHomeRow(newRow)) { mMoveScores[j] += 1 + curChip.capturedCount(); mMoveScores[j] *= movementWeights[WEIGHT_IND_HOME]; continue; } ... } } ... } public class OpponentAISecondController extends OpponentAIFirstController { ... @Override protected void initMovementWeights() { movementWeights = new float[] {1.0f, 2.0f, 1.1f, 1.1f}; } }
      
      





実際、確率論に基づいていくつかの予測を行うことができます。 たとえば、値5、5、4、3、2、3が上記の状況の前に落ちた場合、高い確率で、敵が値1を取得すると想定できます。 この場合、8番目のストリップ上に立つチップを捕らえておくことは非常に望ましいことです。 したがって、私が開発した3番目のアルゴリズムは、落ちた粒子の値を記憶し、潜在的なキャプチャからチップを節約する動きに高い重みを割り当てます。







どの戦略が最適かは事前にはわかりませんでした。 一方、通常のBeginnerMasterなどのようにAIオプションを呼び出します。 かなり当たり前。 したがって、私が特定のネイティブアメリカンの神にちなんで名付けた各オプション。 ケツァルコアトルに敬意を表して、まずチップを保存しようとする最初のアルゴリズムは、おそらく最も有名なインドの神です。 敵のチップをキャプチャしようとする2番目のアルゴリズムは、 Kamashtliの戦争の神を称えるものです。 私の仮定によれば、3番目のアルゴリズムは最良であるはずですが、トウモロコシの神Tsenteotlに敬意を表しています。 結局のところ、ゲームが捧げられている神は誰よりもそれをよくプレイするべきです。







ゲームにいくつかの教育的要素を取り入れるために、AIを選択するためのダイアログと、「プログラムについて」というダイアログに、Wikipediaの対応する記事へのリンクを追加しました。 多くのゲームをした後、私は次の統計を得ました:



















まとめ



Pulukは本当に独創的で楽しいゲームです。 これで、「疲れ果ててパーティーごとにプレイする」ことができます。 インターネットとGoogle Playゲームサービスを使用して、本物のMayaと戦うことさえできます。 まあ、農家はトウモロコシ作物への影響を確認できます。








All Articles