gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:08:51 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com