1

我正在编写 crossWord 程序 首先,用户必须输入一个数字 "n" ,并创建一个 * n 表,其中包含白色和空白的 TextBoxes。建好表格后,用户点击几个房子,房子的背景颜色变成黑色。

我的问题是在此步骤之后,黑色的文本框有多少,白色的文本框有多少,如何检测水平或垂直列中没有任何黑色的连续白色文本框的最大数量,以粘贴匹配的单词给他们!

在此处输入图像描述

在上表中,表单必须检测到第二个水平行或第二个垂直行中白色连续文本框的最大值为 5,用户填写后必须在第一行中显示 4 为最大值,然后继续结束...

这是我的代码片段:

private void CreateCrossTable()
{
    int count = Convert.ToInt32(textBox1.Text.Trim());
    if (count > 10)
       count = 10;

    int x = 100, y = 100;
    const int value = 100;

    for (int i = 1; i <= count; i++)
    {
        for (int j = 1; j <= count; j++)
        {
            x = value + (j * 20);
            TextBox tb = new TextBox();
            tb.Name = "txtbox" + i + "-" + j;
            tb.Location = new Point(x, y);
            tb.Size = new System.Drawing.Size(20, 20);
            tb.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.txtMouseDoubleClick);
            Controls.Add(tb);
        }

        y = value + (i * 20);
    }
}

private void txtMouseDoubleClick(object sender, MouseEventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.BackColor = Color.Black;
    tb.Enabled = false;
    tb.Text = "|";
}

所以,现在我使用 LINQ 来获取这样的全白文本框:

IEnumerable<TextBox> FreeItems = frm.Controls.OfType<TextBox>().Where(I => I.BackColor != Color.Black);

我怎样才能得到那些白色且它们的X位置差异不超过20的物品!

4

2 回答 2

2

试试下面的例子

private void findConsecutive()
{

    var vertical = (from Control cnt in pnlCrossWord.Controls
                    where (cnt.GetType().Name.Equals("TextBox")) && (!cnt.BackColor.Equals(Color.Black))
                    orderby cnt.Top
                    select cnt.Top).Distinct().ToArray();
    var horizontal = (from Control cnt in pnlCrossWord.Controls
                    where (cnt.GetType().Name.Equals("TextBox")) && (!cnt.BackColor.Equals(Color.Black))
                    orderby cnt.Left
                      select cnt.Left).Distinct().ToArray();

    List<int> vList = new List<int>();
    int iIndex = 0;

    foreach (int top in vertical)
    {
        vList.Add(0);
        int vIndex = 0;
        int iConsecutive = 0;
        int iLastLeft = -1;
        var Item = (from Control cnt in pnlCrossWord.Controls
                    where (cnt.GetType().Name.Equals("TextBox")) && (!cnt.BackColor.Equals(Color.Black))
                    && (cnt.Top.Equals(top))
                    select (TextBox)cnt).ToArray();
        foreach (TextBox txt in Item)
        {
            if ((iLastLeft + txt.Width) < txt.Left && iLastLeft > -1)
            {
                if (iConsecutive > vList[iIndex])
                    vList[iIndex] = iConsecutive;

                iConsecutive = 0;
            }

            iConsecutive++;

            iLastLeft = txt.Left;
            vIndex++;
        }
        if (iConsecutive > vList[iIndex])
            vList[iIndex] = iConsecutive;
        iIndex++;
    }

    int MaxConsicutiveIndex = vList.IndexOf(vList.Max());           
}

已编辑 上面的代码将检索水平线中最大连续白框的线索引。

于 2014-06-14T06:32:46.273 回答
0

您将需要一个允许您动态排列单元格的布局容器。一张桌子应该可以工作。

对于每个单元格,将 x,y 位置存储在 tag 属性中。

当用户单击特定单元格时,很容易编写一个方法,为您提供同一行中的单元格或文本框的集合。或者,如果您想在单击按钮后找到答案,则必须遍历所有行。

这应该让你有一个好地方来完成其余的工作。

于 2014-06-14T06:16:17.770 回答