【问题标题】:Random labels in Tic Tac Toe simulation井字游戏模拟中的随机标签
【发布时间】:2014-12-18 17:49:46
【问题描述】:

我正在为一堂课开发井字游戏模拟器,但遇到了问题。

我创建了一个二维数组来模拟板,并在所有框中填充 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);

        }
    }

}

【问题讨论】:

  • 这些标签来自哪里?或者它们应该显示在哪里?
  • 在表单上,​​我有 9 个标签,采用 3 x 3 设置。我需要板数组中的每个数字与标签匹配,并将标签文本设置为 X 或 O,具体取决于随机数是 0 还是 1。
  • 如果你想要一个随机的 0 或 1,那么 rand.Next(2) 就是票。 rand.Next(1) 将始终返回 0
  • 你在用什么(Winforms、WPF等)?

标签: c# arrays random labels


【解决方案1】:

标签的名称是什么?我在下面假设标签是 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";
        }

【讨论】:

    【解决方案2】:

    您的board 存储整数,这是您游戏状态的内部表示。您可以为您的游戏 GUI 创建一个包含 LabelUniformGrid。下面的代码根据您当前的板返回一个网格。您需要将此返回的网格添加到您的 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      private static Random s_Rand = new Random();
      

      尽量不要在按钮enent中实现算法直接,这是一种不好的做法:

      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();
      }
      

      【讨论】:

        【解决方案4】:

        你跳过INTEGER板直接进入标签数组怎么样?

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

        Label[,] listOfLabels; // Do also initialize this.
        
        foreach(Label current in listOfLabels)
        {
           current.Text = _rand.Next(2) == 0 ? "0" : "X";
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          • 1970-01-01
          • 2015-06-19
          • 1970-01-01
          • 1970-01-01
          • 2015-06-12
          相关资源
          最近更新 更多