반응형
  1. 프로젝트 목표
    1. 숫자 야구 게임 만들기
    2. MaskedTextBox를 이용하여 원하는 데이터만 받기
    3. 중복되지 않는 난수(Random) 만들기
  2. 프로젝트 내용 
    1. 게임 방법
      1. 게임 시작을 하면 플레이어가 알지 못하게 4자리의 난수를 생성(= 문제 숫자, qNum)
        1. 난수는 0~9로 각기 다른 숫자로 구성
      2. 플레이어는 9번의 기회동안 숫자를 입력하여 문제 숫자를 맞추면 승리
      3. 숫자와 위치 둘다 맞추면 1Strike, 숫자는 맞추되 위치를 틀리면 1ball
    2. 주요 사항
      1. 난수 4자리를 각기 다른 숫자로 구성할 것
        1. 각 자리의 중복 확인 구조를 넣을 것
      2. 입력받는 값은 4자리의 숫자일 것
        1. 윈폼의 MaskedTextBox를 이용하여 원하는 값만 받아 처리
  3. 전체 코드
    1. using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace Number_Baseball
      {
          public partial class Form1 : Form
          {
      
              public string qNum;
              public Boolean gameStartFlag;
              public int try_Count;
              int strikeCount = 0;
              int ballCount = 0;
              public Form1()
              {
                  InitializeComponent();
      
                  gameStartFlag = false;
      
              }
      
              private void btn_Start_Click(object sender, EventArgs e)
              {
                  //문제 숫자 만들기
                  Random rd = new Random();
                  string tempNum = "";
                  bool flag = true;
                  int cc = 0;
      
      
                  //문제 숫자4자리의 중복 제거
                  while(flag)
                  {
                      tempNum = "";
                      for(int k=0; k<4; k++)
                      {
                          tempNum += rd.Next(0, 10).ToString();
                      }
                      Console.WriteLine(tempNum);
                      cc = 0;
                      for (int i = 0; i < 4; i++)
                      {
                          for (int j = 0; j < 4; j++)
                          {
                              if (tempNum[i] == tempNum[j])
                              {
                                  cc += 1;
                              }
                          }
                      }
                      if(cc == 4)
                      {
                          flag = false;
                      }
      
                  }
                  qNum = tempNum;
      
      
                  gameStartFlag = true;
                  try_Count = 0;
      
                  //Try Label 초기화
                  label_Num1.Text = "----";
                  label_Num2.Text = "----";
                  label_Num3.Text = "----";
                  label_Num4.Text = "----";
                  label_Num5.Text = "----";
                  label_Num6.Text = "----";
                  label_Num7.Text = "----";
                  label_Num8.Text = "----";
                  label_Num9.Text = "----";
      
                  //Result Label 초기화
                  label_Result1.Text = "----";
                  label_Result2.Text = "----";
                  label_Result3.Text = "----";
                  label_Result4.Text = "----";
                  label_Result5.Text = "----";
                  label_Result6.Text = "----";
                  label_Result7.Text = "----";
                  label_Result8.Text = "----";
                  label_Result9.Text = "----";
      
                  //숫자 입력창 입력 제한 해제
                  maskedtxt_Try.ReadOnly = false;
                  //숫자 입력창 마스크 형식 설정(0은 정수만 가능한 자리수 표시)
                  maskedtxt_Try.Mask = "0000";
      
              }
      
              private void btn_Retire_Click(object sender, EventArgs e)
              {
                  qNum = "";
                  MessageBox.Show("Sorry about that...");
                  gameStartFlag = false;
              }
      
              private void btn_send_Click(object sender, EventArgs e)
              {
                  string tryNum;
                  tryNum = maskedtxt_Try.Text;
      
                  try_Count += 1;
                  string name = "label_Result" + try_Count.ToString();
                  Control ctnResult = this.Controls[name];
                  string name2 = "label_Num" + try_Count.ToString();
                  Control ctnNum = this.Controls[name2];
                  
                  strikeCount = 0;
                  ballCount = 0;
      
                  if (gameStartFlag == true)
                  {
                      if (maskedtxt_Try.MaskCompleted)
                      {
                          compareCheck(tryNum, qNum);
      
                          ctnNum.Text = tryNum;
                          ctnResult.Text = strikeCount + " S  " + ballCount + " B";
                      }
                      else
                      {
                          MessageBox.Show("Enter the number!");
                          try_Count -= 1;
                      }
                  }
                  else
                  {
                      MessageBox.Show("Please Press Start Button.");
                      Console.WriteLine("3");
                  }
      
                  maskedtxt_Try.Clear();
      
                  if(strikeCount == 4)
                  {
                      MessageBox.Show("You Win");
                  }
                  else if(try_Count == 9 && strikeCount != 4)
                  {
                      MessageBox.Show("You Lose");
                  }
              }
      
              public void compareCheck(string a, string b)
              {
                  for (int k = 0; k < 4; k++)
                  {
                      if (a[k] == b[k])
                      {
                          strikeCount += 1;
                      }
                  }
      
                  for (int i=0; i<4; i++)
                  {
                      for(int j=0; j<4; j++)
                      {
                          if(a[i] == b[j])
                          {
                              ballCount += 1;
                          }
                      }
                  }
                  ballCount -= strikeCount;
              }
          }
      }
  4. 윈폼 화면 구성
  5. Check Point
    1.  MaskedTextBox
      1. 일반적인 텍스트 박스(TextBox, RichTextBox등)과 다르게 프로그래머가 원하는 형식, 값만 사용자가 작성 가능하다.
      2. 위의 코드중 95번째줄을 보면 마스크 설정을 한 것을 알 수 있다.
        1. maskedtxt_try.Mask = "0000";
        2. 텍스트박스에 숫자4자리만 들어 갈 수 있도록 설정함 (0이 숫자를, 네개가 네자리를 뜻함)
        3. 관련 자료는 아래 MSDN에서 확인 가능
          1. https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.forms.maskedtextbox.mask?view=net-5.0
    2. random 난수 만들기 (중복 없는 4자리수 만들기)
      1.            while(flag)
                    {
                        tempNum = "";
                        for(int k=0; k<4; k++)
                        {
                            tempNum += rd.Next(0, 10).ToString();
                        }
                        Console.WriteLine(tempNum);
                        cc = 0;
                        for (int i = 0; i < 4; i++)
                        {
                            for (int j = 0; j < 4; j++)
                            {
                                if (tempNum[i] == tempNum[j])
                                {
                                    cc += 1;
                                }
                            }
                        }
                        if(cc == 4)
                        {
                            flag = false;
                        }
                    }
  6. 다운로드
    1. Number_Baseball.exe
      0.01MB
    2. Number_Baseball.zip
      0.05MB
반응형

+ Recent posts