如何在WPF中创建填字游戏?

9
我创建了一个10 x 10的文本框,用户应该在相应的文本框中输入单词的位置。然后我将所有内容保存到一个文本文件中,格式如下:
然后,在WPF方面,我读取文本文件并在面板中填充文本框,但问题是纵横填字游戏有垂直和水平的提示,这些提示会指导你找到答案,每个提示都有一个数字来表示哪个提示是哪个。然而,我想不到一种方法来将数字拼图编号与垂直和水平编号链接起来。现在它看起来像这样:
请注意旁边的数字(我在画图中编辑了它们以可视化我想要的东西),我需要显示那些数字。
在我的数据库中,我在一个表中存储文件的位置,在另一个表中存储提示和答案,格式如下:
这是提示(水平和垂直)和答案:
我正在使用Entity Framework Lambda表达式来检索水平和垂直线索。
感谢任何帮助将数字分配给来自拼图的水平线索和垂直线索。
这是用于显示拼图的代码:
  protected void Across()
    {
        IList<ModelSQL.puzzlecontent> lstAcross = daoPuzzleContent.GetAcross();

        foreach (ModelSQL.puzzlecontent lista in lstAcross)
        {
            Label tbA = new Label();
            tbA.Content = lista.Hint;
            tbA.Width = Double.NaN;
            tbA.BorderBrush = Brushes.CadetBlue;
            tbA.BorderThickness = new Thickness(2);
            stackPanel1.Width = Double.NaN;
            stackPanel1.Children.Add(tbA);
            words.Add(lista.Answer);

        }
    }

    protected void AddPuzzle()
    {
        // foldername of the txt file.
        //  using (StreamReader reader = File.OpenText((@daoWordPuzzle.GetfileURL())))
        string[] fileData = File.ReadAllLines(@"C:\Users\apr13mpsip\Desktop\OneOrganizer\OneOrganizer\WordPuzzle\educational.txt");

        string[] lineValues;

        int row = 0;
        int col;
        int hint = 1;

        string[][] rowcol = new string[fileData.Length][];

        foreach (string line in fileData)
        {
            lineValues = line.Split(new string[] { "," }, StringSplitOptions.None);


            rowcol[row] = new string[lineValues.Length];

            col = 0;

            foreach (string value in lineValues)
            {
                rowcol[row][col] = value;
                col++;
            }
            row++;

        }


        for (int i = 0; i < rowcol.GetLength(0) ; i++)
        {
            for (int j = 0; j < rowcol[i].GetLength(0) ; j++)
            {


                int iadd =  i+1 < rowcol.GetLength(0) ? i+1 : 100;
                int iminus = i-1 >= 0 ? i-1 : 100;
                int jadd =  j+1 < rowcol.GetLength(0) ? j+1 : 100;
                int jminus = j-1 >= 0 ? j-1 : 100;
                var self = rowcol[i][j]; // current value

                var top = iminus == 100 ? "" : rowcol[iminus][j];
                var bottom = iadd == 100 ? "" : rowcol[iadd][j];
                var left = jminus == 100 ? "" : rowcol[i][jminus];
                var right = jadd == 100 ? "" : rowcol[i][jadd];

                //ACROSS HORIZONTAL
                if (
                    (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(top) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(top) && String.IsNullOrEmpty(left))
                  )
                {
                    wordAcross = "";
                    for (int k = 0; k < 10; k++)
                    {
                        wordAcross += rowcol[i][k];
                        if (k == 9)
                        {
                            puzzlewordAcross.Add(wordAcross);
                            // print hello and live
                        }
                    }

                }

                //DOWN VERTICAL
                if (
                     (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(left)) ||
                     (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(left)) ||
                     (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(left))
                    )
                {

                    wordDown = "";
                    for (int k = 0; k < 10; k++)
                    {
                        wordDown += rowcol[k][j];
                        if (k == 9)
                        {
                            puzzlewordDown.Add(wordDown);
                            // print holy and leducated 
                        }


                    }
                }

                //Check Top , Left , Bottom , Right value.                      
                if (
                    (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                    (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left))

                   )
                {

                    TextBox tbox = new TextBox();
                    tbox.Height = 50;
                    tbox.Width = 50;
                    tbox.Text = hint.ToString();
                    wrapPanel1.Children.Add(tbox);



                    tbox.GotFocus += (source, e) =>
                    {
                        if (!string.IsNullOrEmpty(tbox.Text))
                        {
                            string Str = tbox.Text.Trim();
                            double Num;
                            bool isNum = double.TryParse(Str, out Num);
                            if (isNum)
                                tbox.Text = "";
                        }
                        else
                        {
                            tbox.Text = "";
                        }

                    };

                    hint++;
                }
                else
                {
                    TextBox tbox2 = new TextBox();
                    tbox2.Height = 50;
                    tbox2.Width = 50;
                    if (String.IsNullOrEmpty(self))
                    {
                        tbox2.Background = Brushes.Black;
                        tbox2.Focusable = false;
                    }
                    wrapPanel1.Children.Add(tbox2);
                }// end of top bottom left right.

            }


        }
    } // End of AddPuzzle()

显示 Across 和 Down 的代码:

    protected void Down()
    {
        IList<ModelSQL.puzzlecontent> lstDown = daoPuzzleContent.GetDown();

        foreach (ModelSQL.puzzlecontent listd in lstDown)
        {
            Label tbD = new Label();
            tbD.Content = listd.Hint;
            tbD.Width = Double.NaN;
            tbD.BorderBrush = Brushes.CadetBlue;
            tbD.BorderThickness = new Thickness(2);
            stackPanel2.Width = Double.NaN;
            stackPanel2.Children.Add(tbD);


        }
    }

    protected void Across()
    {
        IList<ModelSQL.puzzlecontent> lstAcross = daoPuzzleContent.GetAcross();

        foreach (ModelSQL.puzzlecontent lista in lstAcross)
        {
            Label tbA = new Label();
            tbA.Content = lista.Hint;
            tbA.Width = Double.NaN;
            tbA.BorderBrush = Brushes.CadetBlue;
            tbA.BorderThickness = new Thickness(2);
            stackPanel1.Width = Double.NaN;
            stackPanel1.Children.Add(tbA);
            words.Add(lista.Answer);

        }
    }

我不确定您的问题是什么 - 是将Down / Across提示链接到特定的文本框吗?还是在文本框中编写提示号码?此外,您是否同时将答案存储在文本文件和数据库中,还是只有文本文件用于创建纵横填字游戏的初始阶段? - Lars Kristensen
@Sheridan 不,它需要与拼图中的位置相关。 - user2376998
现在我有点困惑...你是想知道如何将小数字(带有弹出式“工具提示”中的线索)添加到文本框中吗? - Sheridan
2
这些点赞是给“哦,酷,一个填字游戏”还是给“好问题”?因为我认为这不是一个好问题。你能否编辑你的问题,重述你实际需要帮助的部分? - CodeCaster
@Sheridan,我是指如何找出哪些线索属于哪个数字,你可以从我的数据库图片中看到。因为现在,在我的数据库中,线索已经与答案绑定在一起了,所以当我在Across/Down中查看线索时,它们将会有一个数字与之对应,作为谜题的位置编号。在我的代码中,我可以打印出答案。抱歉我的英语不好。 - user2376998
显示剩余8条评论
1个回答

1
你可能需要重新定义数据模型,因为我认为你在第一个障碍 - 系统分析中失败了。当我们只想编写代码时,它会让我们所有人都受到影响,这通常意味着要进行大规模的重构。
在这里考虑你的领域。填字游戏。如果我们读一份报纸上的填字游戏,而你不知道某个线索的答案,当你向朋友询问时,你会说什么。
“6个字母,提示是'blah blah'”
然后加上你已经知道的任何字母。
现在我们知道,这个谜题需要知道每个答案有多少个字母,每个答案都需要一个提示。我们还知道,字母是隐藏的,直到你填写它们,但是我们在某些时候需要知道正确的答案。
谜题在报纸背面如何呈现?提示不是写成1、2、3等等。它们是“垂直4”、“水平1”等等。现在我们知道需要存储一些位置数据。
你可以通过两种方式实现此目的。 1. 每个提示都作为自己的条目完整地存在 提示“1” 方向“横向” 位置“1,1” 答案“Hello” 描述“问候语”
从输入中计算网格大小,并相应地定位字母。 优点:易于使用。所有信息都在一个地方 缺点:可能存在数据损坏。此方法可以在同一位置定义2个不同的字母。
2. 将条目分开,但在网格中回答文本
这与您现在拥有的方式非常相似,但是您将文本分成CSV网格,如您在第一个屏幕截图中演示的那样。然后,您需要为提示设置条目,就像在方法1中一样,但省略“答案”字段。
您的代码将需要: 1. 计算网格大小 2. 填充网格 3. 填充提示列表 4. 将用户输入转换为CSV文本文件,以便您可以根据答案验证输入并告诉用户是否正确 5. 关于将提示链接到条目文本框。使用每个文本框的Tooltip属性设置包含字母的提示描述,以说明他们是否正确。
最后,(这可能是你想要的部分),在输入文本框中添加正确的数字,你需要利用WPF的布局管道。不要仅仅将文本框放在网格中,而是将另一个网格放入其中!我将向您展示XAML中应该如何显示,但您可能希望在代码中生成它。
<Grid>
  <TextBlock x:Name="TextBlock_NumberLabel"/>
  <TextBox x:Name="TextBox_LetterEntry"/>
<Grid>

在您想要数字的任何方格中,使用它来代替普通文本框。

CSV的意思是“逗号分隔值”。它是用于表格数据的格式,而您已经在使用它。第3项说明您需要显示一个带有数字的线索列表,您的代码需要使用数据构建该列表。 - Gusdor
1
此外,如果代码能够正常运行,那么就没有错误的答案。但是理解现有问题的解决方案(例如报纸上的填字游戏)可以帮助您设计代码。这涉及抽象和分解——面向对象设计的关键方法。 - Gusdor
我的问题是将拼图中的位置编号附加到横向/竖向提示中。 - user2376998
“Attach”是什么意思?我们是在讨论显示还是在代码中引用?如果是显示方面,我已经回答过了。 - Gusdor
我已经解决了,等我整理好代码后就会发布答案。 - user2376998
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接