티스토리 뷰

반응형

 

 

 

안녕하세요,
배곧동개발자 입니다.

 

 


"뭐를 하면 재미가 좀 있을까?"

 

 

 


고민하다 간단한 프로젝트를 통해 여러 언어들의 개념을 다시 정립해보고자 시작한 별거없고 작지만 소중한 "작은 프로젝트"

지난번 포스팅에 이어서 로또번호 생성 프로그램을 마저 만들어볼까해요- 아마 이번 포스팅으로 끝이 날듯합니다!

 

 

이전글
 

로또번호 생성 프로그램 Step1 #C# #씨샵 #작은프로젝트 #random함수 #predicate #초보자

안녕하세요, 배곧동개발자 입니다. "뭐를 하면 재미가 좀 있을까?" 고민을 하던 중 C#을 이용한 간단한 윈도우앱, jsp를 이용한 간단한 웹사이트, flutter를 이용한 웹앱 등 아주 작지만 소중한 프로

yongtech.tistory.com

 

 




우리는 이미 랜덤한 숫자 5개를 뽑아내는데 성공을 했지요- 사실상 핵심 로직은 다 짠 상태인거고!

 

이제 이 5개의 숫자가 이쁘게 보여지도록! UI를 한번 만들어볼까 합니다. 

 

공대생 감각으로 FormBorderStyle와 BackColor를 건드려서 요렇게 슬쩍 바꿔보았어요! 참고로 저는 이쁘게만드는거 정말 못합니다.

 

 

 

 

여기에 공을 그릴건데요! 방법은 정말 여러가지가 있지만, 저는 귀찮으니까! panel에 동그라미를 그리고 그 위에 label로 숫자를 넣어줄겁니다! 

 

 

 

 

일단 이렇게 해놓고, panel에 동그라미를 그려줄거에요!

 

 

private void drawCircle()
{
    Graphics g = panel1.CreateGraphics();
    Rectangle rect = new Rectangle(0, 0, 50, 50);
    g.FillEllipse( Brushes.Black, rect);
    g.Dispose();
}

 

 

사이즈 50짜리 검정색 원을 panel에 그려넣으라는 코드입니다- 저걸 실행하면!

 

 

 

 

짜잔, 이렇게 원이 생기면서 공 모양으로 바뀌었죠? 그러면 panel과 label을 5개 복붙해주고 숫자까지 넣어줘봅시다!

 

 

private void drawCircle()
{
    Rectangle rect = new Rectangle(0, 0, 50, 50);

    Graphics g1 = panel1.CreateGraphics();
    g1.FillEllipse( Brushes.Black, rect);
    g1.Dispose();
    label1.Text = numList[0].ToString();

    Graphics g2 = panel2.CreateGraphics();
    g2.FillEllipse(Brushes.Black, rect);
    g2.Dispose();
    label2.Text = numList[1].ToString();

    Graphics g3 = panel3.CreateGraphics();
    g3.FillEllipse(Brushes.Black, rect);
    g3.Dispose();
    label3.Text = numList[2].ToString();

    Graphics g4 = panel4.CreateGraphics();
    g4.FillEllipse(Brushes.Black, rect);
    g4.Dispose();
    label4.Text = numList[3].ToString();

    Graphics g5 = panel5.CreateGraphics();
    g5.FillEllipse(Brushes.Black, rect);
    g5.Dispose();
    label5.Text = numList[4].ToString();
}

 

 

 

 

자! 어때요? 조금씩 모양이 완성 되어 가죠?

 

하지만, 저렇게 중복되는 소스가 많다면 참 보기 불편하고 짜기도 불편하죠! 저 공을말이지요, UserControl로 한번 바꿔보겠습니다- 

 

 

반응형

 

이렇게 눌러서 새로 사용자 정의 컨트롤, 즉 UserControl 을 하나 만들어줍니다. 이름은 마음대로!

 

크기는 50,50으로 만들고 레이블까지 넣어줍니다! 약간 다른점은 굳이 panel을 넣지 않고 폼 자체에 입혀버린다는 사실-

 

 

// 생성자에서 받아서 사용할 전역변수
int num = 0;

// 생성자
public lottoCircle(int _num)
{
    InitializeComponent();
    // 번호를 가져와서 전역변수로 저장
    num = _num;
}

private void setCircle()
{
    Graphics g = this.CreateGraphics();
    Rectangle rect = new Rectangle(0, 0, 50, 50);
    g.FillEllipse(getBrush(), rect);
    g.Dispose();

    label1.Text = num.ToString();
}

 

 

생성자로 번호를 가져와서 전역변수로 저장해놓고 색깔입힐 때에 사용해줍시다!

 

setCircle에 있는 내용은 앞에 썼던 함수지요? 다만! 다른점이 있다면 getBrush 라는 함수를 사용했습니다-

 

공의 색깔을 입혀주기 위해 새로 만든 함수지요-

 

 

private Brush getBrush()
{
    Brush b = null;
    if (num > 0 && num < 11)
    {
        b = Brushes.Gold;
        label1.BackColor = Color.Gold;
    }
    else if (num > 10 && num < 21)
    {
        b = Brushes.DodgerBlue;
        label1.BackColor = Color.DodgerBlue;
    }
    else if (num > 20 && num < 31)
    {
        b = Brushes.OrangeRed;
        label1.BackColor = Color.OrangeRed;
    }
    else if (num > 30 && num < 41)
    {
        b = Brushes.DimGray ;
        label1.BackColor = Color.DimGray;
    }
    else if (num > 40)
    {
        b = Brushes.ForestGreen;
        label1.BackColor = Color.ForestGreen;
    }
    return b;
}

 

 

로또 공은 10단위로 색이 다르다는 점!  특별한 것은 없고 그냥 색깔 입혀주는 용도입니다- 

 

그리고 위에 setCircle을 사용하기 위해서 폼의 load 이벤트에 setCircle를 넣어줍니다! 생성자에 넣으시면 안되고 반드시 load 이벤트에 넣어주셔야합니다

 

 

private void lottoCircle_Load(object sender, EventArgs e)
{
    setCircle();
}

 

 

이제 이렇게 공들여 만든 userControl을 mainForm에 추가 볼까요-

 

 

private void addCircle(int num, int n)
{
    lottoCircle lc = new lottoCircle(num);

    // 왼쪽에서 n번째만큼
    lc.Left = (60 * n) + 10;
    lc.Top = 40;

    this.Controls.Add(lc);
}

private void getNumber()
{
    // 중복 체크하기 위한 List
    List<int> numList = new List<int>();
    Random rand = new Random();

    int cnt = 0;
    while(cnt < 5)
    {
        int num = rand.Next(1, 45);

        // list에 값이 들어있지 않은 경우 list에 넣은 후 값 출력
        if (!numList.Exists((_num) => _num == num))
        {
            // 그려주기
            addCircle(num, cnt);
            numList.Add(num);
            cnt++;
        }
    }            
}

 

우선 addCircle이란 함수를 하나 만들어줍니다. 그런 다음 숫자를 뽑아낼 때에 그려주는거지요-

 

그러면 어떻게 되느냐?

 

 

 

 

이렇게 5개의 공이 생기게 됩니다! 이제 슬슬 로또 같죠? 

 

위에 userControl 만드는 부분이 조금 헷갈릴 수 있는데 중복 된 UI를 구성할 때에 정말 많이 사용되는 개념이고 꼭 필요한 개념이니 반드시 이해하고 넘어가시길 바래요!

 

혹 이해 안되시면 댓글로 알려주시면 차근차근 설명드리겠습니다-

 

 

 

 

원래 이번 포스팅에서 끝을 내려고 했는데 하다보니 엄청 길어지네요.

 

이제 남은 것은 한게임만 하는게 아니라 n개의 게임을 돌리는 것! 그것은 다음 포스팅에서 한번 해보도록할게요-

 

이왕 하는김에 이번에 했던 userControl을 한번 더 사용해볼까 합니다.

 

 

이만,

배곧동개발자 였습니다.

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday