解决  嗨,大家好,目前正在做一个猜谜游戏,需要一些有关我的代码的帮助。

袜子1992

知名会员
已加入
2020年5月20日
留言内容
55
编程经验
Beginner
目前,仅当用户输入与迭代中的指定字母匹配时,程序才会显示字母。

我想做的是显示一个字母,尽管用户正在进行什么迭代。如果用户输入"P"在第一次迭代中,我希望程序显示所有P" in happy.

谢谢!


C#:
 {
           
            string[] secret = { "h", "a", "p", "p", "y" };
            string[] hidden = { "_", "_", "_", "_", "_" };
            string letter = "";

            Console.WriteLine("Welcome to guess a word game");

            for (int i = 0; i < secret.Length; i++)
            {            
                Console.WriteLine("Guess a letter: ");
                letter = Console.ReadLine();

                //revealing letters
                if (secret[i]  == letter)
                {
                    hidden[i] = letter;
                }
                //displaying the word to the user after each guess
                foreach (string k in hidden)
                {
                    Console.Write(k.ToString());                  
                }
                Console.WriteLine();
            }
            Console.WriteLine();
         
            // once broken out of the for loop it will inform the user if they have guessed the word correctly.
            if(secret == hidden)
            {
                Console.WriteLine("You have guessed the correct word!");
            }
            else
            {
                Console.WriteLine("unfortunately you have not gussed the correct word");
            }
            Console.ReadLine();
        }
    }
}
 
Solution
我对您的代码进行了一些更改。我添加了以下变量:
C#:
            int DuplicateCount = secret.GroupBy(value => value).Where(value => value.Count() > 1).Sum(value => value.Count());
            string letter = "";
            int Loop = 0;
DuplicateCount为您提供重复字母的计数。

我还添加了一个无限循环,当循环变量等于您的秘密长度时,该循环将退出。
C#:
            Console.WriteLine("Welcome to guess a word game");
            while (true)
            {
                Loop++;
                Console.WriteLine("Guess a letter: ");
                letter = Console.ReadLine();
                Console.WriteLine();
                if...

龙4ik

会员
已加入
2020年10月24日
留言内容
16
编程经验
Beginner
也许可以解决:
C#:
for(int i=0;i<secret.Length;i++)
{
    //TODO:
}

//Just take out foreach block from th loop
//displaying the word to the user after each guess
foreach (string k in hidden)
{
Console.Write(k.ToString());                 
}
Console.WriteLine();

//TODO:
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,917
位置
英国
编程经验
10+
怎么样?请说明您的解决方案。

为什么要在已经是字符串的对象上调用string?那是多余的代码...
 

袜子1992

知名会员
已加入
2020年5月20日
留言内容
55
编程经验
Beginner
怎么样?请说明您的解决方案。

为什么要在已经是字符串的对象上调用string?那是多余的代码...
**为什么要在已经是字符串的对象上调用string?那是多余的代码... **-我的错误,我现在在程序中更改了它。

我已经在上面回答了,如果用户输入的是秘密单词中的字母"Happy",尽管for循环正在进行,但我希望我的程序显示该字母。

例如如果我在for循环的第一次迭代中,然后输入"P",然后我希望该程序显示"_ _PP_".

我不想等到第3次和第4次迭代才能显示这两个字母。

抱歉,我是一个完整的初学者
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,469
位置
弗吉尼亚州切萨皮克
编程经验
10+
问题是您将猜测数字与字母索引联系在一起吗?如果将代码构造为以下伪代码,则时间会更轻松:
C#:
For each letter in secret
    Add maskedLetter to mask

For guessNumber = 1 to secret.Length
{
    Get guess
    For each letter in secret
        If letter matched guess
            Unmask the letter in the mask
    For each maskedLetter in mask
        Display maskedLetter
}
 

袜子1992

知名会员
已加入
2020年5月20日
留言内容
55
编程经验
Beginner
问题是您将猜测数字与字母索引联系在一起吗?如果将代码构造为以下伪代码,则时间会更轻松:
C#:
For each letter in secret
    Add maskedLetter to mask

For guessNumber = 1 to secret.Length
{
    Get guess
    For each letter in secret
        If letter matched guess
            Unmask the letter in the mask
    For each maskedLetter in mask
        Display maskedLetter
}
谢谢!  :D
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,917
位置
英国
编程经验
10+
我对您的代码进行了一些更改。我添加了以下变量:
C#:
            int DuplicateCount = secret.GroupBy(value => value).Where(value => value.Count() > 1).Sum(value => value.Count());
            string letter = "";
            int Loop = 0;
DuplicateCount为您提供重复字母的计数。

我还添加了一个无限循环,当循环变量等于您的秘密长度时,该循环将退出。
C#:
            Console.WriteLine("Welcome to guess a word game");
            while (true)
            {
                Loop++;
                Console.WriteLine("Guess a letter: ");
                letter = Console.ReadLine();
                Console.WriteLine();
                if (DuplicateCount <= 1 && secret.Contains(letter))
                {
                    int position =  数组 .IndexOf(secret, letter);
                    if (position >= 0)
                    {
                        hidden[position] = letter;
                        Console.WriteLine($"Uncovering Secret Word : { string.Join(" ", hidden[0], hidden[1], hidden[2], hidden[3], hidden[4]) }");
                    }
                    if (Loop == secret.Length)
                    {
                        break;
                    }
                }
                else if (DuplicateCount >= 1 && secret.Distinct().Count() < secret.Length && secret.Contains(letter))
                {
                    /* This gives you an IGrouping interface carrying the key of the duplicate letter. This is not needed. I just added it in case you wanted to use it.  */
                    IGrouping<string, string>[] DuplicateValues = secret.GroupBy(value => value).Where(value => value.Count() > 1).ToArray();
                    for (int i = 0; i < secret.Length; i++)
                    {
                        if (secret[i] == letter)
                        {
                            hidden[i] = letter;
                        }
                    }
                    Console.WriteLine($"Uncovering Secret Word : { string.Join(" ", hidden[0], hidden[1], hidden[2], hidden[3], hidden[4]) }");
                }
                if (!hidden.Contains("_"))
                    break;
            }
            Console.WriteLine();
以前这就是您比较字符串数组的方式:
C#:
            // once broken out of the for loop it will inform the user if they have guessed the word correctly.
            if(secret == hidden)
您应该使用的是Enumerable.SequenceEqual- Enumerable.SequenceEqual方法(System.Linq) 是的,这些可以在数组上使用:
C#:
            // once broken out of the for loop it will inform the user if they have guessed the word correctly.
            // I have made this change to properly compare two arrays. The way you were doing it was not appropriate. Use Enumerable.SequenceEqual instead.
            if (Enumerable.SequenceEqual(secret, hidden))
            {
                Console.WriteLine("You have guessed the correct word!");
            }
            else
            {
                Console.WriteLine("unfortunately you have not gussed the correct word");
            }
            Console.ReadLine();
这是运行中的应用程序的屏幕截图:

屏幕截图_32.jpg

完成的代码:
Finished Code:
        static void Main(string[] args)
        {
            string[] secret = { "h", "a", "p", "p", "y" };
            string[] hidden = { "_", "_", "_", "_", "_" };
            /* This gives you the count of Duplicate letters. */
            int DuplicateCount = secret.GroupBy(value => value).Where(value => value.Count() > 1).Sum(value => value.Count());
            string letter = "";
            int Loop = 0;
            Console.WriteLine("Welcome to guess a word game");
            while (true)
            {
                Loop++;
                Console.WriteLine("Guess a letter: ");
                letter = Console.ReadLine();
                if (DuplicateCount <= 1 && secret.Contains(letter))
                {
                    int position =  数组 .IndexOf(secret, letter);
                    if (position >= 0)
                    {
                        hidden[position] = letter;
                        Console.WriteLine($"Uncovering Secret Word : { string.Join(" ", hidden[0], hidden[1], hidden[2], hidden[3], hidden[4]) }");
                    }
                    if (Loop == secret.Length)
                    {
                        break;
                    }
                }
                else if (DuplicateCount >= 1 && secret.Distinct().Count() < secret.Length && secret.Contains(letter))
                {
                    /* This gives you an IGrouping interface carrying the key of the duplicate letter. This is not needed. I just added it in case you wanted to use it.  */
                    IGrouping<string, string>[] DuplicateValues = secret.GroupBy(value => value).Where(value => value.Count() > 1).ToArray();
                    for (int i = 0; i < secret.Length; i++)
                    {
                        if (secret[i] == letter)
                        {
                            hidden[i] = letter;
                        }
                    }
                    Console.WriteLine($"Uncovering Secret Word : { string.Join(" ", hidden[0], hidden[1], hidden[2], hidden[3], hidden[4]) }");
                }
                if (!hidden.Contains("_"))
                    break;
            }
            Console.WriteLine();

            // once broken out of the for loop it will inform the user if they have guessed the word correctly.
            // I have made this change to properly compare two arrays. The way you were doing it was not appropriate. Use Enumerable.SequenceEqual instead.
            if (Enumerable.SequenceEqual(secret, hidden))
            {
                Console.WriteLine("You have guessed the correct word!");
            }
            else
            {
                Console.WriteLine("unfortunately you have not gussed the correct word");
            }
            Console.ReadLine();
        }
这里有很多可供额外检查和做家务的空间。但是它可以满足您的要求,并且效果很好。

Of course, it can also be simplified with some minor adjustments. 快乐 programming.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,917
位置
英国
编程经验
10+
别客气。没什么特别的,只花了两分钟就写了。您可以自己进行改进。

快乐 to help.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,469
位置
弗吉尼亚州切萨皮克
编程经验
10+
使用#7中的代码,打破无限循环的唯一方法是用户正确猜出单词。因此,在无限循环之后,无需检查两个数组的值是否相等。只需声明用户已正确猜出该词即可。

现在,另一方面,如果用户的猜测数量有限,则无限循环不是合适的循环结构,您将需要保留检查两个数组值是否相等并声明是否等于整数的代码。用户正确猜出了这个词。

就个人而言,我认为如果使用更合适的数据结构而不是字符串数组,事情将会得到简化,但是OP可能仍在学习曲线上,而他的学校课程还没有涵盖其他选择。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,917
位置
英国
编程经验
10+
因此,在无限循环之后,无需检查两个数组的值是否相等。
最初不是我的代码。而且这不是我要做的事情。这就是我用来使示例正常工作的原因,而无需对OP的源代码进行很多更改。
现在,另一方面,如果用户的猜测数量有限,则无限循环不是合适的循环结构
我写的不是完美的,我不会尝试的。最好给OP一个工作文件,要求他们进行自己的编辑和自己的整理工作。阅读原始请求后,它从未说过尝试X次。而且,如果他们想做的话,可以通过将其实现到他们的代码中来轻松摆脱循环。

The OP was previously comparing arrays inappropriately with : if(secret == hidden) which is why I left that check in place for the purpose of the example, to show them how they should compare them instead.

我并非总是有时间坐在这里,详细解释每个令人烦恼的部分。
 
最佳 底部