C# 如何使用随机选择二维阵列中的位置?
我已经创建了一个tic-tac-toe程序,它允许玩家通过选择跳线来选择2d阵列中的移动,然后计算机进行移动 程序可以运行,但是计算机的移动是顺序的,而不是随机的,并且总是选择阵列中的下一个可用空间。现在我已经开始游戏了,我想将程序改进为三个难度级别: Easy=计算机随机生成的移动 中等=计算机随机生成的移动,用于检查阻止玩家并完成线路 Hard=每次通过递归选择最佳移动 如何让计算机在阵列中随机选择一组跳线 (我当前的计算机循环基本移动)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
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的随机数
- 使用此数字选择字段
或者更简单的方法是跟踪自由坐标的数量,例如,您有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';
}