[WinForms] 랜덤 숫자 맞추기 게임

00·2025년 2월 7일

프로젝트

목록 보기
5/14

1. 프로젝트 소개

  • 목표
    랜덤한 수를 생성하고, 생성된 숫자를 지정된 횟수 내에 맞추면 승리하고 맞추지 못하면 실패하는 게임을 윈도우 프로그램으로 만듭니다.

  • 사용 기술

    • C#
    • Windows Forms
  • 개발 환경

    • Visual Studio 2022
    • .NET Framework
  • 실행 화면

2. 기능 설명

  • 게임 시작
    "시작" 버튼을 클릭하면 1부터 20 사이의 랜덤 숫자가 정답으로 정해지고, 사용자에게 10번의 기회가 주어집니다.
  • 숫자 입력
    텍스트 박스에 숫자를 입력하고 "입력" 버튼을 클릭하여 정답을 맞춥니다.
  • 결과 확인
    입력한 숫자가 정답보다 높거나 낮으면 메시지가 표시되고, 기회가 1회 차감됩니다.
  • 승리/패배 판정
    정답을 맞추면 "승리했습니다!!!" 메시지가, 10번의 기회 내에 정답을 맞추지 못하면 "실패했습니다." 메시지가 표시됩니다.

3. 어려웠던 점과 해결 과정

  • Random 클래스 활용: 처음에는 Random 클래스를 사용하여 난수를 생성하는 방법을 몰랐습니다. MSDN 문서를 참고하여 Random 클래스의 Next() 메서드를 사용하는 방법을 익히고, 1부터 20 사이의 난수를 생성하는 코드를 작성할 수 있었습니다.
  • 사용자 입력 처리: 텍스트 박스에 입력된 값을 숫자로 변환하고, 입력 값에 대한 유효성 검사를 수행하는 데 어려움을 겪었습니다. Int32.Parse() 메서드를 사용하여 문자열을 정수형으로 변환하고, TryParse() 메서드를 사용하여 유효성 검사를 수행하는 방법을 익혔습니다.
  • 게임 로직 구현: 정답 확인, 기회 차감, 게임 종료 조건 등 게임 로직을 구현하는 데 어려움을 겪었습니다. 조건문과 변수 등 게임 로직을 살피고, 코드를 수정하여 문제를 해결했습니다.

4. 배운 점

  • 이벤트 처리: 윈도우 폼에서 이벤트 핸들러를 사용하여 사용자 입력을 처리하는 방법을 익혔습니다.
  • 컨트롤 활용: 텍스트 박스, 버튼, 라벨 등 다양한 컨트롤을 사용하여 사용자 인터페이스를 구성하는 방법을 배웠습니다.
  • 랜덤 숫자 생성: Random 클래스를 사용하여 랜덤 숫자를 생성하는 방법을 익혔습니다.
  • 조건문과 반복문 활용: if 문을 사용하여 조건에 따라 다른 코드를 실행하고, for 또는 while 문을 사용하여 반복적인 작업을 처리하는 방법을 익혔습니다.
  • 문자열과 숫자 변환: Int32.Parse() 메서드를 사용하여 문자열을 숫자로 변환하는 방법을 배웠습니다.

5. 디자인 및 코드

(1) 컨트롤

레이블(Label)

  • 레이블은 게임 진행 상황(숫자를 맞추기 위해 시도한 횟수가 얼만큼 남았는지)과 결과를 표시합니다.
  • 레이블(Label) 컨트롤을 폼(Form1) 화면에 배치합니다. 속성창에서 (Name) 속성값은 display로 변경하고, Text 속성값은 "게임을 시작합니다"로 변경합니다.
  • 레이블에 출력되는 문구를 중앙에 정렬하기 위해 속성창에서 AutoSize 값을 false로, TextAlign을 MiddleCenter로 변경합니다.
  • 속성창에서 Dock 속성값을 Top으로 변경하여 레이블의 문구가 화면 위에 고정된 상태로 보이게 합니다.

텍스트박스(TextBox)

  • 텍스트박스는 사용자가 입력한 숫자를 표시합니다. 속성창에서 (Name) 속성값은 textBox로 변경합니다.

버튼(Button)

  • 버튼은 게임을 시작하고, 숫자를 입력하기 위해 사용합니다.

  • 입력 버튼: 버튼(Button) 컨트롤을 가져와 화면에 배치하고,속성창에서 (Name) 속성값은 ButtonInput으로 변경합니다.

  • 게임 시작 버튼: 버튼(Button) 컨트롤을 가져와 화면에 배치하고, 버튼의 (Name) 속성값은 ButtonStart로 변경합니다. (Text) 속성값은 "게임 시작", (Dock) 속성값은 Bottom으로 변경합니다.

실행 결과


(2) 소스 코드

게임 시작 버튼

  • 네임 스페이스와 클래스 이름은 자동으로 생성되며, 추가한 마우스 클릭 이벤트에 따라 ButtonStart_Click 메소드도 생성된 상태입니다.
  • findNumber와 chance 변수를 만들고, ButtonStart_Click 메소드 내부를 구현합니다. findNumber는 임의로 생성된 숫자가 저장될 변수이고, chance는 숫자를 맞추기 위한 횟수를 의미합니다.
using System;
using System.Windows.Forms;

namespace FindNumber
{
    public partial class Form1 : Form
    {
        private int findNumber = 0;
        private int chance = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void ButtonStart_Click(object sender, EventArgs e)
        {
            var rand = new Random();
            findNumber = rand.Next(1, 21);
            chance = 10;
            display.Text = "맞출 숫자를 입력하세요.";
        }
    }
}

ButtonStart_Click 메서드

  • 게임 시작 버튼이 눌리면 실행되는 ButtonStart_Click 메서드입니다. 랜덤 숫자를 생성하고 초기화 작업을 수행합니다.
  • chance 변수에 10을 넣어 기회를 숫자를 맞출 기회를 10회 부여합니다. 난이도를 조절하기 위해 숫자를 더 큰 수로 변경하거나 기회를 더 많이 줄 수 있습니다.
  • display 변수는 레이블(Label)의 (Name) 속성에서 정한 이름입니다. 따라서 display.Text에 문자열을 넣으면 레이블에 해당 문자열이 출력됩니다.

Random 클래스

  • Random 클래스를 생성해 rand 라는 인스턴스 변수를 생성합니다. Random 클래스는 임의의 수를 생성할 때 사용하는 클래스이며, Next 메서드를 통해 임의의 정수를 생성합니다.
  • Next 메서드: 매개 변수가 하나인 경우 0부터 입력된 매개 변수 보다 1작은 수의 범위 중 하나를 반환합니다. 매개 변수가 두 개인 경우 시작과 종료의 범위를 정할 수 있습니다. Next(1, 21)이라고 할 경우 1부터 20까지의 정수 중 하나를 가져옵니다. 1부터 20 사이의 정수를 가져와 findNumber 변수에 저장합니다.

실행 결과


숫자 비교

  • 사용자가 숫자를 입력하고 비교하는 코드를 추가합니다.
  • 입력 버튼에 Click 이벤트를 추가합니다.
using System;
using System.Windows.Forms;

namespace FindNumber
{
    public partial class Form1 : Form
    {
        private int findNumber = 0;
        private int chance = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void ButtonStart_Click(object sender, EventArgs e)
        {
            var rand = new Random();
            findNumber = rand.Next(1, 21);
            chance = 10;
            display.Text = "맞출 숫자를 입력하세요.";
        }

        private void ButtonInput_Click(object sender, EventArgs e)
        {
            int inputNumber = Int32.Parse(textBox.Text);

            if(inputNumber == findNumber)
            {
                display.Text = "승리했습니다!!!";
            }
            else
            {
                chance--;
                display.Text = "기회는 " + chance + "번 남았습니다.";
            }

            if(chance <= 0)
            {
                display.Text = "실패했습니다.";
            }
        }
    }
}

Int32.Parse()

  • 사용자가 입력한 숫자는 텍스트박스(TextBox)를 통해 받을 수 있으며 기본 형식은 문자열입니다. 따라서 비교하기 위해서는 정수 형태로 변환해야 합니다.
  • Int32 메소드는 다른 형식을 32비트 부호가 있는 정수형으로 변환합니다. Int32 메소드로 텍스트박스에 입력된 문자를 숫자로 변환합니다. inputNumber 변수에는 사용자가 입력한 문자열을 숫자로 변환한 값을 저장합니다.

조건문

  • if 문을 사용하여 정답 확인 및 게임 종료 조건을 판별합니다.
  • inputNumber에 저장된 값이 임의로 생성한 findNumber와 같은 경우 게임에 승리하는 코드를 작성하고, 같지 않으면 남은 기회를 레이블에 출력하고 기회를 1번 차감합니다.
  • 기회가 0보다 작으면 실패 메시지를 출력합니다.

실행 결과


개선

  • 힌트 제공
    ButtonInput_Click 메서드에서 입력한 숫자가 숨겨진 숫자보다 큰지 작은지에 따라 힌트 메시지를 출력하도록 코드를 수정했습니다.
  • 정답 표시
    ButtonInput_Click 메서드에서 기회가 0 이하일 때 실패 메시지를 출력하는 코드에 정답을 포함하도록 수정했습니다.
  • 실행 결과

0개의 댓글