3

我创建了一个井字游戏程序,它允许玩家通过选择绳索来选择二维数组中的移动,然后计算机进行移动。

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

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

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

(我目前用于计算机的基本 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
4

3 回答 3

2

创建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)产生与我们当前拥有的值不同的值。

于 2012-11-17T17:54:12.360 回答
0

由于计算机无法选择所有字段,因此您需要一个 2-Step 过程

  • 计算空闲字段的数量(=:N)
  • 在 0..N-1 范围内创建一个随机数
  • 使用此数字选择一个字段
于 2012-11-17T17:57:00.080 回答
0

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

或者更简单地跟踪自由坐标的数量,例如您有 5 个自由坐标生成一个数字 1-5,然后在棋盘上迭代以到达第 5 个位置

于 2012-11-17T17:58:16.830 回答