我创建了一个 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/