숫자 야구게임이라고 있습니다.
숫자 야구게임은 Random으로 생성된 서로 다른 3자리 숫자를 맞추는 게임입니다. Random으로 생성된 숫자와 플레이어가 입력한 3자리 숫자 중 서로 자릿수(위치)가 일치하는 경우에는 Strike, 그리고 3자리 Random 숫자에는 포함 되지만 서로 위치한 자릿수가 틀릴 경우 Ball 판정을 내리는 비교적 단순한 게임입니다.
이렇게 반복해서 숫자를 입력하면서 몇 번만에 랜덤으로 생성된 3자리 숫자를 정확히 맞추는지 확인해 보는 게임입니다.
단순하지만 나름 머리를 써야 최대한 빨리 맞출 수 있는 게임입니다. 다른 사람과 대결에서 빨리 맞추는 사람이 승자가 되는 게임이기도 합니다.
이번 글에서는 C#으로 숫자 야구 게임을 개발하면서 난수를 처리하는 Random 클래스 사용 방법과 ListBox 컨트롤의 사용 방법에 대해 알아보겠습니다.
본문에 작성한 소스는 C# 숫자야구게임으로 바로 실행해 볼 수 있는 프로그램입니다.
C#에서 Random(난수 발생) 사용하기
– C#에서 랜덤(난수 발생)을 사용하기 위해 Random 클래스를 사용합니다.
– 랜덤 값을 가져오기 위해서는 Next() 메소드를 사용하게 됩니다.
- Next(); – 정수(int) 값 리턴
- Next(int minValue, int maxValue); – 정수(int) 값 리턴, maxValue – 1
- Next(int maxValue); – 정수(int) 값 리턴
- NextBytes(byte[] buffer);
- NextDouble(); – 0.0에서 1.0 미만까지의 단일 부동 소수점 값 리턴
private void MenuNewGame_Click(object sender, EventArgs e)
{
int value1 = 0, value2 = 0, value3 = 0;
//난수 생성을 위한 클래스 선언
Random random = new Random();
//서로 다른 3자리 숫자를 만들기 위해 계속 반복 작업 수행
//무한루트를 방지하기 위해 1000번까지만 반복
for (int i = 0; i < 1000; i++)
{
int rnd = random.Next(1, 10); //1~9 사이의 단일 정수
if (value1 == 0)
value1 = rnd;
else if (value1 != 0 && value2 == 0 && value1 != rnd)
value2 = rnd;
else if (value1 != 0 && value2 != 0 && value3 == 0 && value1 != rnd && value2 != rnd)
value3 = rnd;
if (value3 != 0)
break;
}
//난수 생성으로 만들어진 서로 다른 3자리 숫자를 합침 = 찾아야 할 3자리 숫자
if (value1 != 0 && value2 != 0 && value3 != 0)
ResultNumber = value1.ToString() + value2.ToString() + value3.ToString();
//리스트박스, 실행 횟수 클리어
listBox.Items.Clear();
labelCount.Text = “0”;
}
|
C#에서 ListBox 컨트롤 사용하기
– C#에서 ListBox에 리스트를 추가한다는 것은 Items에 인덱스가 추가된다는 의미입니다.
- listBox.Items.Add(item) : ListBox의 마지막에 항목을 추가
- listBox.Items.AddRange(collectionValue) : ListBox에 한번에 컬렉션한 내용을 추가
- listBox.Items.Insert(index, item) : ListBox의 지정 인덱스 위치에 항목 삽입
- listBox.Items.Clear() : ListBox를 클리어 시킴
- listBox.Items.RemoveAt(index) : ListBox의 지정 인덱스 위치의 항목을 삭제
private void NumberCheck()
{
if (ResultNumber == null || ResultNumber == “”)
{
MessageBox.Show(“Menu에서 [새로 시작하기]를 해 주세요.”);
return;
}
if (textNumber.Text.Length != 3)
{
MessageBox.Show(“서로 다른 3자리 숫자를 입력하세요.”);
return;
}
if (textNumber.Text.Substring(0, 1) == textNumber.Text.Substring(1, 1) ||
textNumber.Text.Substring(0, 1) == textNumber.Text.Substring(2, 1) ||
textNumber.Text.Substring(1, 1) == textNumber.Text.Substring(2, 1))
{
MessageBox.Show(“서로 다른 3자리 숫자를 입력하세요.”);
return;
}
//시도 횟수를 1씩 누적시킴
labelCount.Text = (int.Parse(labelCount.Text) + 1).ToString();
int Strike = 0, Ball = 0;
//위치하는 자리수가 일치하면 Strike 판정
if (ResultNumber.Substring(0, 1) == textNumber.Text.Substring(0, 1))
Strike += 1;
if (ResultNumber.Substring(1, 1) == textNumber.Text.Substring(1, 1))
Strike += 1;
if (ResultNumber.Substring(2, 1) == textNumber.Text.Substring(2, 1))
Strike += 1;
//3자리 숫자에 포함은 되지만 위치하는 자리수가 다른 경우 Ball 판정
if (ResultNumber.Substring(0, 1) == textNumber.Text.Substring(1, 1) || ResultNumber.Substring(0, 1) == textNumber.Text.Substring(2, 1))
Ball += 1;
if (ResultNumber.Substring(1, 1) == textNumber.Text.Substring(0, 1) || ResultNumber.Substring(1, 1) == textNumber.Text.Substring(2, 1))
Ball += 1;
if (ResultNumber.Substring(2, 1) == textNumber.Text.Substring(0, 1) || ResultNumber.Substring(2, 1) == textNumber.Text.Substring(1, 1))
Ball += 1;
//리스트박스에 판정결과 출력
string ResultMsg = string.Format(“{0} Strike {1} Ball”, Strike.ToString(), Ball.ToString());
//마지막 입력한 내용이 첫째줄에 오도록 Insert() 인덱스 0에 추가함
//끝줄에 출력되도록 하려면 listBox.Items.Add()로 해주면 됨
listBox.Items.Insert(0, string.Format(“[{0}] {1} – {2}”, labelCount.Text, textNumber.Text, ResultMsg));
if (Strike == 3)
{
MessageBox.Show(“숫자를 모두 맞추었습니다.”);
//현재 게임을 종료함
ResultNumber = “”;
}
textNumber.Text = “”;
}
|
※ 이상으로 C#에서 난수 발생을 위한 Random 사용 방법과 목록을 출력할 ListBox 사용 방법을 실제 예제를 통해 알아보았습니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^