0

私はすでにここで主題について質問しました:
https://stackoverflow.com/questions/19916951/generating-a-tree-form-array-for-ataxx-game-in-Java

しかし、私は一歩一歩行きましょう:

Ataxx ゲーム(7x7 グリッド ボード)の状態を表す最良の方法 (または最良のデータ構造) は何ですか?

* 状態はゲーム ツリーのノードで表されますが、ノードには何が入っているのでしょうか? 価値?文字列?別のデータ構造?

4

2 に答える 2

2

ボード全体は、何らかの整数型 (つまりbyte[][]) の 2D 配列、またはenum[][]. 次に0、たとえば、空1のセルを表すことができ、プレーヤー 1 のピースを2含むセルを表すことができ、プレーヤー 2 のピースを含むセルを表すことができます。

ゲーム ツリーのノードは通常、ボード全体です (byte[][]またはenum[][])。

ボードのよりコンパクトな表現を探している場合は、基数 3または基数 4 (2 ビット、扱いやすい) 表記を使用してボードを表すこともできますが、それは少し複雑です (おそらく固執することができますメモリ/実行時間の問題が発生し始めるまで、2D 配列を変換します。クラスに抽象化する限り、変換はかなり単純で、テストも簡単です)。

于 2013-11-13T16:21:38.260 に答える
1

チェスとチェッカーから得た非常に効果的な表現であるbitboardsを使用します。概念はビットでピースを表現することであり、プレーヤーのピースのセットはビットのフィールドで表現できます。少なくとも 49 ビットが必要なので、64 ビットの整数が適切に機能します。

これは非常にメモリと計算効率の高い表現であり、他の表現よりも表現力があります。ビット演算を使用して、単一のピースとセット全体の両方を一度に簡単に操作できます。提案されているような配列ベースの表現では、ビットボード ( 、、、、など)byte[][]を使用して単一の演算子で表すことができる操作に対して、あまりにも多くのループを実行する必要があります。&|^<<>>>

セットされたビットはプレイヤーの駒を与えます。たとえば、これは 1 人のプレーヤーのビットボードかもしれません。他のプレイヤーのために別のビットボードが必要になります。

0000000000000000000000000000000010000000001000000

10 進数では、これは になりますlong bitboard = 65600;。いくつかの新しい行を挿入すると、次のようになります。

0000000
0000000
0000000
0000000
0000100
0000000
1000000

これを効率的に処理するために、いくつかのテーブルを事前計算できます。したがって、32 番目のビット/正方形の中央にあるピースについては、次のようsurroundingに使用すると次の表がsurrounding[square]得られる可能性があります。

0000000
0000000
0000000
0001110
0001010
0001110
0000000

&次に、ビットごとの演算子を使用して、これと相手のビットボードとの交点を見つけるか、 との結合|、または との差^などを取得<< 7できます。多くの表現力があり、これらの操作のほとんどは1 クロック サイクルしかかからないため、非常に効率的でもあります。

于 2013-11-13T16:29:53.773 に答える