收集猜测4位数字游戏中正确数字数量的数量

4

如果我想知道正确数字的数量,即使它们错位排列,我该如何编码?例如,正确的数字是"7896",但我输入的是"8749",因此我想让程序显示有"3"(789)个数字正确。

void Run()
{

    // initialize the number of attempts
    int numberOfAttempts = 1000;

    Console.WriteLine("\nWelcome to Random Number Guessing Game.");
    Console.WriteLine("\n\nGuess the 4 digit random number XXXX.");
    Console.WriteLine("\nFor each digit, the number is chosen from 1 to 9  \nNumbers can repeat.");


    // Call the method to Generate the Random Number
    string randomNumber = GenerateRandomNumber();

    for (int i = 1; i <= numberOfAttempts; i++)
    {
        // Call the method to get the user input
        string userInput = GetUserInput(i);

        // Get the result - Collection containing the result of all 4 digits
        List<Result> result = GetResult(randomNumber, userInput);

        // Guess the count of number of digits that are correct
        int flagCount = result.Where(f => f.Flag == true).Count();

        // Get the place(s)/index of digits that are correct
        string digitsCorrect = string.Join(",", result.Where(f => f.Flag == true)
            .Select(c => (++c.Index).ToString()));


        // check the flag count and display appropriate message
        if (flagCount == 4)
        {                
            Console.WriteLine("Random Number:{0} , Your Input:{1}", randomNumber, userInput);
            Console.WriteLine("You guess is correct! Game Won..hurray...:)");
            break;
        }   
        else
        {

            digitsCorrect = flagCount == 0 ? "none" : digitsCorrect;
            Console.WriteLine(string.Format("Digit(s) in place {0} correct", digitsCorrect));
            Console.WriteLine(flagCount);

        }
    }

    Console.ReadLine();
}

我已经完成了一些方法,现在可以进行游戏了。


GetResult方法是做什么的?Result对象长什么样子?代码中缺少重要信息。 - ADyson
1
抱歉,您没有提供要翻译的内容。请提供需要翻译的英文文本。 - user11903168
“Please help me” 不是一个问题,不清楚您遇到了什么问题。能否更新您的帖子,包括实际遇到的问题和期望的输出? - Trevor
4个回答

1
像这样的吗?
  public static string Info(string guess, string actual)
    {
        int correctNumbers = 0;
        string correctChars = "";

        List<char> charlists = actual.ToList();
        foreach (var char_ in guess)
        {
            if (charlists.Contains(char_))
            {
                correctNumbers++;
                correctChars += char_.ToString();
                charlists.Remove(char_);     
            }
        }
        return $"{correctNumbers}({correctChars})";
    }

0
你想要做的是跟踪已经猜过的数字。你可以通过创建一个数字字典并检查还有多少未被猜测来实现这一点。
var guess = "7896";
var actual = "8749";

var charCounts = actual.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());
var correct = new List<char>();
foreach(char c in guess)
{
    if(charCounts.TryGetValue(c, out var count) && count > 0)
    {
        correct.Add(c);
        charCounts[c]--;
    }
}

Console.WriteLine($"You guessed {correct.Count} correct digits of {string.Join(",", correct)}");

这将处理实际值和猜测中重复数字的情况。

0
尝试像这样做:

var input = 8749;
var goal = 7896;
var inputDigits = input.ToString().Select(digit => int.Parse(digit.ToString())).ToList();
var goalDigits = goal.ToString().Select(digit => int.Parse(digit.ToString())).ToList();
var correctDigits = new List<int>();
for (int i = 0; i < goalDigits.Count(); i++)
{
    if(inputDigits.Contains(goalDigits[i]))
    {
        correctDigits.Add(goalDigits[i]);
    }
}
var result = new { correctDigits.Count, correctDigits };

这个程序无法处理目标中的重复数字。将您的目标更改为“7899”,结果计数为4,列表为7,8,9,9。更不用说将数字解析回整数是不必要的了。您必须在找到每个匹配项时将其排除,可以通过跟踪数字计数或从要比较的列表中删除匹配项来实现。 - juharr

0

另一种方式:

string randomNumber = "7896";
string userInput = "8749";
int result = randomNumber.GroupBy(x => x)
                 .Sum(x => Math.Min(userInput.GroupBy(y => y)
                     .FirstOrDefault(y => y.Key == x.Key)?.Count() ?? 0, x.Count()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接