2013-04-01 10 views
8

これはたくさん尋ねられていますが、私は他のコードを検索しましたが、私が見たもののほとんどは完璧(単純に失われません)とシンプルでエレガントで効率的ではないようです。そして、どのタイプのソリューションがその説明に合うかを決めることはできません。私が見てきたシンプルチックタックつま先AI

解決策は以下のとおりです。

(1)アルファ・ベータ法とミニマックスを使用。これは私には複雑に思えますし、そのようなシンプルなゲームには不必要かもしれません。それはおそらくあまりにも複雑ですか?そうでない場合は、ハードコーディングをたくさん行う必要がありますか、アルゴリズムを誤解していますか?

(2)Wikipediaの擬似コード戦略を使用してコードを記述してください...これを実装する方法が正確にはわかりません。たとえば、「for for forks」と表示されます。これらの小切手のほとんどは、winningLinesの配列を持って、それが記入されるかどうかをチェックすることによって行われますか?そうでない場合は、誰かが私にどのようなデータ構造についてのヒントを与えることができますか、ここで擬似コードに入れられた小切手を実装する方法に関する基本的なヒントをhttp://en.wikipedia.org/wiki/Tic-tac-toe#Strategyで教えてください。私はまた、 'X'四角と 'O'四角に数値を与え、その合計を使用して勝者を決定するアルゴリズムを見てきましたが、なぜこれが特に有用なのかわかりません。

その他のソリューションはありますか?

+1

ゲームツリー、ちょうどブルートフォース。すべての可能なゲームをシミュレートするのに時間がかかりません。 – Dave

+2

は完璧とは思われません(いつも勝ちます)=普通のようです。私はいつもティックタックのつま先で勝つ。または最悪のネクタイで。インテリジェントな人なら、これと同じ結果が得られます。だから誰も10歳の後にティックタック・トーを演じる人はいません。誰も勝利しなければ楽しいことはありません。 –

+0

また、「常に勝つ」は有効な要件ではありません。あなたのアルゴリズムが自分自身と対戦することを想像してみてください。 – Dave

答えて

9

AIとヒューリスティックを扱う場合、最も単純なタスクは非常に迅速に複雑になる可能性があります。ミニマックスアプローチはあなたに最高の結果をもたらし、AIを実装しているという事実を考慮すると、それほど難しいことではありません。これは、2プレーヤーターンベースのゲームロジックを持つ確立された標準です。

tic-tac-toe AIとminimaxの実装に関するいくつかの良い洞察を提供します。

http://www.ntu.edu.sg/home/ehchua/programming/java/JavaGame_TicTacToe_AI.html

編集:

は、誰かが、これはミニマックスに関与ヒューリスティックの実装の非効率的な方法になってしまうために起こっている「ブルートフォース」...を書い気付いていること。他のプレイヤーが最後に移動したことに基づくすべての可能な移動による反復は、ヒューリスティックを実装するもう一つの方法です。私の意見では、より多くの作業があるように見えます。 Minimaxの実装は簡単で効果的です。

Edit2:

「より簡単な実装」は多少相対的です。 Minimaxが標準であり、私がこのコメントで述べたように、あなたが探している症例に合わせてヒューリスティックを操作することができます...

私はあなたに最も簡単な方法を教えてもらいたいと思いますが、あなたのゲームのコードで。

ゲームのインプリメンテーションを見て、最適なものを見てみましょう。

誰かにシンプルなものは、別のものに複雑になる可能性があります。私はちょうどあなたにオプションを与えようとしており、ミニマックスはかなり安定しています。たぶんあなたのニーズに合わせて調整してみてください。

編集3:

さらに指示が必要な場合は教えてください。私は喜んでお手伝いします。

+0

明快に言うと、minimaxは実際にウィキペディアのエントリーから全てのケースをチェックするよりも単純であると言っているのですか?それとももっと効率的で上品なコードを可能にしながらそれほど複雑ではないと言っていますか? – user1136342

+0

ダイナミックプレイをしたい場合は、ミニマックスを使ってください。ウィキのケースを使用してチック - タック - トウの場合は、それらのオプションをハードコードし、あなたが望むならばそれらを "ブルートフォース"の方法で続けることができます。それはうまく動作し、場合によっては勝利を保証するでしょう。あなたが特定のヒューリスティックでミニマックスを実装できるケースを扱うために一般的なヒューリスティックが必要な場合、私は言っていました。彼らがカバーされていることを保証するためにヒューリスティックにこれらの「明確な勝利」ケースを含めることができ、必要に応じてより一般的な選択肢に戻すことができます。私は両方を含むハイブリッドヒューリスティックがあなたに最高のサービスを提供すると思います。 – AnxGotta

+0

「保証の勝利」とはどういう意味ですか?すべてのケースで勝利を保証するのではないでしょうか? – user1136342

3

this imageを一連の移動に「エンコード」するのに使用するフォーマットを使用してください。 AIは常に勝つか、結びつきます。例えば

次のように、あなたはそれをエンコードすることができます:

var turns = { 
    "mefirst":{ 
    "move":0, 
    "next":[ 
     null, 
     { 
     "move":4, 
     "next":[ 
      null, 
      null, 
      {"move":8}, // win 
      {"move":8}, // win 
      null, 
      {"move":8}, // win 
      {"move":8}, // win 
      {"move":8}, // win 
      { 
      "move":6, 
      "next":[ 
       null, 
       null, 
     /* AND SO ON... */ 
    ] 
    } 
}; 

次にあなたが開始することができます:

playerTurnのようなものである
if(ai_goes_first) { 
    game = turns.mefirst; 
    makeMove(game.move); 
} 
else game = turns.themfirst; 
playerTurn(); 

:このような小さなについて

function playerTurn() { 
    when player clicks a valid squeare { 
     game = game.next[chosenSquare]; 
     makeMove(game.move); 
     if(game.next) playerTurn(); 
    } 
}