숫자 야구 게임을 작성하세요.
- 컴퓨터가 3자리의 숫자를 선택하면 사용자가 그 숫자를 맞추는 게임을 구현하세요. 각 자리의 숫자를 비교하여 스트라이크와 볼의 개수를 출력합니다.
문제를 접하고 푸는 순서를 정해보았다.
targetNumber배열에 저장한다.UserGuess 배열에 사용자가 추측한 숫자를 저장한다. 이 숫자 중 targetNumber의 배열을 비교하여 자릿수와 숫자가 모두 맞는 경우와 자릿수는 맞지 않지만 숫자가 포함된 경우를 판별한다.strikes와 balls를 지정하고 3숫자 모두 자릿수와 숫자가 맞으면 GuessedCorrectly를 true로 저장한다.이 순서에 따라 진행해보겠다.
먼저, 난수로 3자리의 숫자를 생성하고 이를 targetNumber 배열에 저장하겠다.
Random random = new Random();
int[] targetNumber = new int[3];
int Num1 = random.Next(0, 10);
targetNumber[0] = Num1;
int Num2 = random.Next(0, 10);
targetNumber[1] = Num2;
int Num3 = random.Next(0, 10);
targetNumber[2] = Num3;
다음으로 guessedcorrectly 불리언 변수를 false일 때 반복되는 반복문을 작성한다. 사용자에게 입력값을 받는다.
bool guessedcorrectly = false;
while (!guessedcorrectly)
{
Console.Write("세 자리 숫자를 입력하세요");
string Input = Console.ReadLine();
}
그 입력값을 숫자 배열로 변환한다.
int[] userGuess = new int[3];
for (int i = 0; i < 3; i++)
{
userGuess[i] = Convert.ToInt32(Input[i]);
}
다음으로 strikes와 balls 변수를 선언하고, 조건에 맞을 때 1씩 증가시킨다.
for (int i = 0; i < 3; i++)
{
if (userGuess[i] == targetNumber[i])
{
strikes++;
}
else if (userGuess[i] == targetNumber[0] || userGuess[i] == targetNumber[1] || userGuess[i] == targetNumber[2])
{
balls++;
}
}
마지막으로 결과를 출력시킨다.
Console.WriteLine($"결과: {strikes}스트라이크, {balls}볼");
if (strikes == 3)
{
Console.WriteLine("정답입니다! 게임을 종료합니다.");
guessedcorrectly = true;
}
그리고 출력해보았다.

오류가 발생한 것을 확인할 수 있었다. 어떤 오류인지 알아본 결과, input[i]는 문자열이 아니라 문자이기 때문에 Convert.ToInt32함수로 변환하면 유니코드 (48+i)로 반환된다는 사실을 알았다. 그러므로 input[i]에 유니코드 48번인 0을 빼야 (48+i)-48이므로 정상적으로 i가 반환된다는 사실을 배웠다.
또한,


세자리 숫자가 아닌 숫자를 입력하면 이런식으로 오류가 발생했다. 이 오류도 해결해야 했다.
int Num1 = random.Next(0, 10);
targetNumber[0] = Num1;
int Num2 = random.Next(0, 10);
targetNumber[1] = Num2;
int Num3 = random.Next(0, 10);
targetNumber[2] = Num3;
또한 이 코드를 더 간단하게 수정하고, 이 숫자 중 중복된 숫자가 있지 않게 하기 위한 방법이 필요했다.
먼저 세자리 숫자가 아닌 경우와 숫자가 아닌 자료형을 판별하기 위해
if (Input.Length != 3 || !int.TryParse(Input, out _))
{
Console.WriteLine("세 자리 숫자를 정확히 입력하세요.");
continue;
}
를 추가하였다. 다음으로 단순하게 랜덤 난수를 세자리 생성하는 코드를 랜덤 난수 세자리가 중복되지 않은 숫자 세개를 생성하는 코드로 수정하였다.
int count = 0;
while (count < 3)
{
int Num = random.Next(0, 10);
bool isSame = false;
for (int i = 0; i < count; i++)
{
if (targetNumber[i] == Num)
{
isSame = true;
break;
}
}
if (!isSame)
{
targetNumber[count] = Num;
count++;
}
}
먼저 count변수를 선언하고, 3개의 숫자를 뽑을 때까지 반복하도록 만든다.
다음으로 0부터 9까지의 난수를 Num에 저장 후,
이 순서에 뽑은 Num이 이전까지 뽑은 Num과 중복되는지를 확인한다.
만약 중복되지 않은 숫자라면, 배열에 저장하고 count를 1 늘린다.
최종 완성된 코드는 다음과 같다.
Random random = new Random();
int[] targetNumber = new int[3];
int count = 0;
while (count < 3)
{
int Num = random.Next(0, 10);
bool isSame = false;
for (int i = 0; i < count; i++)
{
if (targetNumber[i] == Num)
{
isSame = true;
break;
}
}
if (!isSame)
{
targetNumber[count] = Num;
count++;
}
}
bool guessedcorrectly = false;
while (!guessedcorrectly)
{
Console.Write("세 자리 숫자를 입력하세요");
string Input = Console.ReadLine();
if (Input.Length != 3 || !int.TryParse(Input, out _))
{
Console.WriteLine(" 세 자리 숫자를 정확히 입력하세요.");
continue;
}
int[] userGuess = new int[3];
for (int i = 0; i < 3; i++)
{
userGuess[i] = Input[i]-'0';
}
int strikes = 0;
int balls = 0;
for (int i = 0; i < 3; i++)
{
if (userGuess[i] == targetNumber[i])
{
strikes++;
}
else if (userGuess[i] == targetNumber[0] || userGuess[i] == targetNumber[1] || userGuess[i] == targetNumber[2])
{
balls++;
}
}
Console.WriteLine($"결과: {strikes}스트라이크, {balls}볼");
if (strikes == 3)
{
Console.WriteLine("정답입니다! 게임을 종료합니다.");
guessedcorrectly = true;
}
}
실제로 구동해보니 다음과 같이 출력했다.
