팀스파르타 내일배움캠프

[사전캠프 14일차] 행맨게임 만들기!!!

creator2041 2025. 4. 3. 16:01
using System;

namespace HangmanGame
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 게임에 사용할 단어 목록 선언 (고등학교 수준의 영어 단어들)
            // chemistry: 화학, biology: 생물학, democracy: 민주주의, equation: 방정식
            string[] wordList = { "chemistry", "biology", "democracy", "equation" };
            
            // 2. 랜덤 객체 생성 - Random 클래스는 무작위 숫자를 생성하는 클래스입니다
            Random random = new Random();
            
            // 3. 0부터 3까지의 랜덤 숫자 생성 (Next 메서드는 0부터 지정한 숫자 미만의 값을 반환)
            int randomNumber = random.Next(4); 
            
            // 4. 생성된 랜덤 숫자를 인덱스로 사용하여 단어 목록에서 단어 선택
            // 배열은 0부터 시작하므로 0이면 첫 번째 단어, 1이면 두 번째 단어...
            string secretWord = wordList[randomNumber];
            
            // 5. 디버그용: 선택된 단어와 인덱스 출력 (실제 게임에서는 삭제 가능)
            Console.WriteLine("디버그: 선택된 단어 인덱스 = " + randomNumber);
            
            // 6. 사용자가 맞춘 문자를 저장할 배열 초기화 
            // 언더스코어(_)로 채워서 맞추지 못한 글자를 표시

            
            // 7. 게임에 필요한 변수 선언
            // 틀릴 수 있는 최대 횟수 (6번 틀리면 게임 오버)
            
            // 단어를 모두 맞췄는지 여부를 저장할 불리언 변수
            
            // 사용자가 이미 입력한 문자들을 저장할 문자열
            
            // 8. 게임 시작 메시지 출력
            Console.WriteLine("행맨 게임을 시작합니다!");
            Console.WriteLine("단어를 맞춰보세요. 총 " + attempts + "번의 기회가 있습니다.");
            
            // 9. 게임 루프: 단어를 맞추거나 기회를 모두 소진할 때까지 반복
            // !wordGuessed는 '단어를 맞추지 않았다'는 의미, attempts > 0은 '기회가 남아있다'는 의미
            while (!wordGuessed && attempts > 0)
            {
                // 10. 현재 게임 상태 출력
                // new string(guessWord)는 char 배열을 문자열로 변환
                Console.WriteLine("\n현재 단어: " + new string(guessWord));
                Console.WriteLine("남은 기회: " + attempts);
                Console.WriteLine("추측한 문자들: " + guessedLetters);
                
                // 11. 사용자에게 문자 입력 요청
                Console.Write("알파벳 하나를 입력하세요: ");
                
                // ReadLine()은 한 줄을 읽고, [0]은 첫 번째 문자를 선택
                char guess = Console.ReadLine()[0];
                
                // 입력된 문자를 소문자로 변환 (대문자 입력해도 처리 가능하게)
                guess = Char.ToLower(guess);
                
                // 12. 이미 추측한 문자인지 확인
                // Contains 메서드는 문자열에 특정 문자/문자열이 포함되어 있는지 확인
                if (guessedLetters.Contains(guess))
                {
                    Console.WriteLine("이미 추측한 문자입니다. 다른 문자를 입력해주세요.");
                    // continue는 현재 반복을 중단하고 다음 반복으로 넘어감
                    continue;
                }
                
                // 13. 추측한 문자 목록에 추가 (나중에 표시하기 위해)
                guessedLetters += guess + " ";
                
                // 14. 입력한 문자가 비밀 단어에 포함되어 있는지 확인
                bool correctGuess = false;
                
                // 비밀 단어의 각 문자를 확인
                for (int i = 0; i < secretWord.Length; i++)
                {
                    // 입력한 문자가 비밀 단어의 i번째 문자와 일치하는지 확인
                    if (secretWord[i] == guess)
                    {
                        // 일치하면 guessWord 배열의 해당 위치에 그 문자를 표시
                        guessWord[i] = guess;
                        // 맞춘 문자가 있음을 표시
                        correctGuess = true;
                    }
                }
                
                // 15. 추측 결과에 따른 처리
                if (correctGuess)
                {
                    // 맞춘 경우
                    Console.WriteLine("정답입니다!");
                    
                    // 16. 단어를 모두 맞췄는지 확인
                    // 일단 맞췄다고 가정하고 시작
                    wordGuessed = true;
                    
                    // guessWord 배열에 언더스코어(_)가 있는지 확인
                    for (int i = 0; i < guessWord.Length; i++)
                    {
                        // 언더스코어가 하나라도 있으면 아직 단어를 다 맞추지 못한 것
                        if (guessWord[i] == '_')
                        {
                            wordGuessed = false;
                            // 언더스코어를 찾았으므로 더 이상 확인할 필요 없음
                            break;
                        }
                    }
                }
                else
                {
                    // 틀린 경우
                    Console.WriteLine("틀렸습니다!");
                    // 기회 감소
                    attempts--;
                    // 남은 기회 알림
                    Console.WriteLine("남은 기회: " + attempts + "번");
                }
            }
            
            // 17. 게임 결과 출력
            if (wordGuessed)
            {
                // 단어를 맞춘 경우
                Console.WriteLine("\n축하합니다! 단어를 맞추셨습니다: " + secretWord);
            }
            else
            {
                // 기회를 모두 소진한 경우
                Console.WriteLine("\n게임 오버! 정답은 " + secretWord + "입니다.");
            }
            
            // 18. 게임 종료 메시지와 프로그램이 바로 종료되지 않도록 키 입력 대기
            Console.WriteLine("게임을 종료합니다. 아무 키나 누르세요...");
            Console.ReadKey();
        }
    }
}

 

 

1. 주석을 적고 하는데도 꽤 고난이도 였음. 주석들을 적어두고 코드를 쓰고. 다시 주석을 수정하고 해가며. 간신히 맞춰서 만들어냄.

2. 확실히 공부가 더 필요하다고 느낌. 금토일 해서 복습을 좀 해야할듯