내일배움캠프/달리기반

[내배캠][Unity_6기][과제] 7. 행맨 게임

binary는 호남선 2024. 9. 1. 11:41

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

- 횟수가 정해진 반복(문자열 검사)에는 for 사용

- 사용자 입력 문자에 따른 전체 프로그램 반복에는 while 사용

- 문자열 길이 범위까지 반복 자주 실행되므로 문자열 길이 변수로 생성

 

CheckInput(string input)

- 입력받은 문자열과 정답 문자열을 비교하는 함수

- 인덱스의 문자가 서로 같으면 추측된 단어 배열의 인덱스 문자를 _에서 맞춘 문자로 변경

- 입력받은 문자열 길이가 정답 문자열과 다른 경우를 고려하여 검사 범위 보정

 

CheckEqual()

- 추측한 문자 배열이 정답 문자열과 일치하는지 확인하는 함수

- 추측한 문자 배열을 문자열로 만들고 정답 문자열과 바로 비교하는 방법도 있음(오버헤드 있을 것으로 예상)

TODO : 현재 방법과 문자 배열 병합하고 비교하는 방법 성능 비교해보기

/******************* 행맨 프로그램 *******************/
/* 기본 설정 초기화 */
string secretWord = "hangman";  // 맞춰야 할 단어
int answerLen = secretWord.Length;    // 정답 문자열의 길이
// 사용자가 맞춘 문자 저장하는 배열
// 맞춰야 할 단어의 길이만큼 공간 할당
char[] guessWord = new char[answerLen];
for (int i = 0; i < answerLen; i++)
{
    // 모두 언더바로 초기화
    guessWord[i] = '_';
}
int attempts = 6;   // 가능한 시도 횟수
bool wordGuessed = false;   // 사용자가 단어 모두 맞췄는지 확인

/* 게임 실행부 */
while (true)
{
    // 문제 제시하며 지금까지 사용자가 맞춘 문자와 가능한 시도 횟수를 표시
    Console.Write("Guess the word ");
    for (int i = 0; i < answerLen; i++)
    {
        Console.Write(guessWord[i]);
    }
    Console.Write($" (life : {attempts}) => ");

    string input = Console.ReadLine();  // 사용자 입력문자열

    // 문자열 검사
    CheckInput(input);  // 정답문자열과 입력문자열 비교
    wordGuessed = CheckEqual(); // 정답문자열과 추측된 문자 배열 비교
    
    // 정답 여부에 따른 분기
    // 정답을 맞추면 축하메시지를 띄우고 프로그램 종료
    if (wordGuessed)
    {
        Console.WriteLine($"Congratulations! The Answer is {secretWord}.");
        return;
    }
    // 정답을 맞추지 못하면
    else
    {
        attempts--; // 시도 횟수 차감
        if (attempts <= 0)  // 모든 시도 횟수 소진하면
        {
            // 종료 메시지 띄우고 프로그램 종료
            Console.WriteLine("GAME OVER");
            return;
        }
        else    // 아직 시도 횟수 남아있으면 
        {
            // 다시 시도하라는 메시지 띄우기
            Console.WriteLine("Try again!");
        }
    }
}

/* 함수부 */
// 입력문자열을 정답문자열과 비교해 추측한 문자 배열 변경하는 함수
void CheckInput(string input)   // 입력문자열은 while 내부 선언이므로 인자로 받기
{
    // 검사할 문자열 길이 조정
    // 입력받는 문자열 길이에 따른 예외 발생 방지
    int len = Math.Min(input.Length, answerLen);
    for (int i = 0; i < len; i++)
    {
        if (input[i] == secretWord[i])
        {
            guessWord[i] = input[i];
        }
    }
}
// 추측한 문자 배열이 정답문자열과 같은지 확인하는 함수
bool CheckEqual()
{
    for (int i = 0; i < answerLen; i++)
    {
        // 문자가 다르면 바로 false로 반환
        if (guessWord[i] != secretWord[i])
            return false;
    }
    // 모든 문자가 동일하므로 true를 반환
    return true;
}