Tic Tac Toe模拟中的随机标签

时间:2014-10-23 05:10:35

标签: c# arrays random labels

我正在为一个班级的Tic Tac Toe模拟器工作并遇到了一个问题。

我创建了一个二维数组来模拟电路板,并在所有方框中用0或1填充它。

我遇到的问题是将这些数字应用于我创建的标签(a1,a2,a3,b1,b2等)。

我的嵌套for循环是否可以让数组中的每个元素都应用于新标签?我似乎无法在我的书或网上找到任何关于此事的内容。

以下是我的相关代码:

private void newBTN_Click(object sender, EventArgs e)
{

    Random rand = new Random();
    const int ROWS = 3;
    const int COLS = 3;


    int [,] board = new int[ROWS, COLS];


    for (int row = 0; row < ROWS; row++)
    {
        for (int col = 0; col < COLS; col++)
        {
            board[row, col] = rand.Next(1);

        }
    }

}

4 个答案:

答案 0 :(得分:0)

标签的名称是什么?我在下面假设标签是Label0_0,Label0_1,Label1_1等等......这样您就可以使用rowcolumn值找到它们。

您希望动态地在表单上找到Label控件,因为您在编码时不会提前知道该名称。

如果你事先知道这个名字,你只需说:label1.Text = "1";

但是在你的情况下,你试图在循环的每次迭代中找到一个特定的控件。因此,您需要为标签命名,以便您可以使用Form.Controls.Find(string, bool)找到它们:

        var row = 4;
        var col = 6;
        var l = this.Controls.Find("Label" + row.ToString() + "_" + col.ToString(), false).FirstOrDefault() as Label;
        if (l == null)
        {
            //problem... create label?
            l = new Label() { Text = "X or O" }; //the position of this need to be set (the default is 0,0)
            this.Controls.Add(l);
        }
        else
        {
            l.Text = "X or O";
        }

答案 1 :(得分:0)

您的board存储整数,这是游戏状态的内部表示。您可以为游戏GUI创建一个UniformGrid,其中包含Label。下面的代码返回基于您当前板的网格。您需要将此返回的网格添加到MainWindow(或任何您使用的)以查看它。

private UniformGrid fillLabels(int[,] board)
{
    int numRow = board.GetLength(0);
    int numCol = board.GetLength(1);
    UniformGrid g = new UniformGrid() { Rows = numRow, Columns = numCol };

    for (int i = 0; i < numRow; i++)
    {
        for (int j = 0; j < numCol; j++)
        {
            Label l = new Label();
            l.Content = (board[i, j] == 0) ? "O" : "X";
            Grid.SetRow(l, i);
            Grid.SetColumn(l, j);
            g.Children.Add(l);
        }
    }
    return g;
}

答案 2 :(得分:0)

首先,每次需要时都不要重新创建(和重新初始化 e)Random:它会使生成的序列倾斜严重

private static Random s_Rand = new Random();

尝试不直接在按钮中实现算法,这是一个不好的做法:

private void CreateField() { ... } 

private void newBTN_Click(object sender, EventArgs e) {
  CreateField();
}

把所有人放在一起:

private static Random s_Rand = new Random();

private void ApplyLabelText(String name, String text, Control parent = null) {
  if (null == parent)
    parent = this;

  Label lb = parent as Label;

  if ((lb != null) && (String.Equals(name, lb.Name))) {
    lb.Text = text;

    return;
  }

  foreach(Control ctrl in parent.Controls)
    ApplyLabelText(name, text, ctrl);
}

private void CreateField() { 
  for (Char row = 'a'; row <= 'c'; ++row)
    for (int col = 1; col <= 3; ++col)
      ApplyLabelText(row.ToString() + col.ToString(), s_Rand.Next(1) == 0 ? "O" : "X"); 
} 

private void newBTN_Click(object sender, EventArgs e) {
  CreateField();
}

答案 3 :(得分:0)

你怎么跳过INTEGER板直接转到Label阵列?

然后,您可以执行以下操作以循环所有这些:

Label[,] listOfLabels; // Do also initialize this.

foreach(Label current in listOfLabels)
{
   current.Text = _rand.Next(2) == 0 ? "0" : "X";
}