Unity 사전캠프 9일차 - C# 기초 문법 예제8

한예준·2025년 3월 27일

숫자 야구 게임을 작성하세요.

  • 컴퓨터가 3자리의 숫자를 선택하면 사용자가 그 숫자를 맞추는 게임을 구현하세요. 각 자리의 숫자를 비교하여 스트라이크와 볼의 개수를 출력합니다.
  • 숫자 야구 게임 설명
    • 숫자 야구 게임은 3자리의 숫자를 맞추는 게임입니다. 컴퓨터가 고른 3자리 숫자는 모두 다른 * 숫자로 이루어져 있습니다. 사용자는 3자리 숫자를 입력하고, 컴퓨터는 입력한 숫자와 자리수를 비교하여 스트라이크와 볼의 개수를 알려줍니다.
    • 스트라이크: 숫자와 자리수가 모두 맞는 경우
    • 볼: 숫자는 맞지만 자리수가 다른 경우
    • 예를 들어, 컴퓨터가 427을 선택하고 사용자가 123을 입력했을 때, 2는 맞지만 자리수가 다르므로 1볼, 1은 맞지 않으므로 0스트라이크입니다. 이 과정은 사용자가 정확한 숫자를 맞출 때까지 반복됩니다.
  • 사용 변수 설명
    • targetNumber: 컴퓨터가 선택한 3자리의 숫자를 저장하는 배열입니다.
    • userGuess: 사용자가 추측한 숫자를 저장하는 배열입니다.
    • strikes: 자릿수와 숫자가 모두 맞는 경우의 개수를 저장합니다.
    • balls: 자릿수는 맞지 않지만 숫자가 포함된 경우의 개수를 저장합니다.
    • guessedCorrectly: 사용자가 숫자를 정확히 맞췄는지를 나타내는 불리언 변수입니다.

문제를 접하고 푸는 순서를 정해보았다.

  1. 먼저 컴퓨터가 선택한 3자리의 숫자를 난수로 생성한다. 이 3자리의 난수를 targetNumber배열에 저장한다.
  2. UserGuess 배열에 사용자가 추측한 숫자를 저장한다. 이 숫자 중 targetNumber의 배열을 비교하여 자릿수와 숫자가 모두 맞는 경우와 자릿수는 맞지 않지만 숫자가 포함된 경우를 판별한다.
  3. 판별에 따라 strikesballs를 지정하고 3숫자 모두 자릿수와 숫자가 맞으면 GuessedCorrectlytrue로 저장한다.

이 순서에 따라 진행해보겠다.

먼저, 난수로 3자리의 숫자를 생성하고 이를 targetNumber 배열에 저장하겠다.

Random random = new Random();
int[] targetNumber = new int[3];

int Num1 = random.Next(0, 10);
targetNumber[0] = Num1;
int Num2 = random.Next(0, 10);
targetNumber[1] = Num2;
int Num3 = random.Next(0, 10);
targetNumber[2] = Num3;

다음으로 guessedcorrectly 불리언 변수를 false일 때 반복되는 반복문을 작성한다. 사용자에게 입력값을 받는다.

bool guessedcorrectly = false;

while (!guessedcorrectly)
{
    Console.Write("세 자리 숫자를 입력하세요");
    string Input = Console.ReadLine();
}

그 입력값을 숫자 배열로 변환한다.

    int[] userGuess = new int[3];
    for (int i = 0; i < 3; i++)
    {
        userGuess[i] = Convert.ToInt32(Input[i]);
    }

다음으로 strikesballs 변수를 선언하고, 조건에 맞을 때 1씩 증가시킨다.

	for (int i = 0; i < 3; i++)
    {
        if (userGuess[i] == targetNumber[i])
        {
            strikes++;
        }
        else if (userGuess[i] == targetNumber[0] || userGuess[i] == targetNumber[1] || userGuess[i] == targetNumber[2])
        {
            balls++;
        }
    }

마지막으로 결과를 출력시킨다.

    Console.WriteLine($"결과: {strikes}스트라이크, {balls}볼");
    if (strikes == 3)
    {
        Console.WriteLine("정답입니다! 게임을 종료합니다.");
        guessedcorrectly = true;
    }

그리고 출력해보았다.

오류가 발생한 것을 확인할 수 있었다. 어떤 오류인지 알아본 결과, input[i]문자열이 아니라 문자이기 때문에 Convert.ToInt32함수로 변환하면 유니코드 (48+i)로 반환된다는 사실을 알았다. 그러므로 input[i]에 유니코드 48번인 0을 빼야 (48+i)-48이므로 정상적으로 i가 반환된다는 사실을 배웠다.

또한,


세자리 숫자가 아닌 숫자를 입력하면 이런식으로 오류가 발생했다. 이 오류도 해결해야 했다.

int Num1 = random.Next(0, 10);
targetNumber[0] = Num1;
int Num2 = random.Next(0, 10);
targetNumber[1] = Num2;
int Num3 = random.Next(0, 10);
targetNumber[2] = Num3;

또한 이 코드를 더 간단하게 수정하고, 이 숫자 중 중복된 숫자가 있지 않게 하기 위한 방법이 필요했다.

먼저 세자리 숫자가 아닌 경우와 숫자가 아닌 자료형을 판별하기 위해


if (Input.Length != 3 || !int.TryParse(Input, out _))
{
    Console.WriteLine("세 자리 숫자를 정확히 입력하세요.");
    continue;
}

를 추가하였다. 다음으로 단순하게 랜덤 난수를 세자리 생성하는 코드를 랜덤 난수 세자리가 중복되지 않은 숫자 세개를 생성하는 코드로 수정하였다.

int count = 0;

while (count < 3)
{
    int Num = random.Next(0, 10);
    bool isSame = false;

    for (int i = 0; i < count; i++)
    {
        if (targetNumber[i] == Num)
        {
            isSame = true;
            break;
        }
    }

    if (!isSame)
    {
        targetNumber[count] = Num;
        count++;
    }
}

먼저 count변수를 선언하고, 3개의 숫자를 뽑을 때까지 반복하도록 만든다.
다음으로 0부터 9까지의 난수를 Num에 저장 후,
이 순서에 뽑은 Num이 이전까지 뽑은 Num과 중복되는지를 확인한다.
만약 중복되지 않은 숫자라면, 배열에 저장하고 count를 1 늘린다.

최종 완성된 코드는 다음과 같다.

Random random = new Random();
int[] targetNumber = new int[3];
int count = 0;

while (count < 3)
{
    int Num = random.Next(0, 10);
    bool isSame = false;

    for (int i = 0; i < count; i++)
    {
        if (targetNumber[i] == Num)
        {
            isSame = true;
            break;
        }
    }

    if (!isSame)
    {
        targetNumber[count] = Num;
        count++;
    }
}

bool guessedcorrectly = false;

while (!guessedcorrectly)
{
    Console.Write("세 자리 숫자를 입력하세요");
    string Input = Console.ReadLine();

    if (Input.Length != 3 || !int.TryParse(Input, out _))
    {
        Console.WriteLine(" 세 자리 숫자를 정확히 입력하세요.");
        continue;
    }

    int[] userGuess = new int[3];
    for (int i = 0; i < 3; i++)
    {
        userGuess[i] = Input[i]-'0';
    }
    int strikes = 0;
    int balls = 0;
    for (int i = 0; i < 3; i++)
    {
        if (userGuess[i] == targetNumber[i])
        {
            strikes++;
        }
        else if (userGuess[i] == targetNumber[0] || userGuess[i] == targetNumber[1] || userGuess[i] == targetNumber[2])
        {
            balls++;
        }
    }
    Console.WriteLine($"결과: {strikes}스트라이크, {balls}볼");
    if (strikes == 3)
    {
        Console.WriteLine("정답입니다! 게임을 종료합니다.");
        guessedcorrectly = true;
    }
}

실제로 구동해보니 다음과 같이 출력했다.

0개의 댓글