3

私は、プレーヤーがコードを選択することによって 2 次元配列で動きを選択できるようにするという点で機能する三目並べプログラムを作成しました。その後、コンピューターが動きます。

プログラムは動作しますが、コンピューターの動きはランダムではなくシーケンシャルであり、配列内の次の使用可能なスペースが常に選択されます。ゲームが動作するようになったので、プログラムを 3 つのレベルの難易度に改善したいと思います。

Easy = コンピューターによってランダムに生成された動き Medium = コンピューターによってランダムに生成された動きで、プレーヤーをブロックしてラインを完成させることをチェックする Hard = 再帰を通じて毎回最適な動きを選択する

コンピューターにアレイ内の一連のコードをランダムに選択させるにはどうすればよいですか?

(私の現在の基本的な for loop for computer は移動します)

static void Computermove(char[,] gamegrid, char fin)
    {

        Console.WriteLine("\nComputer's turn");
        Console.ReadKey();

        int x = 0;
        int y = 0;
        for (x = 0; x < 2; x++)
        {
            for (y = 0; y < 2; y++)
                if (gamegrid[x, y] == ' ') break;
            if (gamegrid[x, y] == ' ') break;
        }

        if (x * y == 9)
        {
            fin = 'X';
        }
        else
            gamegrid[x, y] = 'O';

    } // End Computermove
4

3 に答える 3

2

Randomクラスの新しいインスタンスをNext()作成し、メソッドを使用して座標を表す 2 つの乱数を作成します。

コードは次のとおりです。

var r = new Random();

var randomX = r.Next(3);
var randomY = r.Next(3);

アップデート:

メソッドは次のようになります。

static void Computermove(char[,] gamegrid, char fin)
{
    if (!ContainsEmptyCells(gamegrid))
    {
        // table is full; probably nobody won
        return;
    }

    bool goodRandomCoordinateFound = false;

    int row = 0, column = 0;

    var random = new Random();

    while (!goodRandomCoordinateFound)
    {
        row = random.Next(3);
        column = random.Next(3);

        if(gamegrid[row, column] == ' ')
            goodRandomCoordinateFound = true;
    }

    gamegrid[row, column] = 'O';
}

の原因となっている問題が見つかりましたStackOverflowException。これは非常に微妙なものですが、結論として、ランダム座標の生成を再試行するときはRandom、新しいインスタンスを作成する代わりに、同じインスタンスを使用する必要があります。

これは、Random真の乱数を実際には生成しないためです。インスタンスが作成されるnew Random()と、現在の時刻に基づくシード値で初期化されます。

の複数のインスタンスをRandom同じシード値で作成すると、同じ乱数ストリームが作成されます。

この例では、新しいランダム座標を生成する必要がある場合に備えて、シードを指定せずに Random の新しいインスタンスが作成されたため、シードは現在の時間を使用していました。ランダム インスタンスが非常に迅速に作成されたため、シード値が同じであったため、ランダム値も同じであり、無限再帰が発生していました。

インスタンスを再利用するようにメソッドを書き直しましたrandom。これにより、後続の の呼び出しで、Next(3)現在の値以外の値が生成されます。

于 2012-11-17T17:54:12.360 に答える
0

フリー座標のリストを保持し、プレイヤーまたは AI によって座標が選択されるたびにリストから削除します。リスト内のアイテムの数に基づいてランダム化するため、リストに 5 つのエントリがある場合は、1 から 5 の間の乱数を生成し、リストから座標を選択します。

または、より簡単に自由な座標の数を追跡します。たとえば、5 つの自由な座標で 1 ~ 5 の数字を生成し、ボードを反復処理して 5 番目の位置に到達します。

于 2012-11-17T17:58:16.830 に答える
0

コンピューターはすべてのフィールドを選択できないため、2 段階のプロセスが必要です。

  • 空いているフィールドの数を数えます (=:N)
  • 0..N-1 の範囲で乱数を作成する
  • この番号を使用してフィールドを選択します
于 2012-11-17T17:57:00.080 に答える