2012-03-19 7 views
3

私は完成したチック・タック・トー・ゲーム・ボードを持っています。それは3×3です。実際にコードを求めているわけではありませんが(それは助けになりますが)、誰が勝つのが最適なのでしょうか?どのようなアルゴリズムを使って誰が勝つのか調べるのに役立つはずのフレーズのもう一つの方法は?チック・タック・トー・ゲームに勝った人を見るための最適なアルゴリズム

本当に思い浮かぶのはブルートフォースだけです。すべての可能性をテストするだけですが、もっと良い方法があるはずです。

+2

行をループし、列をループして、対角線を確認します。 – Danny

+0

あなたはAIについて質問していますか? min-maxの木にアルファベター剪定のような? tic-tac-toeゲームマトリックスでのパターン検索? – Adrian

+0

もっと静的な検索のようです。ゲームはすでに完了しています。テキストファイルです。私はテキストファイルを読み、誰が勝ったのかを判断する必要があります。しかし、それは可能な限り最適でなければなりません。だから私は次のベストな動きが何であるかを決める必要はありません。 – user489041

答えて

2

ただ地図diagonal -> number of checks in that diagonalを使用してください。

エントリの1つが3に等しい場合、勝者があります。

12

私が最近知った重要な教訓(再学習):検索スペースが十分に小さいときには、ブルートフォースを使用してください。

3x3ボードには、8つの可能な勝利シーケンス(行、列、および対角線)があります。これにより、すべてのセルで同じプレーヤーのマーキングがあるかどうかを24回比較します。非常に遅いコンピュータでさえ、24の比較はまったく時間がかかりません。

+0

本当に良いレッスン –

+2

...と: "小さい"はしばしば意外に大きいです。 – Philip

-2

ボードの状態全体を確認せずに勝者を決定する方法はありません。各ターンの終わりにチェックを実行する場合は、各行、列、および両方の対角線を反復して、等価性をチェックします(例:board[0][0] == board[1][0] == board[2][0]など)。ティック・タック・トゥ・ゲームのプレイ中にボードの状態を把握したい場合は、dynamic programmingを使用することができますが、それは大きな過労です。ダイナミックなアプローチは、異常に大きいボードを使用している場合には、勝者を見つけるために膨大な手順が必要になる場合に便利です。また、標準的なtic-tac-toeは、効率的なアルゴリズムがパフォーマンスにほとんど影響を与えないほど十分に小さいことに注意する価値があります。

+0

建設的な批判をお願いしますか? – collinjsimpson

-1

ゲームが終了したかどうかを各ステップ後に確認する必要がある場合は、一時的な結果をキャッシュすることができます。

各行、縦列、および斜めに、各プレーヤーのマークの数を格納します。各ステップの後に適切な値を増やします。番号が3の場合は、勝者がいます。ここで

+0

ハァッ?親愛なるdownvoters、あなたの懸念を共有してください。 –

3

は最高、賢い最適アルゴリズム次のとおりです。(これはよく知られてトリックですので、私は、唯一のアルゴリズムを賞賛自慢していない)

定義:細胞

A31 A32 A33 
A21 A22 A23 
A11 A12 A13 

これらの要素は、W(ハイライト)またはB(不足)です。 8つの勝ちの組み合わせがあります:[A11、A12、A13]、[A11、A21、A31]、[A13、A22、A31]などの各組み合わせに名前付け:C1..C8:

C1 =def= [A11,A12,A13] 
C2 =def= [A21,A22,A23] 
C3 =def= [A31,A32,A33] 
C4 =def= [A11,A21,A31] 
C5 =def= [A12,A22,A32] 
C6 =def= [A13,A23,A33] 
C7 =def= [A11,A22,A33] 
C8 =def= [A13,A22,A31] 

を勝ちの組み合わせのセットに細胞からのマッピングを定義します。

A11 --> C1,C4,C7 
A12 --> C1, C5 
A22 --> C2, C5, C7, C8 

など

だから、すべてのセルAのポイントをそこに持っているものを組み合わせに。

両方のプレイヤーに対して、可能な組み合わせの可能な組み合わせを保存します。最初は両方のプレーヤーが8つの組み合わせをすべて持っています。

Poss_W = C1, C2, C3, C4, C5, C6, C7, C8 
Poss_B = C1, C2, C3, C4, C5, C6, C7, C8 

WはセルAで再生するとき白色A12を果たしている場合、例えば、Bから対応する入賞組み合わせを削除するには、ブラックの可能な入賞組合せのリストからC1、C5を削除します。

ゲームが終了した後、空ではない可能性のある勝ちの組み合わせを持つプレイヤーが勝ちます。 Poss_WとPoss_Bの両方が空の場合、ゲームは抽選です。

+0

アルゴリズムは、移動の順序に依存しません。あなたが望むなら、ゲームの終了を待つことができます。あなたは、最初にすべての黒い動きをプレイしてから、すべての白い動きをプレイすることができます。完成したボードを取ってセルの値(BまたはW)を任意の順序で読み取り、必要に応じて移動を適用することができます。アルゴリズムは進行中のゲーム**および**に適用され、終了したゲームに適用されます。 –

+0

ハム、これは私のアプローチとあまり違いはありません。 – akappa

+0

おそらく、TicTacToeは単純なゲームなので、アルゴリズムはあまり輝きません。しかし、より複雑なゲームやパズルでも使用できるのは、非常に強力なアイデアです(「ソリューション」を明示的に列挙して要素をソリューションセットにマップする)。テトリスをチェスボードに置き、最初のテトリスを失うゲームをしましょう。このアルゴリズムは、移動のリストがターミナルボードの位置につながるかどうかを素早く確認するために変更することができます。 (要素:単体配置、組み合わせ:すべての要素の集合、つまり各配置によって他の配置が不可能になる) –

関連する問題