C# (WPF)으로 로또 번호 생성 프로그램을 만들어 보자 (3)

  C# (WPF)으로 로또 번호 생성 프로그램을 만들어 보자 (3)


이전(이전포스트)엔 클릭한 버튼 색상을 변경하고, 6개 이상 눌르면 더 선택 못하게 팝업창을띄웠었다. 

이제 클릭한 버튼의 텍스트를 텍스트 박스에 넣어봐야겠다.

버튼을 클릭할때마다 박스에 순차로 채우는것 보단, 아무래도 내림차순으로 채워 주는게 좋을듯 싶어 버튼 클릭 이벤트 마다 박스 내용을 지우고, for 문을 돌려 상태값을 저장한 배열에서 선택된 애들만 박스에 순차로 넣으면 내림차순으로 채워질것 같다.


일단 텍스트 박스도 클래스로 배열을 만들어 각각의 텍스트 박스를 넣어줘야겠다.

TextBox[] caBox = new TextBox[7];

역시 0부터 하면 가끔 햇갈려서 1부터 하려고 박스는 6개지만 배열을 7개를 만들었다.


private void create_array()
{
    for (int i = 1; i<7; i++)
    {
	caBox[i] = this.FindName("textBox" + i.ToString()) as TextBox;
    }          
}

위처럼 메소드를 하나 만들어서 위에 만든 배열에 나의 텍스트 박스들을 넣어줬다.

인터넷에 찾아보니, 위의 FindName 을 써서 xaml 에서 이름을 찾아서 넣을 수 있는것 같다.그리고 저 메소드를 메인 윈도우 메소드에서 실행하게 해놨다.


그렇게 만든 텍스트 박스 배열들로 버튼 이벤트가 발생되면 박스내용을 초기화 하고 상태값을 저장한 배열에서 변경된 애들만 검색해서 텍스트 박스에 순차로 집어넣자


private void button1_Click(object sender, RoutedEventArgs e)
{
        Button cButton = (Button)sender;            
       int j = 1;
	   
	if ((baLotto_number[int.Parse(cButton.Content.ToString())] == false) && (iCount<6 ))
	{
		baLotto_number[int.Parse(cButton.Content.ToString())] = true;
		cButton.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFE67474"));
		iCount++;
	}
	else if ((baLotto_number[int.Parse(cButton.Content.ToString())] == true) && (iCount <= 6))
	{
		baLotto_number[int.Parse(cButton.Content.ToString())] = false;
		cButton.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ffdddddd"));
		iCount--;
	}            
	else
	{
		MessageBox.Show("6개 이상 고르지 마세요.");
	}
	for (int i = 1; i < 7; i++)
	{
		caBox[i].Text = "";
	}

	for (int i = 1; i < 46; i++)
	{
		if (baLotto_number[i] == true)
		{
			caBox[j++].Text = string.Format("{0}", i);
		}
	}

}

그렇게 만든 나의 버튼 이벤트 

동작시켜 볼까!!


오케이 다음엔 난수 발생에 대해 알아봐야겠다.

일단은 자동 번호 버튼의 컨트롤을 추가시키고, 메소드를 하나 만들어서 테스트를 해야겠다.

랜덤 이라는 클래스가 존재하고, 그 클래스내 메소드중 Next 란걸 사용하면 되겠다.

Random cRandomobj = new Random();
int iRandbuff = 0;

iRandbuff = cRandomobj.Next(1,46);


랜덤오브젝트를 하나 만들어 주고 랜덤 버퍼 변수를 하나 만들었다.

Next(minvalue , maxvalue) 인듯 한데 minvalue 는 이상 이고, maxvalue 는 미만인가 부다.

그래서 1부터 46으로 설정.


그리고 같은 숫자가 나오면 다시 돌려야 되니깐, 6개의 랜덤 배열을 만들어서 넣어놔야겠다.

그리고 그 배열에서 값이 존재하지 않으면 버튼 색변경이랑, 번호 상태 배열을 변경 시켜주면 될거 같아, 아래와 같이 랜덤 생성 메소드를 작성.

private void rand_num_create()
{
	Random cRandomobj = new Random();
	int[] iaRand_num = new int[6];                        
	int iRandbuff = 0;	
	int iBoxCount = 1;
	button_clear(); // 이전에 있던 버튼 색 초기화 및 버튼 상태 배열 초기화
        iCount = 0; // 전역 변수
	while (iCount < 6)
	{
		iRandbuff = cRandomobj.Next(1,46);
		if (!Array.Exists(iaRand_num, x => x == iRandbuff))
		{
			iaRand_num[iCount++] = iRandbuff;
			baLotto_number[iRandbuff] = true;
			caButton[iRandbuff].Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFE67474"));
		}                
	}
	for (int k = 1; k < 7; k++)
	{
		caBox[k].Text = "";
	}
	for (int k = 1; k < 46; k++)
	{
		if (baLotto_number[k] == true)
		{
			caBox[iBoxCount++].Text = string.Format("{0}", k);
		}
	}
}

배열에서 값의 유무를 확인하는 메소드는 Array 클래스 내의 Exists 메소드 인것 같다.

Exists는 매개변수로 (검색할 배열, 람다식) 이라는데.... 람다식도 잘 모르니 검색.

음 x == iRandbuff 라는 조건식을 x 라는 매개변수로 만드는 거같네.

그리고 Exists 의 함수 원형을 보니, return 으로 FindIndex 함수를 쓰는구나, 여튼 배열 내에서 내 조건식의 값을 만족하는 값이 매칭되면 true 를 리턴 하는것 같다.


그래서 나의 경우는 배열내의 값이 없어야 값을 추가하고 진행해야 하니, 반전을 써주었다.

그렇게 while 문 안에서 동작을 시킨뒤 조건을 충족시키고 textBox 텍스트 초기화, 텍스트 박스에 버튼 상태 값을 저장한 배열을 for 문으로 돌려서 textBox에 기입.

아래 동작 영상이다.


다음엔 몇가지 버튼 클릭후 나머지 숫자를 랜덤으로 기입하는 버튼 이벤트를 추가해야 겠다.

3탄 끝.


다음글

댓글

이 블로그의 인기 게시물

T-PICOC3(MICROPYTHON)으로 WIFI 를 연결해보자. (1)

Raspberry Pi pico W 로 시계 및 날씨 확인 제품을 만들어 보자. (1) 구상 단계

Raspberry Pi Pico W로 시계 및 날씨 확인 제품을 만들어 보자. (4) ws2812 test 및 WIFI 시간 테스트