5

「Connect 4」ゲームのJava実装があります(列と行の数が可変です)。

この実装では、(ユーザーの選択に応じて) maxDepthの検索の最大深度でのアルファ ベータ プルーニングを使用したミニマックスのミニマックス アルゴリズムを使用します。

私の問題は、ボードの状態に対する適切な評価関数の設計です(これは maxDepth で返される値です)。

値は-100 (最悪の選択、負けた状況に対応)から100 (最良の選択、勝利の状況に対応) の間で、0「引き分け」の状況と見なされます。

実際には2つの関数を実装しました(コードが非常に長いため、疑似コードを報告します)

1)

  • 勝てない・負けない

--> テーブルがいっぱいの場合 ==> 抽選 (0)

--> テーブルがいっぱいでない場合 ==> 不明な状況 (50)

  • 勝つ

--> 勝った場合: 100

--> 対戦相手に勝利した場合: -100

2)

Of me:
- InARow[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow[1] = maximum number of pieces in a VERTICAL in a row
- InARow[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow[3] = maximum number of pieces in a DIAGONAL (descending) in a row
Of the opponent
- InARow2[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow2[1] = maximum number of pieces in a VERTICAL in a row
- InARow2[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow2[3] = maximum number of pieces in a DIAGONAL (descending) in a row

value = (100* (InARow[0] + InARow[1] + InARow[2] + InARow[3]) )/16 - (100* (InARow2[0] + InARow2[1] + InARow2[2] + InARow2[3]) )/16  

3 番目の (そして可能であればより優れた)関数を設計する必要があります。なにか提案を?

前もって感謝します。

4

3 に答える 3

5

各プレイヤーがまだ作ることができる行で可能な4の数を数え、それを互いに差し引くだけです.

たとえば、両方のプレーヤーが のスコアで開始し7*4 (horizontal) + 4*7 (vertical) + 4*4 (diagonal up) + 4*4 (diagonal down)ます。赤が左下隅に 1 を置いた場合、黄は のスコアを失い1 + 1 + 1 + 0 = 3ます。しかし、代わりに赤が 1 を真ん中に置いた場合、黄は のスコアを失い4 + 1 + 1 + 1 = 7ます。

もちろん、いずれかのプレーヤーが勝った場合、-infinity上記のシステムに関係なく、他のプレーヤーのスコアは です。

于 2012-06-13T09:07:21.567 に答える
4

基本的なケースを解決しました: 私の勝ち = 100 ポイント、私の負け = -100、引き分け = 0. あなたが殺すことができる「不確かな」ケースは、ボードの「良さ」を反映していません。そのため、ギャップを埋める必要があります。考慮して値を割り当てたいケース:

  • X が連続しています (3 つ連続している場合は、2 つだけよりも優れています。関数は、短い行よりも長い行を追加することを優先する必要があります)。
  • 対戦相手は X を連続して持っています (同様に、彼/彼女が連続しているほど、私たちは悪化します)
  • 埋めている列の数を数えます (ピースを配置して 3 列を 2 列にする方が、ピースを配置して 3 列を 1 列だけ形成するよりも優れています)。
  • ブロックしている列の数を数えます (同様に、ピースをドロップして 3 列の 2 人の対戦相手をブロックできれば、2 列の 1 列をブロックするよりも優れています)。
于 2012-06-11T17:57:25.603 に答える