所以我在c#中创建了一个非常简单的单词生成器程序,效果相对较好。它根据用户定义的长度生成一个单词。
算法为序列中的每个连续字母添加辅音然后是元音,这不是理想的,但对于基本单词效果很好。
我唯一的问题是,如果“q”出现在它之前,我告诉它在字母序列中添加一个“u”,但无论我做了什么,它都会使该字至少有一个字母太长
我在上面的评论中用星号标记了我的问题区域。这是代码:
public void WordFinder()
{
string word = null;
int cons;
int vow;
//counter
int i = 0;
bool isword = false;
Random rnd = new Random();
//set a new string array of consonants
string[] consonant = new string[]{"b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"};
//set a new string array of vowels
string[] vowel = new string[]{"a","e","i","o","u"};
while (isword == false)
{
word = null;
Console.WriteLine("Pick the length of a word");
int num = Convert.ToInt32(Console.ReadLine());
//set the counter "i" to 1
i = 1;
if (num%2 == 0)
{
while (i <= num)
{
if (num != 1)
{
// current consonant = random consonant
cons = rnd.Next(0, 20);
// get the consonant from the string array "consonant" and add it to word
word = word + consonant[cons];
// add 1 to counter
i ++;
//* if the consonant is "q"
if (cons == 12)
{
// add "u" right after it
word = word + vowel[4];
// add 1 to counter
i++;
}
}
vow = rnd.Next(0, 4);
word = word + vowel[vow];
i ++;
}
}
if (num % 2 != 0)
{
while (i <= num - 1)
{
//repeat same code as done to even length
if (num != 1)
{
cons = rnd.Next(0, 20);
word = word + consonant[cons];
i ++;
if (cons == 12)
{
word = word + vowel[4];
i ++;
}
}
vow = rnd.Next(0, 4);
word = word + vowel[vow];
i ++;
}
// if the length is not equal to 1
if (num != 1)
{
// add a consonant to the end of the word
cons = rnd.Next(0, 20);
word = word + consonant[cons];
}
//if the length is 1
else if (num == 1)
{
// pick a vowel
vow = rnd.Next(0, 4);
word = word + vowel[vow];
}
}
i = 1;
Console.WriteLine(word);
Console.WriteLine("Is this a word? (y/n)");
string q = Console.ReadLine();
q = q.ToLower();
//if the answer is yes, then it is a word and end the loop
if (q == "y" || q == "yes")
{
isword = true;
}
//if the answer is no try the loop again
else if (q == "n" || q == "no")
{
isword = false;
}
}
}
// main method
static void Main(string[] args)
{
Program prog = new Program();
prog.WordFinder();
//wait for user input
Console.ReadLine();
}
}
答案 0 :(得分:11)
我重构了你的答案,经过一些调试我得到了它的工作。对不起,我不能只是做一个调整来解决它。我相信它不允许一个单词以“qu”或“q”结尾。
public void WordFinder()
{
bool isWord = false;
Random rnd = new Random();
string[] consonants = { "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z" };
string[] vowels = { "a", "e", "i", "o", "u" };
while (isWord == false)
{
string word = "";
Console.WriteLine("Pick the length of a word");
int requestedLength = Convert.ToInt32(Console.ReadLine());
// Generate the word in consonant / vowel pairs
while (word.Length < requestedLength)
{
if (requestedLength != 1)
{
// Add the consonant
string consonant = GetRandomLetter(rnd, consonants);
if (consonant == "q" && word.Length + 3 <= requestedLength) // check +3 because we'd add 3 characters in this case, the "qu" and the vowel. Change 3 to 2 to allow words that end in "qu"
{
word += "qu";
}
else
{
while( consonant == "q")
{
// Replace an orphaned "q"
consonant = GetRandomLetter(rnd, consonants);
}
if (word.Length + 1 <= requestedLength)
{
// Only add a consonant if there's enough room remaining
word += consonant;
}
}
}
if (word.Length + 1 <= requestedLength)
{
// Only add a vowel if there's enough room remaining
word += GetRandomLetter(rnd, vowels);
}
}
Console.WriteLine(word);
Console.WriteLine("Is this a word? (y/n)");
string q = Console.ReadLine().ToLower();
if (q == "y" || q == "yes")
{
isWord = true;
}
}
}
private static string GetRandomLetter(Random rnd, string[] letters)
{
return letters[rnd.Next(0, letters.Length - 1)];
}
编辑:但是,这仍然非常不守规矩。如何生成随机字符串,然后在完成后用“qu”替换“q”?
public string WordFinder2(int requestedLength)
{
Random rnd = new Random();
string[] consonants = { "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z" };
string[] vowels = { "a", "e", "i", "o", "u" };
string word = "";
if (requestedLength == 1)
{
word = GetRandomLetter(rnd, vowels);
}
else
{
for (int i = 0; i < requestedLength; i+=2)
{
word += GetRandomLetter(rnd, consonants) + GetRandomLetter(rnd, vowels);
}
word = word.Replace("q", "qu").Substring(0, requestedLength); // We may generate a string longer than requested length, but it doesn't matter if cut off the excess.
}
return word;
}
private static string GetRandomLetter(Random rnd, string[] letters)
{
return letters[rnd.Next(0, letters.Length - 1)];
}
答案 1 :(得分:1)
由于你构建循环的方式,你的问题正在发生。
你使用两个独立的循环,取决于长度是偶数还是奇数,并假设每个循环将添加两个字符。但是,当遇到Q时,循环会添加3个字符,这会导致循环再执行一次,最后会有一个额外的字符。
试试这个方法:
string GenerateWord(int length)
{
if (length < 1) // do not allow words of zero length
throw new ArgumentException("Length must be greater than 0");
string word = string.Empty;
if (rand.Next() % 2 == 0) // randomly choose a vowel or consonant to start the word
word += cons[rand.Next(0, 20)];
else
word += vowel[rand.Next(0, 4)];
for (int i = 1; i < length; i += 2) // the counter starts at 1 to account for the initial letter
{ // and increments by two since we append two characters per pass
char c = cons[rand.Next(0, 20)];
char v = vowel[rand.Next(0, 4)];
if (c == 'q') // append qu if the random consonant is a q
word += "qu";
else // otherwise just append a random consant and vowel
word += c + v;
}
// the word may be short a letter because of the way the for loop above is constructed
if (word.Length < length) // we'll just append a random consonant if that's the case
word += cons[rand.Next(0, 20)];
return word;
}
答案 2 :(得分:0)
我做的比较小,因为我受到了这篇文章的启发。 我在C#上还很新
{
class MainClass
{
public static void Main(string[] args)
{
string[] consonants = new string[] { "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z" };
string[] vowels = new string[] { "a", "e", "i", "o", "u", "y", "ee", "aa","ij", "oe" };
while (true)
{
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("");
Console.Write("Length word: ");
int Length = Convert.ToInt32(Console.ReadLine());
Random rnd = new Random();
int a;
int goal = Length;
for (int i = 0; i != goal; i++)
{
a = rnd.Next(1, consonants.Length);
if (i % 2 == 0)
{
a = rnd.Next(1, consonants.Length);
Console.Write(consonants[a]);
}
Thread.Sleep(10);
if (i % 2 != 0)
{
a = rnd.Next(1, vowels.Length);
Console.Write(vowels[a]);
}
Thread.Sleep(200);
}
}
}
}
}