728x90
안녕하세요!
이번 글에서는 C#을 사용하여 콘솔로 숫자야구 게임을 플레이할 수 있는 프로그램을 작성해 보겠습니다.
숫자야구 게임은 4개의 중복되지 않는 랜덤 숫자를 생성하고, 사용자가 숫자를 입력하여 숫자와 위치가 맞으면 스트라이크, 숫자만 맞으면 볼을 계산하는 게임입니다.
사용자가 4개의 숫자를 모두 맞추면 게임이 종료됩니다.
< 예제코드 >
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Console.WriteLine("숫자야구 게임을 시작합니다!");
// 4개의 중복되지 않은 랜덤 숫자 생성
List<int> secretNumbers = GenerateSecretNumbers();
int attempts = 0;
while (true)
{
attempts++;
Console.Write("4개의 중복되지 않는 숫자를 입력하세요 (0부터 9까지): ");
List<int> userNumbers = GetUserInput();
// 4개의 숫자가 입력되었는지 확인
if (userNumbers.Count != 4)
{
Console.WriteLine("4개의 숫자를 입력해주세요.");
continue;
}
// 중복된 숫자가 입력되었는지 확인
if (HasDuplicateNumbers(userNumbers))
{
Console.WriteLine("중복된 숫자가 있습니다. 다시 입력해주세요.");
continue;
}
// 결과 계산
int strikes = 0;
int balls = 0;
for (int i = 0; i < secretNumbers.Count; i++)
{
if (secretNumbers[i] == userNumbers[i])
{
strikes++;
}
else if (secretNumbers.Contains(userNumbers[i]))
{
balls++;
}
}
// 결과 출력
Console.WriteLine($"결과: {strikes}스트라이크, {balls}볼, {4 - strikes - balls}아웃");
// 정답을 맞춘 경우 게임 종료
if (strikes == 4)
{
Console.WriteLine($"축하합니다! {attempts}번 만에 정답을 맞추셨습니다.");
break;
}
}
}
// 4개의 중복되지 않은 랜덤 숫자 생성
static List<int> GenerateSecretNumbers()
{
List<int> numbers = new List<int>();
Random random = new Random();
while (numbers.Count < 4)
{
int randomNumber = random.Next(0, 10);
if (!numbers.Contains(randomNumber))
{
numbers.Add(randomNumber);
}
}
return numbers;
}
// 사용자 입력 받기
static List<int> GetUserInput()
{
string input = Console.ReadLine();
List<int> numbers = new List<int>();
foreach (char c in input)
{
if (char.IsDigit(c))
{
int number = int.Parse(c.ToString());
numbers.Add(number);
}
}
return numbers;
}
// 중복된 숫자 확인
static bool HasDuplicateNumbers(List<int> numbers)
{
HashSet<int> uniqueNumbers = new HashSet<int>(numbers);
return uniqueNumbers.Count != numbers.Count;
}
}
< 코드해석 >
using System;
using System.Collections.Generic;
- 해당 네임스페이스를 임포트합니다.
- System 네임스페이스는 콘솔 입출력 등의 기능을 사용하기 위해 필요합니다.
Console.WriteLine("숫자야구 게임을 시작합니다!");
- "숫자야구 게임을 시작합니다!"라는 메시지를 출력합니다.
List<int> secretNumbers = GenerateSecretNumbers();
- GenerateSecretNumbers 메소드를 호출하여 4개의 중복되지 않은 랜덤 숫자를 생성합니다.
- 생성된 랜덤 숫자를 secretNumbers 리스트에 저장합니다.
int attempts = 0;
- attempts 변수를 선언하고 초기값을 0으로 설정합니다.
- 이 변수는 사용자의 시도 횟수를 저장합니다.
while (true) { ... }
- 루프를 사용하여 게임을 계속 진행합니다.
- 무한 루프이기 때문에 게임 종료 조건이 만족되면 break를 사용하여 루프를 빠져나옵니다.
attempts++;
Console.Write("4개의 중복되지 않는 숫자를 입력하세요 (0부터 9까지): ");
List<int> userNumbers = GetUserInput();
- 시도 횟수를 하나 늘린 후 사용자로부터 4개의 숫자를 입력받습니다.
- GetUserInput 메소드를 호출하여 사용자 입력을 받고, userNumbers 리스트에 저장합니다.
if (userNumbers.Count != 4)
{
Console.WriteLine("4개의 숫자를 입력해주세요.");
continue;
}
- 사용자 입력이 4개의 숫자로 이루어져 있는지 확인합니다.
- 만약 4개가 아니라면 "4개의 숫자를 입력해주세요."라는 메시지를 출력하고 continue를 사용하여 다음 루프로 이동합니다.
if (HasDuplicateNumbers(userNumbers))
{
Console.WriteLine("중복된 숫자가 있습니다. 다시 입력해주세요.");
continue;
}
- 사용자 입력에 중복된 숫자가 있는지 확인합니다.
- HasDuplicateNumbers 메소드를 호출하여 중복된 숫자가 있다면 "중복된 숫자가 있습니다.
- 다시 입력해주세요."라는 메시지를 출력하고 continue를 사용하여 다음 루프로 이동합니다.
int strikes = 0;
int balls = 0;
for (int i = 0; i < secretNumbers.Count; i++)
{
if (secretNumbers[i] == userNumbers[i])
{
strikes++;
}
else if (secretNumbers.Contains(userNumbers[i]))
{
balls++;
}
}
- 결과를 계산합니다.
- strikes와 balls 변수를 선언하고 초기값을 0으로 설정합니다.
- strikes는 숫자와 위치가 맞는 스트라이크의 개수를, balls는 숫자만 맞는 볼의 개수를 저장합니다.
- for 루프를 사용하여 secretNumbers 리스트와 userNumbers 리스트를 비교합니다.
- secretNumbers[i] == userNumbers[i]를 사용하여 숫자와 위치가 맞으면 strikes를 증가시킵니다.
- else if (secretNumbers.Contains(userNumbers[i]))를 사용하여 숫자만 맞으면 balls를 증가시킵니다.
Console.WriteLine($"결과: {strikes}스트라이크, {balls}볼, {4 - strikes - balls}아웃");
// 정답을 맞춘 경우 게임 종료
if (strikes == 4)
{
Console.WriteLine($"축하합니다! {attempts}번 만에 정답을 맞추셨습니다.");
break;
}
- 결과를 출력합니다.
- 문자열 보간(interpolation)을 사용하여 출력 문장을 구성합니다.
- 정답을 맞춘 경우, 저장된 시도횟수를 출력하고 게임을 종료합니다.
static List<int> GenerateSecretNumbers()
{
List<int> numbers = new List<int>();
Random random = new Random();
while (numbers.Count < 4)
{
int randomNumber = random.Next(0, 10);
if (!numbers.Contains(randomNumber))
{
numbers.Add(randomNumber);
}
}
return numbers;
}
- GenerateSecretNumbers 메소드는 4개의 중복되지 않은 랜덤 숫자를 생성합니다.
- 빈 numbers 리스트를 만들고, Random 클래스를 사용하여 랜덤한 숫자를 생성합니다.
- 생성된 숫자가 numbers 리스트에 포함되지 않으면 리스트에 추가합니다.
- 과정을 반복하여 4개의 숫자가 생성될 때까지 진행합니다.
static List<int> GetUserInput()
{
string input = Console.ReadLine();
List<int> numbers = new List<int>();
foreach (char c in input)
{
if (char.IsDigit(c))
{
int number = int.Parse(c.ToString());
numbers.Add(number);
}
}
return numbers;
}
- GetUserInput 메소드는 사용자로부터 입력을 받아 리스트로 변환하여 반환합니다.
- 사용자 입력은 문자열 형태로 받고, char.IsDigit(c)를 사용하여 숫자인지 확인합니다.
- 숫자인 경우, 문자열을 정수로 변환하여 리스트에 추가합니다.
static bool HasDuplicateNumbers(List<int> numbers)
{
HashSet<int> uniqueNumbers = new HashSet<int>(numbers);
return uniqueNumbers.Count != numbers.Count;
}
- HasDuplicateNumbers 메소드는 중복된 숫자가 있는지 확인합니다.
- HashSet을 사용하여 중복을 제거한 후, 중복이 있는 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.
코드를 실행하면 "숫자야구 게임을 시작합니다!"라는 메시지가 출력되고, 게임을 플레이할 수 있습니다.
사용자가 입력한 숫자와 시도 횟수에 따라 결과가 출력되며, 정답을 맞히면 게임이 종료됩니다.
감사합니다!
728x90
'[C#] > 콘솔 프로그래밍' 카테고리의 다른 글
[C#] 콘솔 프로그래밍 : 시저 암호 (23) | 2023.07.14 |
---|---|
[C#] 콘솔 프로그래밍 : 종료 대기 (18) | 2023.07.12 |
[C#] 콘솔 프로그래밍 : 길찾기 게임 (26) | 2023.07.11 |
[C#] 콘솔 프로그래밍 : 요일 판단 (20) | 2023.07.10 |
[C#] 콘솔 프로그래밍 : 콘솔 가위바위보 게임 (25) | 2023.07.06 |