행맨, 숫자야구 콘솔앱
행맨은 저번에 했던 것 그대로 제출했다.
//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;
}
느낀점
이른 아침부터 코딩을 하다니... 예전에 코업 구할때가 생각나는 군.
내일 학습 할 것은 무엇인지
내일은 진짜진짜 쉴거임!
'부트캠프 > 사전캠프' 카테고리의 다른 글
[내일배움 사전캠프_2025JUN27]내가 만들고 싶은 게임 찾아보기 (0) | 2025.06.27 |
---|---|
[내일배움 사전캠프_2025JUN26]쉽게 배우는 모바일 게임 5주차 - 게임 완성하기 1 (마무리) (0) | 2025.06.26 |
[내일배움 사전캠프_2025JUN25]쉽게 배우는 모바일 게임 4주차 - 르탄이 카드 뒤집기 게임 1 (마무리) (0) | 2025.06.25 |
[내일배움 사전캠프_2025JUN24]쉽게 배우는 모바일 게임 3주차 - 고양이 밥주기 게임 2 (마무리) (0) | 2025.06.24 |
[내일배움 사전캠프_2025JUN20]쉽게 배우는 모바일 게임 3주차 - 고양이 밥주기 게임 1 (0) | 2025.06.20 |