Exemple #1
0
        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);
        }