解决 嗨伙计们,目前正在制作猜测游戏,需要一些帮助我的代码..

Sock1992

众所周知的成员
加入
5月20日,2020年
消息
99
编程经验
Beginner
目前,如果用户输入与迭代中的指定字母匹配,则程序将仅显示一封信。

我想做的就是透露一封信,尽管用户正在迭代......例如。如果用户输入"P"在第一次迭代中,我希望该程序揭示所有PS" 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...

Dragon4ik.

成员
加入
10月24日,2020年
消息
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:
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
如何?请解释您的解决方案。

你为什么要在已经是一个字符串的对象上调用字符串?这是冗余代码......
 

Sock1992

众所周知的成员
加入
5月20日,2020年
消息
99
编程经验
Beginner
如何?请解释您的解决方案。

你为什么要在已经是一个字符串的对象上调用字符串?这是冗余代码......
**以及为什么要在已经是一个字符串的对象上调用字符串?这是冗余代码...... ** - 我的错误,我现在在我的程序中改变了这一点。

如果用户进入秘密词的字母,我已经回答了上面的回答"Happy",我希望我的程序透露这封信尽管循环是什么迭代。

例如如果我在For循环的第一次迭代中,我进入了一个"P",我会喜欢该程序显示"_ _PP_".

我不想等到第三和第四次迭代到揭示这两个字母。

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

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
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
}
 

Sock1992

众所周知的成员
加入
5月20日,2020年
消息
99
编程经验
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.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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 = Array.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)
您应该使用的是令人愉快的.equenceequal - 枚举.QuenceEqual方法(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();
以下是应用程序中应用程序的屏幕截图:

screenshot_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 = Array.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();
        }
有很多房间额外的检查和家务。但它做了你想要的,效果很好。

当然,它也可以简化一些微小的调整。快乐的编程。
 
解决方案

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
使用#7后的代码,如果用户正确猜测该词,则突破无限循环的唯一方法。鉴于此,当无限循环后,无需检查两个数组值是否相等。只需声明用户已正确猜测该字。

现在,如果用户具有有限数量的猜测,则无限循环不是适当的循环结构,并且您需要保留检查两个数组值是否相等的代码并声明是否用户已正确猜测单词。

就个人而言,我认为如果使用更合适的数据结构而不是一系列字符串,则会简化事物,但OP可能仍然与他的学校课程仍然存在,并且他们还没有覆盖替代方案。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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.

而且我并不总是有时间坐在这里,并详细解释每一个Piffling部分。
 
最佳 底部