Мне нужна помощь в группировке слов из списка в подсписки на языке Си#
Я создаю игру палача с различными режимами. Злой режим требует, чтобы слова были сгруппированы в соответствии с образцами. (Ссылка на описание злого палача: Злой Палач[^] )
Я думаю, что шаблоны генерируются правильно, но я не могу заставить слова группироваться в соответствии с их шаблонами. Проблема заключается где-то в последних двух функциях, которые называются groupwords и largestlist. Вот мой код:
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HangMan { public partial class Form3 : frmNormal { protected string[] wordbank; private int counter = 0; //protected ArrayList patterns = new ArrayList(); List<string> patterns = new List<string>(); public Form3() { InitializeComponent(); } private void Form3_Load(object sender, EventArgs e) { words(); chooseword(); generatelist(); } private void generatelist() { wordbank = new string[allWords.Length]; for (int i=0; i<allWords.Length; i++) { if (allWords[i].Length==currentWord.Length) { wordbank[counter] = allWords[i]; counter++; } } } public override void check(char choice, char[] find, char[] temp) { allpatterns(choice,find,temp); groupwords(choice,find,temp); } public override void btn_Click(object sender, EventArgs e) { base.btn_Click(sender, e); } public string pattern(string word, char choice, char[] find, char[] temp) { if (word.Contains(choice)) { for (int i = 0; i < find.Length; i++) { if (find[i] == choice) { temp[i] = choice; } } copyWord = new string(temp); return copyWord; } else { return copyWord; } } public void allpatterns(char choice, char[] find, char[] temp) { for (int i=0; i<counter; i++) { string p = pattern(wordbank[i], choice, find, temp); if (patterns.Contains(p)) { //do nothing } else { patterns.Add(p); } } } public void groupwords (char choice, char[] find, char[] temp) { /*ArrayList[] groupedwords = new ArrayList[patterns.Count]; for (int i=0; i<patterns.Count; i++) { groupedwords[i] = new ArrayList(); }*/ List<List<string>> groupedwords = new List<List<string>>(); //List<string> subgroup = new List<string>(); for (int i=0; i<patterns.Count; i++) { groupedwords.Add(new List<string>()); } for (int i=0; i<counter; i++) { string word = wordbank[i]; string p = pattern(word, choice, find, temp); int index = patterns.IndexOf(p); groupedwords[index].Add(word); } largestlist(groupedwords,choice,find,temp); } private void largestlist (List<List<string>> groupedwords, char choice, char[] find, char[] temp) { for (int i=1; i<patterns.Count; i++) { int size = groupedwords[0].Count(); int size2 = groupedwords[i].Count(); if (size<size2) { groupedwords[0] = groupedwords[i]; } } /*for (int i=0; i<patterns.Count; i++) { for (int j=0; j<groupedwords[i].Count; j++) { groupedwords[i].RemoveAt(j); } } int size = groupedwords[0].Count; copyWord = ""; for (int i=0; i<size; i++) { copyWord += "_"; }*/ copyWord = groupedwords[0].ToString(); display(); if(!groupedwords[0].Contains(choice.ToString())) { wrong++; } result(); int random = (new Random()).Next(wordbank.Length); currentWord = allWords[random]; allpatterns(choice,find,temp); groupwords(choice, find, temp); } } }
Что я уже пробовал:
Я пробовал создавать вложенные списки и arraylist, хотя и не уверен, что моя реализация верна. Пожалуйста, предложите простой способ сделать это. Я новичок в Visual Studio и C#, поэтому, пожалуйста, объясните свои решения в самых простых терминах. Спасибо!
Patrice T
Сколько у тебя слов ?
Зачем вообще нужны вложенные списки, что вы с ними делаете ?
BillWoodruff
Если вы изучите ссылку на "злого палача", вы поймете, почему.
Patrice T
Это то, что я сделал, и я не вижу использования вложенных списков.
Для меня это выглядит как большая работа, но не очень полезная.
BillWoodruff
Когда в этом документе используется термин "ассоциативные массивы", это переводится в C# как "словарь". Является ли словарь "вложенным" ? Не для меня, если только типы ключей или значений не являются другими словарями. Ниже приведен пример кода.
BillWoodruff
Хорошо, опишите, что происходит сейчас, когда вы запускаете свой код. Ошибки ? Неожиданные результаты ? Быть конкретными.
Member 13835659
When I run the code and click the button of a letter, the message box shows up saying that I lost and gives me the correct word. The word that the message box displays does not have the same length as the word generated (I know this because the number of dashes doesn't match the number of letters in the supposedly correct word). Also, the hangman image updates displaying the whole man when the message box shows up after one guess. And the text in the label that displays the dashes for the word shows the following message every time "System.Collections.Generic.List'1[System.String". In addition to all of this, the program also stops working; I can't click on anything nor can I close it.
BillWoodruff
Мне кажется, что вам нужно переписать это, и я бы предположил, что вам нужно научиться отлаживать. Если вы используете словарь<int, список<string>> структура, которую я показываю в своем ответе: все будет намного проще.
Помните, мы не можем читать ваши мысли. Старайтесь задавать очень конкретные вопросы, сопровождаемые соответствующим кодом.
BillWoodruff
Я добавил короткий пример кода к своему решению ниже, чтобы показать, как легко "быть злым", сократив рабочий список до слов необходимой длины, как догадывается пользователь.