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

한예준·2025년 3월 26일

사용자로부터 문자를 입력받아 숨겨진 단어를 맞추는 행맨 게임을 작성하세요.

  • 사용자가 단어의 모든 문자를 맞추거나 주어진 기회 내에 맞추지 못할 때까지 반복합니다.
  • 게임 설명: 행맨 게임은 사용자가 단어를 추측하는 게임입니다. 사용자는 알파벳을 하나씩 입력하고, 맞출 때마다 단어의 해당 위치에 문자가 표시됩니다. 틀릴 경우, 기회가 줄어듭니다.
  • 배열 사용: char[] 배열을 사용하여 단어를 저장하고, 추측된 문자를 저장합니다.
  • 반복문 사용: 게임은 사용자가 단어를 맞추거나 기회가 끝날 때까지 반복됩니다.
  • 조건문 사용: 각 입력된 문자가 단어에 포함되는지 확인합니다.
  • 사용 변수 설명
    • secretWord: 맞춰야 할 단어입니다. 예제에서는 "hangman"으로 설정되어 있습니다.
    • guessWord: 사용자가 맞춘 문자를 저장하는 문자 배열로, 초기에는 언더스코어(_)로 채워져 있습니다.
    • attempts: 사용자가 틀릴 수 있는 기회의 수로, 초기에는 6으로 설정되어 있습니다.
    • wordGuessed: 사용자가 단어를 모두 맞췄는지를 나타내는 불리언 변수입니다.

이 문제가 요구하는 것은 다음과 같다고 생각한다.

  1. 배열을 사용하여 사용자가 맞춰야 할 단어 저장하기.
  2. 사용자가 입력한 문자를 저장하고, 배열에 저장하기.
  3. 각 입력된 문자와 맞춰야 할 단어를 비교하여 저장하고 출력하기.
  4. 기회 횟수를 지정하고 기회 횟수만큼 반복하기.
  5. 기회 횟수에 도달하거나 맞추면 특정 문자열 출력하기.

코드를 작성하기 전, 나는 문제를 다음과 같은 순서로 접근하기로 구상했다.

  1. 사용자가 맞춰야 하는 문자열과 사용자가 입력한 문자를 저장하는 배열 만들기.
  2. 사용자가 입력한 문자와 맞춰야 하는 문자열의 각 자리를 비교하고 만약 같은 문자가 있다면 그 자리에 출력하기.
  3. 틀린 횟수마다 attempts를 1씩 빼서 0에 도달하면 반복을 멈추기.
  4. 기회 안에 전부 맞추면 특정 문자열 출력하기.

먼저 맞춰야 할 단어를 저장한다.

string secretWord = "hangman";

다음으로 입력한 문자를 저장하는 배열을 만든다. 배열의 길이는 맞춰야 할 단어의 길이와 같다.

char[] guessWord = new char[secretWord.Length];

채워야 하는 문자 배열을 언더스코어_로 채운다. for문을 사용하여 guessWord의 길이만큼 _를 배열에 넣는 것을 반복하는 식으로 채웠다.

for (int i = 0; i < guessWord.Length; i++)
{
    guessWord[i] = '_';
}

변수들을 추가한다. 나는 기회 횟수인 attemptswordGuessed 불리언 값을 저장했다. 또한 이를 바탕으로 전체 반복문을 작성했다.

int attempts = 6;
bool wordGuessed = false;

while (wordGuessed == false && attempts > 0)
{

여기에 현재 추측 상태를 출력하였다.

    for (int i = 0; i < guessWord.Length; i++)
    {
        Console.Write(guessWord[i]);
    }

다음으로 사용자의 입력값을 받겠다. 또한 사용자의 입력값 중 첫글자만 받도록 하겠다. 그 글자를 guess 변수에 저장한다.

	Console.Write("알파벳 하나를 입력하세요: ");
	string input = Console.ReadLine();

    char guess = input[0];

아무것도 입력하지 않았을 경우를 대비하여 코드를 추가해주겠다. 아무것도 입력하지 않았을 경우 while로 돌아간다.

if (string.IsNullOrEmpty(input))
{
    Console.WriteLine("입력이 비어 있습니다. 다시 입력하세요.");
    continue;
}

guesssecretWord에 포함됐는지를 판별하여 만약 포함되어 있다면 guessWord에 저장한다. correct 불리언을 참으로 바꾼다.

    bool correct = false;
    for (int i = 0; i < secretWord.Length; i++)
    {
        if (secretWord[i] == guess)
        {
            guessWord[i] = secretWord[i];
            correct = true;
        }
    }

만약 포함되어 있지 않다면 이를 출력하고 attempts를 1 차감한다.

    if (correct == false)
    {
        Console.WriteLine("'" + guess + "'는 틀렸습니다.");
        attempts--;
    }

마지막으로 guessWord 배열 중 _가 남아있는지 아닌지를 판별하고, 남아있지 않다면 wordGuessed의 불리언 값을 true로 저장한다.

	wordGuessed = true;
    for (int i = 0; i < guessWord.Length; i++)
    {
        if (guessWord[i] == '_')
        {
            wordGuessed = false;
            break;
        }
    }

반복문 while이 종료되면 결과를 출력한다.

if (wordGuessed)
{
    Console.WriteLine("축하합니다! 정답을 모두 맞췄습니다.");
}
else
{
    Console.WriteLine("기회를 모두 사용했습니다. 정답은 '" + secretWord + "'였습니다.");
}

의도한 대로 나오는지 확인해보았다.

하지만, 몇가지 문제가 존재했다.

  1. 대문자로 작성할 경우 틀렸다고 함.
  2. 남은 횟수를 알 수 없음.
  3. 출력 포맷이 깔끔하지 않음.

먼저 남은 횟수를 알려주는 코드를 추가한다.

    Console.WriteLine("남은 기회: " + attempts);

다음으로 입력한 대문자를 소문자로 변환하여 secretWord의 소문자와 비교하게 한다.

    for (int i = 0; i < secretWord.Length; i++)
    {
        if (char.ToLower(secretWord[i]) == char.ToLower(guess))
        {
            guessWord[i] = secretWord[i];
            correct = true;
        }
    }

마지막으로 출력 포맷이 깔끔하도록 다듬은 후의 최종 완성된 코드이다.

string secretWord = "hangman"; 
char[] guessWord = new char[secretWord.Length]; 

for (int i = 0; i < guessWord.Length; i++)
{
    guessWord[i] = '_';
}

int attempts = 6; 
bool wordGuessed = false;

while (wordGuessed == false && attempts > 0)
{
    Console.Write("현재 단어: ");
    for (int i = 0; i < guessWord.Length; i++)
    {
        Console.Write(guessWord[i]+" ");
    }
    Console.WriteLine();
    Console.WriteLine("남은 기회: " + attempts);
    Console.WriteLine("알파벳 하나를 입력하세요: ");
    string input = Console.ReadLine();
    if (string.IsNullOrEmpty(input))
    {
        Console.WriteLine("입력이 비어 있습니다. 다시 입력하세요.");
        continue;
    }

    char guess = input[0];
    bool correct = false;
    for (int i = 0; i < secretWord.Length; i++)
    {
        if (char.ToLower(secretWord[i]) == char.ToLower(guess))
        {
            guessWord[i] = secretWord[i];
            correct = true;
        }
    }
    if (correct == false)
    {
        Console.WriteLine("'" + guess + "'는 틀렸습니다.");
        attempts--;
    }

    wordGuessed = true;
    for (int i = 0; i < guessWord.Length; i++)
    {
        if (guessWord[i] == '_')
        {
            wordGuessed = false;
            break;
        }
    }

}
if (wordGuessed)
{
    Console.WriteLine("축하합니다! 정답을 모두 맞췄습니다.");
    Console.WriteLine("정답은 '" + secretWord + "'였습니다.");
}
else
{
    Console.WriteLine("기회를 모두 사용했습니다.");
    Console.WriteLine("정답은 '" + secretWord + "'였습니다.");
}

아래는 이 코드를 출력한 결과이다.

0개의 댓글