public Word ConstructWord(Random rng) { Word word = new Word(); /* * int syllableCount = WordLengths.SelectRandom(); * * if (syllableCount == 1) * { * Syllable syllable = new Syllable(); * int attempts = 0; * do * { * syllable.Clear(); * syllable = ConstructSyllable(rng, true, true); * attempts++; * } * while (syllable.Count < 2 && attempts < 10); * word.Add(syllable); * } * else * { * for (int i = 1; i <= syllableCount; i++) * { * Syllable syllable = ConstructSyllable(rng, (i == 1), (i == syllableCount)); * * if (syllable.Count > 0) * word.Add(syllable); * } * } */ int length = WordLengths.SelectRandom(); bool isFirst = true; do { Syllable final = ConstructSyllable(rng, isFirst, true); if (word.TotalLength + final.Count >= length) { word.Add(final); } else { Syllable nonFinal = ConstructSyllable(rng, isFirst, false); word.Add(nonFinal); } isFirst = false; }while (word.TotalLength < length); return(word);// RemoveForbiddenElements(word); }
private Syllable ConstructSyllable(Random rng, bool isInitial, bool isFinal) { Syllable syllable = new Syllable(); if (isInitial) { if (rng.NextDouble() < WordInitialOnsetChance) { syllable.Add(Onsets.SelectRandom()); } } else { if (rng.NextDouble() < WordMedialOnsetChance) { syllable.Add(Onsets.SelectRandom()); } } if (rng.NextDouble() < NucleusChance) { syllable.Add(Nuclei.SelectRandom()); } if (isFinal) { if (rng.NextDouble() < WordFinalCodaChance) { syllable.Add(Codae.SelectRandom()); } } else { if (rng.NextDouble() < WordMedialCodaChance) { syllable.Add(Codae.SelectRandom()); } } return(syllable); }