【问题标题】:Auto generated tic-tac-toe自动生成井字游戏
【发布时间】:2026-02-06 17:20:03
【问题描述】:

这是有效的

            int index = 0;

        for (int i = 0; i != ROWS; i++)
        {
            for (int n = 0; n != COLS; n++)
            {
                if (gameArray[i, n] == 1)
                {
                    labels[index].Text = "X";
                }
                else if (gameArray[i, n] == 0)
                {
                    labels[index].Text = "O";
                }
                index += 1;
            }
        }

我正在用 c# 做一个自动井字游戏。我只能让标签显示所有 X 或所有 O,它永远不会在所有 9 个标签中混合其一个或另一个。下面是我获取 x 或 o 值的方法。

// initialize our game array
for (int i = 0; i != ROWS; i++)
{
    for (int j = 0; j != COLS; j++)
    {
        gameArray[i, j] = rand.Next(0, 2);
    }
}

// Add the x's and o's to our labels
foreach (int item in gameArray)
{
    foreach (Label myLabel in labels)
    {
        if (item == 1)
            myLabel.Text = "X";
        if (item == 0)
            myLabel.Text = "O";
    }
}

【问题讨论】:

  • 这是作业吗?他们教你如何使用调试器了吗?
  • 不要在标题中添加solved - 只需在复选框中标记对您有帮助的答案!

标签: c#


【解决方案1】:

您正在浏览每个项目,然后对于每个标签,您正在根据该项目设置 X 或 O。

所以它要么全是 X 要么全是 O,这取决于最后一项是什么。

您需要一种将标签与项目相关联的方法。如果你知道这两个数组都是 9 长......

for(int c=0; c<COLS c++)
{
   for(r=0; r<ROWS; r++)
   {
    if(gameArray[r,c] == 1)
    {
       labels[r*COLS+c].Text = "X";
    }
    else if(gameArray[r,c] == 0)
    { 
       labels[r*COLS+c].Text = "O";
    } 
}
}

【讨论】:

  • 另外,您可以在同一个循环中同时进行数组的初始化和设置相应标签的值。
  • gameArray是一个多维数组。
  • 不知道你的标签是如何在视觉上完成的,可能需要调整你如何迭代尺寸以匹配你的标签
  • 不管他的例子如何,他的开场白都是正确的,也是问题的根源。除此之外,如果 gameArray 是 2 维的,为什么不将标签也设为 2D 以使关联更符合逻辑?
【解决方案2】:

生成太快了,它只使用相同的随机数种子。每次尝试生成数字时都会生成一个新的 rand 种子实例。

【讨论】:

    【解决方案3】:

    这应该可以工作,因为标签也是一个二维数组:

    for (int i = 0; i != ROWS; i++)
    {
        for (int j = 0; j != COLS; j++)
        {
          var item = rand.Next(0, 2);
          gameArray[i, j] = item; 
          var myLabel = labels[i,j];
    
          if (item == 1)
            myLabel.Text = "X";
          if(item == 0)
            myLabel.Text = "O"; 
        }
    }
    

    如果标签是一维替换:

    var myLabel = labels[i,j];
    

    与:

    var myLabel = labels[i+j];
    

    【讨论】: