카테고리 없음

[자습] 행맨 번외

티백고래 2025. 3. 28. 23:38

여기서 수행할 작업

 사전캠프 9일차 10일차에 수행한 행맨게임. 그곳엔 게임이라고 하기엔 아주 치명적인 문제가 있다.

바로 문제의 정답이 "hangman"밖에 없다는 것이다.

하지만 역시 게임이라면 랜덤한 값을 출력시키고 싶지 않은가. 정답 맞추기 게임은 정답을 몰라야 재미가 있는 것이다.

그렇다고 문자를 랜덤으로 뽑도록 하자니 그러면 단어가 되지 않는다. 단어가 되어야 추론하는 재미가 있는 것이다.

그래서, 문자열을 랜덤으로 출력할 수 있도록 만들 것이다.

 

기존 코드

더보기

//비밀문자 지정
char[] secretword = "hangman".ToCharArray();

//이곳의 "hangman"을 대신하여 랜덤한 문자열이 들어가도록 바꿀 것이다
//hangman 이라는 단어를 h/a/n/g/m/a/n 으로 쪼갬

 

//guessWord라는 이름의 hangman의 문자와 같은 수의 방을 가진 배열  생성

//guesWord의 배열에 전부 _를 채워넣는 작업
char[] guessWord = new char[secretword.Length];
for (int i = 0; i < guessWord.Length; i++)
{
    guessWord[i] = '_';
}


bool guess =false; //불리언 생성. 정답 판독기
int x = 6; //6회의 횟수제한



Console.WriteLine("행맨게임을 시작합니다!");
Console.WriteLine("정답이 아닌 알파벳을 넣으면 정답기회가 차감됩니다.");
Console.WriteLine("알파벳을 입력해주세요.");
Console.WriteLine($"정답 현황: {new string(guessWord)}");

do
{
    
    Console.WriteLine($"정답 기회가 {x}회 남았습니다.");
    
    char input;
    bool OK; //입력한 데이터가 char값인지 확인
    OK = char.TryParse(Console.ReadLine(), out input);//입력값을 input에 char 값으로 변경
    if(Array.Exists(guessWord, element => element == input)) //입력값이 이미 입력한 적 있는지 확인, 중복방지
    {
        Console.WriteLine("이미 입력된 문자입니다. 다른 문자를 입력해주세요.");
        
    }
    else if (Array.Exists(secretword, answer => answer == input)) //입력값이 정답에 해당하고, 입력된 적이 없을 때
    {
        for(int i=0; i<secretword.Length; i++)
        {
            if (secretword[i] == input) //secretword와 정확히 i가 동일할 때 input값이 들어가도록
            {
                guessWord[i] = input;
            }            
        }
        Console.WriteLine($"정답 현황: {new string(guessWord)}");
    }
    else if(!OK) //입력값이 문자가 아닐 경우
    {
        Console.WriteLine("알파벳 하나만 입력해주세요.");
    }
    else
    {
        x--; //오답이므로 횟수 차감
        Console.WriteLine($"{input}은 해당되지 않습니다.");
    }
        
    //두 배열의 비교를 위해 new string()을 이용하여 string 값으로 변환
    string secretW = new string(secretword);
    string guessW = new string(guessWord);

    if (guessW == secretW) //두 배열이 같을 경우(=정답) 동작
    {
        guess= true;
    }       

} while (x > 0 && !guess);

if (guess) //guess = true 가 되어 나왔을 경우
{
    Console.WriteLine($"정답입니다! 정답: {new string (secretword)}");
}
else //x=0이 되어 나왔을 경우
{
    Console.WriteLine($"기회를 모두 사용하셨습니다. 정답: {new string(secretword)}"); 
   
}

구조를 보면, 다행히 단어의 글자수를 지정하는 식은 없다.(.Length를 사용하여, secretword의 글자 수가 바뀔 때마다 유동적으로 조정된다.)

즉, 수정해야 할 부분은 char[] secretword = "hangman".ToCharArray();, 그 중에서도 "hangman" 부분이다.

그럼 여기서 쓸 만한 건 Random인데. Random은 난수 생성 코드이다.

그리고 난수가 들어갈만한 곳은 배열의 char [i]에서 i부분이다. 이 i를 난수로 만들면, 어떻게든 될 것 같다.

 

문자열 랜덤뽑기 코드

더보기

//비밀문자 랜덤옵션 지정 (문자열 배열)
string[] options= { "salmon", "hangman", "secret", "cyanosis", "approach", "question", "paralysis", "rhythm", "spring", "myths", "monitoring","software", "orchestra" }; 

//13개

// 난수를 만들 랜덤 객체 생성
Random rand = new Random();

// 랜덤 색인(index) 생성 [ i ] 대신으로 쓸 것이다
int index = rand.Next(options.Length);

// 문자열을 랜덤으로 뽑는 코드
char[] secretword = options[index].ToCharArray();
//.ToCharArray가 랜덤 단어(문자열)을 문자 배열로 쪼갬

다행히 랜덤으로 13개의 단어 중 하나가 선택되고, 정답까지 정상적으로 맞출 수 있는 것이 확인되었다. (와!)단어가 길수록 횟수가 적어져서 어려워질 수 있지만, 단어가 긴 만큼 눈치가 빠르면 금방 알아챌 수도 있다.

세세한 부분을 건드릴 필요 없이 사소한 부분만 건드려도 되어서 다행히 어렵지 않았다.