4

私はジュニア プログラマーで、Pascal と C++ の基本を知っています。Player-Computer で Tic Tac Toe ゲームを作成し、ゲームはすべて終了しました。

コンピューターは、O がテーブルに配置されるランダムな場所を生成しますが、これは適切ではありません。

私は、すべての勝利ポジションをチェックする複数の手順を実行する必要があると考えました。それ以外の場合、コンピューターはプレーヤーの X をブロックするか、勝利ポジションを作成しようとしますが、すべての if が原因で多くの時間が失われていたでしょう。

それから、何らかの if を使ったもっと単純なバージョンを考えましたが、それでもまだ時間がかかりました。

それから私はもっと深く考えました: 4 つ探しゲームはどうですか? 地球上で誰かが利用可能なすべてのスペースをチェックする方法と、プレーヤー/コンピューターの位置の勝利または進行を完全にチェックする機能を誰かが作成することができた方法.プレーヤーはいくつかのトリックを行っているため、コンピューターをブロックしますか? コンピューターはどのようにしてそれを知るのでしょうか?!? 確かに、それをプログラムするには何年もかかります。そして、私はもっと不可能に思える何かについて話しているのではありません: チェスです。

だからここで私は、コンピューターがいくつかの問題を検索して解決する方法が、たくさんの if よりももっと簡単な方法があるべきだと自問しています。

この場合、これを解決する方法を知っている人がいる場合、TicTacToe ゲームでプレーヤーをブロックして倒すための最も簡単な手順をどのように作成できますか?

誰かが私のコードをチェックしたり使用したりしたい場合: http://pastebin.com/jhyUn7d1

4

6 に答える 6

3

あなたが探しているのはMinimaxです。

このアルゴリズムを使用すると、コンピューターはすべての Tic Tac Toe ゲームに勝つことができます。または、ある種の中程度の難易度を達成するために、コンピューターが動きを分析する深さを調整することもできます。

実装は難しくありません。再帰性に精通している必要があります。もちろん実装はコードによって異なりますが、ウィキペディアのページはかなり良い出発点を提供します。

于 2013-05-10T19:03:26.890 に答える
1

Tic tac toe アルゴリズムは次のようなものです。

  1. 勝つつもりならスポットを取る
  2. 負けそうな時は立ち向かう
  3. コーナーを取る
  4. ノンコーナーノンセンターテイク
  5. 中心を取る
于 2013-05-10T18:54:03.533 に答える
0

私のコードはC#でしたが、最近これに対処しました。

各候補の動きを採点する方法を思いつきました。私が取ったアプローチは、勝利に必要な移動の数に基づいてスコアを作成します (必要な移動が少ないほどスコアが高くなります)。

私のアルゴリズムは、複数の正方形の合計移動数も考慮します。その結果、アルゴリズムは、複数の潜在的な勝利を生み出す動きを優先します (Tic Tac Toe について私が知っている唯一の実際の戦術)。たとえば、ブロックする必要がある 2 つの潜在的な勝利を生み出す動きをすることがある場合があります。対戦相手は 1 つしかブロックできないため、勝利を生み出します。

コード全体とその説明をA Tic-Tac-Toe Game Engineという記事に投稿しました。

于 2013-05-10T18:55:53.437 に答える
0

簡単に言えば、「ゲームに勝つまでさまざまな手をすべて試し、どれがコンピューターの勝利につながったかを記録する」です。

長い答えÖ

限られたサイズの TTT ゲームでは、ゲームに勝つまでの可能な手数はそれほど多くないため、可能な手ごとに試してから、再帰的にすべての可能な対戦相手の動きを試し、ゲームが終了するまで続けます。それぞれの動きに、どれだけうまくいったかの「スコア」を与えます (たとえば、コンピューターにとって成功したさまざまな解決策の数と、対戦相手に成功した解決策の数から、「最良の」結果の 1 つを選びます)。うまくやれば、勝つのはほぼ不可能に近いものになる可能性があることに注意してください。

于 2013-05-10T18:56:30.597 に答える
0

私はこれを一度やったことがあります。コードがまだ残っているかどうかはわかりません...

とにかく、関数を作成しました。戻り値の型は int です。これは、コンピューターがピースを配置する正方形でした (0 が左上、8 が右下の正方形であると仮定します)。あなたのものは2D配列を使用しているため、少し異なります。

とにかく、各行、列、および対角線について、その行にある 2 つのピースがプレーヤーに属しているかどうかを確認します。そうでない場合は、同じであるがコンピューターに属していないかどうかを確認します。これが真である最初の行で、残りのピースを確認します。利用可能な場合は、ピースをそこに置いて勝ちます。プレーヤーが支配する行がある場合は、そこにピースがまだないことを確認し、それを突き刺してブロックします.

const int PlayerPiece = 1;
const int CPiece = 2;
const int Empty = 0; 

int board[3][3];
if(board[0][0] == PlayerPiece && board[0][1] == PlayerPiece && board [0][2] == Empty)
{
    //Put_Your_Piece_In_[0][2]
}

次に、各行をチェックできるように変更することができます。

int numRows = 3;

for(int i = 0; i < numRows; i++)
{
if(board[i][0] == PlayerPiece && board[i][1] == PlayerPiece && board[i][2] == Empty)
    {
    //Put_Piece_In_[i][2]
    }
}

次に、行についても同じことを行います。

Tic-Tac-Toe は本質的に単なる魔方陣であり、ここでかなりよく説明されていると常に考えることができます。魔方陣

于 2013-05-10T19:14:42.260 に答える
0

ウィキペディアで入手できる三目並べの完璧な戦略があります。それは本当に簡単です。グリッドのサイズが小さいため、テストする必要があるケースの数 (たとえば、2 つのブロックが連続しているかどうかのテスト) は非常に少なくなります。

于 2013-08-23T08:33:14.453 に答える