사용자로부터 문자를 입력받아 숨겨진 단어를 맞추는 행맨 게임을 작성하세요.
- 사용자가 단어의 모든 문자를 맞추거나 주어진 기회 내에 맞추지 못할 때까지 반복합니다.
- 게임 설명: 행맨 게임은 사용자가 단어를 추측하는 게임입니다. 사용자는 알파벳을 하나씩 입력하고, 맞출 때마다 단어의 해당 위치에 문자가 표시됩니다. 틀릴 경우, 기회가 줄어듭니다.
- 배열 사용: char[] 배열을 사용하여 단어를 저장하고, 추측된 문자를 저장합니다.
- 반복문 사용: 게임은 사용자가 단어를 맞추거나 기회가 끝날 때까지 반복됩니다.
- 조건문 사용: 각 입력된 문자가 단어에 포함되는지 확인합니다.
- 사용 변수 설명
- secretWord: 맞춰야 할 단어입니다. 예제에서는 "hangman"으로 설정되어 있습니다.
- guessWord: 사용자가 맞춘 문자를 저장하는 문자 배열로, 초기에는 언더스코어(_)로 채워져 있습니다.
- attempts: 사용자가 틀릴 수 있는 기회의 수로, 초기에는 6으로 설정되어 있습니다.
- wordGuessed: 사용자가 단어를 모두 맞췄는지를 나타내는 불리언 변수입니다.
이 문제가 요구하는 것은 다음과 같다고 생각한다.
코드를 작성하기 전, 나는 문제를 다음과 같은 순서로 접근하기로 구상했다.
attempts를 1씩 빼서 0에 도달하면 반복을 멈추기.먼저 맞춰야 할 단어를 저장한다.
string secretWord = "hangman";
다음으로 입력한 문자를 저장하는 배열을 만든다. 배열의 길이는 맞춰야 할 단어의 길이와 같다.
char[] guessWord = new char[secretWord.Length];
채워야 하는 문자 배열을 언더스코어_로 채운다. for문을 사용하여 guessWord의 길이만큼 _를 배열에 넣는 것을 반복하는 식으로 채웠다.
for (int i = 0; i < guessWord.Length; i++)
{
guessWord[i] = '_';
}
변수들을 추가한다. 나는 기회 횟수인 attempts와 wordGuessed 불리언 값을 저장했다. 또한 이를 바탕으로 전체 반복문을 작성했다.
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;
}
guess가 secretWord에 포함됐는지를 판별하여 만약 포함되어 있다면 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 + "'였습니다.");
}
의도한 대로 나오는지 확인해보았다.

하지만, 몇가지 문제가 존재했다.
먼저 남은 횟수를 알려주는 코드를 추가한다.
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 + "'였습니다.");
}
아래는 이 코드를 출력한 결과이다.
