【问题标题】:Trying to create a grid of pictureboxes in an array for a board in c#尝试在 C# 中为板创建数组中的图片框网格
【发布时间】:2014-04-01 08:53:56
【问题描述】:

我正在尝试使用数组中的图片框为 Naughts and Crosss(井字游戏)游戏制作一个棋盘,而我想出的是这个。这会在我按下按钮时开始。

for (int i = 0; i <= 3; i++)
        {
            for (int j = 0; j <= 3; j++)
            {
                PictureBox[,] pb = new PictureBox[i, j];
                pb[i, j].Location = new Point(i * 150 + 100, j * 150 + 100);
                pb[i, j].Width = 150;
                pb[i, j].Height = 150;
                pb[i, j].Visible = true;
                pb[i, j].BorderStyle = BorderStyle.FixedSingle;
                pb[i, j].BringToFront();
                this.Controls.Add(pb[i, j]);
            }
        }

这会在行上抛出“System.IndexOutOfRangeException”

pb[i, j].Location = new Point(i * 150 + 100, j * 150 + 100);

这里有什么问题?

【问题讨论】:

  • 不就是设置位置的方式吗?这是我通过查看其他人的代码得出的结论

标签: c# multidimensional-array picturebox


【解决方案1】:

您已经不远了-您需要在循环之外声明数组,并在每次迭代时创建一张图片-这可行(已测试):

            PictureBox[,] pb = new PictureBox[3, 3];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    pb[i,j] = new PictureBox();
                    pb[i, j].Location = new Point(i * 150 + 100, j * 150 + 100);
                    pb[i, j].Width = 150;
                    pb[i, j].Height = 150;
                    pb[i, j].Visible = true;
                    pb[i, j].BorderStyle = BorderStyle.FixedSingle;
                    pb[i, j].BringToFront();
                    this.Controls.Add(pb[i, j]);
                }
            }

(注意循环中的逻辑也是错误的,它应该是

【讨论】:

    【解决方案2】:

    您已经在for 循环中声明并实例化了多维数组。请尝试以下操作:

    PictureBox[,] pb = new PictureBox[3, 3];    
    for (int i = 0; i <= 3; i++)
    {                
        for (int j = 0; j <= 3; j++)
        {
            pb[i, j] = new PictureBox();
            pb[i, j].Location = new Point(i * 150 + 100, j * 150 + 100);
            pb[i, j].Width = 150;
            pb[i, j].Height = 150;
            pb[i, j].Visible = true;
            pb[i, j].BorderStyle = BorderStyle.FixedSingle;
            pb[i, j].BringToFront();
            this.Controls.Add(pb[i, j]);                    
        }
    }
    

    【讨论】:

      【解决方案3】:

      我会说你创建图片框数组来创建 Ticktack Toe 游戏的方法是错误的。另外你的代码效率低下

      在您的代码中,您重复创建冗余数组

      PictureBox[,] pb = new PictureBox[i, j];
      

      你在这里浪费了运行时内存。

      我建议创建一个继承自 PictureBox 类的新 Picturebox 类。 将此矩形区域划分为 3X3 矩阵(在维度方面) 然后你需要捕获点击事件并获取点

        private void pictureBox1_Click(object sender, EventArgs e)
          {
              MouseEventArgs eM = (MouseEventArgs)e;
      
          //eM.X  -X Coordinate  eM.Y  -Y Coordinate 
      
          }
      

      使用此坐标识别用户单击的矩阵位置。然后重绘整个图片框以反映用户所做的输入。 这将区分维护图片框数组的需要,您可以专注于维护 3X3 整数或布尔数组(0 或 1)。当出现获胜条件时,您只需在匹配的数组条目上画一条线。

      使用Graphics.DrawLine 方法来做到这一点

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 2017-07-08
        • 2018-08-25
        • 2017-07-13
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        相关资源
        最近更新 更多