c# - 如何使用随机选择二维数组中的位置?

标签 c# multidimensional-array artificial-intelligence tic-tac-toe

我创建了一个 tic tac toe 程序,它允许玩家通过选择绳索在 2d 数组中选择一个移动,然后计算机会移动。

程序可以运行,但计算机的移动是顺序的而不是随机的,并且总是会选择数组中的下一个可用空间。现在我已经可以运行游戏了,我想将程序改进为三个难度级别:

简单 = 由计算机随机生成的着法 中 = 由计算机随机生成的移动,检查以阻止玩家和完整线 Hard = 每次通过递归选择最优走法

如何让计算机随机选择阵列中的一组绳索?

(我当前用于计算机移动的基本 for 循环)

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

最佳答案

创建 Random 的新实例类并使用 Next()方法来创建表示坐标的两个随机数。

代码如下:

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) 的后续调用产生不同于我们当前拥有的值的其他值。

关于c# - 如何使用随机选择二维数组中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13433140/

相关文章:

c# - Revit的Process.GetCurrentProcess().MainWindowTitle检索空字符串 ""

java - 有没有更干净的方法来减少这个多维字节数组以删除重复项?

c - 了解二维数组中行的 c 指针

python - NPC AI构建无网格障碍物 map

c# - 测试相似的字符串内容

machine-learning - 为什么神经网络需要隐藏层?

c# - 如何使用 Roslyn 检查属性是否装饰有自定义属性?

c# - Gecko 在 C# 中的使用 (geckofx)

php - 将多维数组变成单个数组?

c# - 取消 CancellationToken 是否会导致 CancellationToken 异常?