public Rap Generate(int verseCount) { Random rand = new Random(); int rhymeCount = rand.Next(MinRhymes, MaxRhymes); // Generates a list of random verses to the specified verse_count List <string> verses = new List <string>(verseCount); for (int i = 0; i < verseCount; i++) { verses.Add(Templates.ElementAt(rand.Next(Templates.Count))); } List <string> rhymes = new List <string>(); bool baseHit = false; string baseWord = null; string baseType = null; for (int i = 0; i < verseCount; ++i) { string verse = verses.ElementAt(i); List <string> verseWords = verse.Split(' ').ToList(); for (int j = 0; j < verseWords.Count(); ++j) { string word = verseWords.ElementAt(j); if (!baseHit && (word.ElementAt(0) == '<')) { int endIndex = word.IndexOf('>'); baseType = word.Substring(1, endIndex - 1); baseWord = GetBaseWord(baseType); rhymes.Add(baseWord.ToLower()); verseWords[j] = baseWord; // Preserve comma if (word.Contains(',')) { verseWords[j] += ','; } rhymeCount = rand.Next(MinRhymes, MaxRhymes); baseHit = true; } else if (baseHit && (word.ElementAt(0) == '<')) { int endIndex = word.IndexOf('>'); WordType wordType; baseType = word.Substring(1, endIndex - 1); switch (baseType) { case "noun": wordType = WordType.Noun; break; case "adjective": wordType = WordType.Adjective; break; case "verb": wordType = WordType.Verb; break; default: wordType = WordType.Any; break; } string rhyme = null; rhyme = m_RhymeGenerator.GetRhyme(baseWord, wordType); rhymes.Add(rhyme.ToLower()); rhymeCount--; verseWords[j] = rhyme; // Preserve comma if (word.Contains(',')) { verseWords[j] += ','; } } if (rhymeCount < 2) { rhymeCount = rand.Next(MinRhymes, MaxRhymes); baseHit = false; } } // Join the words back into a verse verse = verseWords.Aggregate((a, b) => (a + ' ' + b)); // Make the entire thing lowercase verse = verse.ToLower(); // Make the first letter uppercase verse = char.ToUpper(verse[0]) + verse.Substring(1); // Replace the original verse with the phire one verses[i] = verse; } Rap rap = new Rap { Verses = verses, Rhymes = rhymes }; return(rap); }