숫자 야구 게임 만들기

ggm-_-·2024년 9월 4일
  • Q. 숫자 야구 게임을 작성하세요. 컴퓨터가 3자리의 숫자를 선택하면 사용자가 그 숫자를 맞추는 게임을 구현하세요. 각 자리의 숫자를 비교하여 스트라이크와 볼의 개수를 출력합니다.
    • 숫자 야구 게임 설명

      숫자 야구 게임은 3자리의 숫자를 맞추는 게임입니다. 컴퓨터가 고른 3자리 숫자는 모두 다른 숫자로 이루어져 있습니다. 사용자는 3자리 숫자를 입력하고, 컴퓨터는 입력한 숫자와 자리수를 비교하여 스트라이크와 볼의 개수를 알려줍니다.

    • 스트라이크: 숫자와 자리수가 모두 맞는 경우

    • : 숫자는 맞지만 자리수가 다른 경우

      예를 들어, 컴퓨터가 427을 선택하고 사용자가 147를 입력했을 때, 4는 맞지만 자리수가 다르므로 1볼, 7은 숫자와 자리수가 모두 같으므로 1스트라이크입니다. 이 과정은 사용자가 정확한 숫자를 맞출 때까지 반복됩니다.

사용 변수 설명

  • targetNumber: 컴퓨터가 선택한 3자리의 숫자를 저장하는 배열입니다.
  • userGuess: 사용자가 추측한 숫자를 저장하는 배열입니다.
  • strikes: 자릿수와 숫자가 모두 맞는 경우의 개수를 저장합니다.
  • balls: 자릿수는 맞지 않지만 숫자가 포함된 경우의 개수를 저장합니다.
  • guessedCorrectly: 사용자가 숫자를 정확히 맞췄는지를 나타내는 불리언 변수입니다.

예상 출력

Enter your guess (3 digits): 123
0 Strike(s), 0 Ball(s)
Enter your guess (3 digits): 456
0 Strike(s), 0 Ball(s)
Enter your guess (3 digits): 789
1 Strike(s), 2 Ball(s)
Enter your guess (3 digits): 987
3 Strike(s), 0 Ball(s)
Congratulations! You've guessed the number in 4 attempts.

코드

int []targetNumber = new int[3];
int []userGuess = new int[3];
int strikes = 0;
int balls = 0;
bool guessedCorrectly = false;
int attempts = 0;

//컴퓨터가 숫자 선정
Random random = new Random();
do
{
    int targetNum = random.Next(1, 1000);
    for (int i = 0; i < 3; i++)
    {
        targetNumber[2 - i] = targetNum % 10;
        try
        {
            targetNum = targetNum / 10;
        }
        catch
        {
            targetNumber[0] = 0;
            targetNumber[1] = 0;
            break;
        }
    }

} while (targetNumber[0] == targetNumber[1] || 
targetNumber[0] == targetNumber[2] || targetNumber[1] == targetNumber[2]);


// 숫자 맞추기 시작
while (!guessedCorrectly)
{
    attempts++;
    Console.Write("Enter your guess (3 digits): ");
    //내가 예상한 숫자 입력
    string input = Console.ReadLine();
    for (int i = 0; i < 3; i++)
    {
        userGuess[i] = input[i] - '0';
    }

    //스트라이크와 볼 계산
    for (int i = 0; i < 3; i++)
    {
        int indexEqual = Array.IndexOf(targetNumber, userGuess[i]);
        if (indexEqual == i)
        {
            strikes++;
        }
        else if (indexEqual >= 0)
        {
            balls++;
        }
    }
    Console.WriteLine("{0} Strike(s), {1} Ball(s)", strikes, balls);

    //정답 맞춤
    if (strikes == 3)
    {
        Console.WriteLine("Congratulations! You've guessed the number in {0} attempts.", attempts);
        guessedCorrectly = true;
    }

    //못 맞췄을 때 스트라이크와 볼 초기화
    strikes = 0;
    balls = 0;
}

코드 코멘트

  • 컴퓨터가 랜덤으로 숫자를 뽑는 과정
    랜덤으로 컴퓨터가 숫자를 3자리 뽑는 과정은 1~1000이 아니라 1-10까지 각 자리수별로 뽑는 방식으로 진행하는 게 더 깔끔할 것 같다. 1~1000을 뽑는 과정(사실 12 이전 까지의 숫자는 모두 탈락이기에 12부터 해도 되긴한다)에서 0을 나누게 되는 경우의 수를 고려해서 try catch문을 사용해서 예외 처리를 해주었다.
  • 숫자 입력을 받는 과정
    내가 추측하는 숫자를 입력하는 과정에서 숫자가 아닌 다른 문자가 들어왔을 때를 고려하지 않았는데, 만약 실제로 코드를 사용하는 상황에서는 예외처리를 해줘야 할 것이다.
  • 숫자 3을 쓴 것에 대한 고찰
    현재 코드에서는 숫자 야구의 자리수가 3이기 때문에 3을 사용하였는데, 자리수를 임의로 늘리고 줄이는 기능과 가독성을 고려하면 3을 따로 변수로 선언하여 사용하는 게 좋을 듯하다.
profile
나태 마스터

0개의 댓글