부트캠프/사전캠프

[내일배움 사전캠프_2025JUN28]행맨, 숫자야구 콘솔앱

Young_A 2025. 6. 28. 09:29

행맨, 숫자야구 콘솔앱

 

행맨은 저번에 했던 것 그대로 제출했다.

//Hangman
string secretWord = "Hangman";
char[] guessWord = new char[secretWord.Length];
char guessLetter;
int attempts = 6;
bool wordGuessed  = false;

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


do
{
    Console.Write($"문자를 제시하세요.({attempts}회 남음)   {string.Concat(guessWord)}   :");
    guessLetter = Console.ReadKey(true).KeyChar;
    Console.WriteLine(guessLetter);


    for (int i = 0; i < guessWord.Length; i++)
    {
        if (char.ToLower(guessLetter) == secretWord[i] || char.ToUpper(guessLetter) == secretWord[i])
        {
        //    guessWord[i] = guessLetter;
            guessWord[i] = secretWord[i];
        }
    }

    if (secretWord == string.Concat(guessWord))
    {
        wordGuessed = true;
        Console.WriteLine("정답을 맞추셨습니다!");
        break;
    }
    else
    {
        attempts--;
        if (attempts == 0)
        {
            Console.WriteLine($"정답은 {secretWord} 이었습니다...");
        }
    }

} while (!wordGuessed || attempts != 0);

숫자야구

숫자야구 게임을 영어권에서는 뭐라고 하나 검색해봤더니

Bulls and Cows라고 한다.

 

일단 내가 하는 숫자야구의 룰은,

각 digit 넘버들은 중복되지 않아야하고, 첫번째자리는 0으로 시작할 수 없다.

 

배열로 이걸 해보려다가 머리가 너무 복잡해졌었다. 마침 시간도 다됬고, 조카들이 귀가하는 덕분에 중단했다.

다음날 다시 시작하면서 Linked list를 사용하면 좋겠다는 생각이 들었다!

1. index로 숫자에 접근할 수 있음.

2. 양방향으로 숫자를 삽입할 수 있어서 랜덤숫자 생성이나 userInput을 % / 연산을 통해 간단히 정리할 수 있음.

3. 추후 4자리 숫자야구 등으로 확장할 수 있음!

결론: List<int>를 쓰자!

 

갑자기 확장성에 꽂혀서 List<int> GetDigits(string prompt, int numOfDigit)라는 메소드로 아예 Digit를 입력 받게 만들었다.

level 변수를 생성해서 3을 넣어주었지만, 나중에 4로 바꿔 넣을 수도 있다.

 

strikes는 같은 index를 비교하여 카운트 해주었고,

balls는 List의 Contains()를 이용하였다.

 

//Bulls and Cows

List<int> targetNumber = new List<int>();
List<int> userGuess = new List<int>();
int strikes = 0;
int balls = 0;
int attempt = 0;
bool guessedCorrectly = false;


int level = 4;


//랜덤 숫자 셋업
Random random = new Random();
while (targetNumber.Count < level)
{

    int randomNumber = random.Next(0, 10);
    if (!targetNumber.Contains(randomNumber))
    {
        if (targetNumber.Count == 0 && randomNumber == 0) //첫번째자리 0 입력 방지
        {
            continue;
        }
        targetNumber.Add(randomNumber);
    }
}

do
{
    userGuess = GetDigits($"Enter your guess ({level} digits) (first digit cannot be 0) :", level);
    attempt++;

    //매칭
    for(int i = 0; i < userGuess.Count; i++)
    {
        if (userGuess[i] == targetNumber[i])
        {
            strikes++;
        }else if (targetNumber.Contains(userGuess[i]))
        {
            balls++;
        }
    }

    if (strikes == targetNumber.Count)
    {
        Console.WriteLine($"Congratulations! You've guessed the number in {attempt} attempts.");
        guessedCorrectly = true;
    }
    else
    {
        Console.WriteLine($"{strikes} Strike(s), {balls} Ball(s)");
    }
    strikes = 0;
    balls = 0;
} while (!guessedCorrectly);



List<int> GetDigits(string prompt, int numOfDigit)
{
    bool isNumber = false;
    int number = 0;
    List<int> numbers = new List<int>();

    while(!isNumber)
    {
        Console.Write(prompt);
        if (!int.TryParse(Console.ReadLine(), out number)) // || number <= 100 || number >= 999 지움! (확장성위해서)
        {
            Console.WriteLine("잘못 입력하셨습니다.");
        }
        else
        {
            while (number > 0)
            {
                numbers.Insert(0, number % 10);
                number /= 10;
            }

            if (numbers.Count != numOfDigit)
            {
                Console.WriteLine("잘못 입력하셨습니다.");
                numbers = new List<int>();
            }
            else
            {
                isNumber = true;
            }
        }
    }
    return numbers;
}

느낀점

이른 아침부터 코딩을 하다니... 예전에 코업 구할때가 생각나는 군.


내일 학습 할 것은 무엇인지

내일은 진짜진짜 쉴거임!