Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用随机选择二维阵列中的位置?_C#_Multidimensional Array_Artificial Intelligence_Tic Tac Toe - Fatal编程技术网

C# 如何使用随机选择二维阵列中的位置?

C# 如何使用随机选择二维阵列中的位置?,c#,multidimensional-array,artificial-intelligence,tic-tac-toe,C#,Multidimensional Array,Artificial Intelligence,Tic Tac Toe,我已经创建了一个tic-tac-toe程序,它允许玩家通过选择跳线来选择2d阵列中的移动,然后计算机进行移动 程序可以运行,但是计算机的移动是顺序的,而不是随机的,并且总是选择阵列中的下一个可用空间。现在我已经开始游戏了,我想将程序改进为三个难度级别: Easy=计算机随机生成的移动 中等=计算机随机生成的移动,用于检查阻止玩家并完成线路 Hard=每次通过递归选择最佳移动 如何让计算机在阵列中随机选择一组跳线 (我当前的计算机循环基本移动) static void Computermove(c

我已经创建了一个tic-tac-toe程序,它允许玩家通过选择跳线来选择2d阵列中的移动,然后计算机进行移动

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

Easy=计算机随机生成的移动 中等=计算机随机生成的移动,用于检查阻止玩家并完成线路 Hard=每次通过递归选择最佳移动

如何让计算机在阵列中随机选择一组跳线

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

static void Computermove(char[,]gamegrid,char-fin)
{
Console.WriteLine(“\n轮到计算机”);
Console.ReadKey();
int x=0;
int y=0;
对于(x=0;x<2;x++)
{
对于(y=0;y<2;y++)
如果(gamegrid[x,y]='')中断;
如果(gamegrid[x,y]='')中断;
}
如果(x*y==9)
{
fin='X';
}
其他的
gamegrid[x,y]='O';
}//结束计算机移动

创建该类的新实例,并使用该方法创建表示坐标的两个随机数

代码如下:

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
实例,这会导致对
Next(3)
的后续调用产生与当前值不同的值。

由于计算机无法选择所有字段,您需要一个两步过程

  • 计算可用字段的数量(=:N)
  • 创建一个范围为0..N-1的随机数
  • 使用此数字选择字段

每当玩家或AI选择坐标时,保留一个自由坐标列表,将其从列表中删除。根据列表中的项目数进行随机化,因此如果列表中有5个条目,则生成1到5之间的随机数,从列表中选择坐标


或者更简单的方法是跟踪自由坐标的数量,例如,您有5个自由坐标,生成一个数字1-5,只需在电路板上迭代即可到达第5个位置

,谢谢。我现在有程序选择随机位置,因为我想。我确实有一个错误,如果它的左边有赢的移动,它会在哪里断开?静态无效计算机移动(char[,]gamegrid,char fin){var random=new random();int row=random.Next(2);int column=random.Next(2);if(gamegrid[row,column]!=“”){Computermove(gamegrid,fin);}else{gamegrid[行,列]='O';}//End Computermove发生“System.StackOverflowException”类型的未处理异常。我现在明白了。发生这种情况是因为可能没有空单元格,并且
Computermove
被无限递归调用。在这种情况下,我想您应该在方法的开头测试是否有空单元格。嗯,我看到我正在使用//如果(row*column==9){fin='X';}else gamegrid[X,y]='O';//但现在无法使其工作
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';
}