<프로그램 진행과정>
1. 16개 버튼을 만들어서 board에 넣는다
2. 이때 랜덤하게 각 버튼에 숫자(0~7)을 할당한다
3. 이 숫자를 Button.Tag에 저장한다
4. 뒤집힌 그림(Check 이미지)으로 표시한다
private void boardSet()
{
for (int i = 0; i<16; i++)
{
Button c = new Button();
c.Background = Brushes.White;
c.Margin = new Thickness(10);
c.Content = MakeImage("../../Images/check.png");
c.Tag = TagSet(); // 이 문장이 중요, 그림의 인덱스
c.Click += C_Click;
board.Children.Add(c);
}
}
WPF에서는 비트맵을 먼저 만들어서 이미지로 변환해야함
체크박스로 가려진 이미지를 불러오는 과정.
//Image MakeImage(string v)
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(v, UriKind.Relative);
bi.EndInit();
Image myImage = new Image();
myImage.Margin = new Thickness(10);
myImage.Stretch = Strecth.Fill;
myImage.Source = bi;
return myImage;
0~15까지 랜덤숫자를 만들고 이를 8로 나눈 나머지로 리턴
int[] rnd = new int[16]; // 랜덤 숫자가 중복되는지 체크
private int TagSet()
{
int i;
Random r = new Random();
while(true)
{
i = r.Next(16); // 0~15까지
if(rnd[i] == 0)
{
rnd[i] = 1;
break;
}
}
return i % 8; // 태그는 0~7까지, 8개의 그림을 표시
}
<원리>
//추가
using System.Windows.Threading;
Button first;
Button second;
DispatcherTimer myTimer = new DispatcherTimer();
int matched = 0;
//버튼 클릭 이벤트
private void C_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
string[] icon = { "딸기", "레몬", "모과", "배",
"사과","수박","파인애플","포도" };
string fruitName = icon[(int)btn.Tag];
if (first == null) // 이 버튼은 첫번째 버튼
{
first = btn;
btn.Content = MakeImage("../../Images/" + fruitName + ".png");
return;
}
else if (second == null)
{
second = btn;
btn.Content = MakeImage("../../Images/" + fruitName + ".png");
}
else // 이미 두개의 버튼이 열렸는데 3번째 버튼을 눌렀을 경우, 아무 일 안하고 리턴
return;
// 매치가 되었을 때 (2)
if((int)first.Tag == (int)second.Tag) // (3) 같다면
{
first = null;
second = null;
matched += 2;
if (matched >= 16) {
MessageBoxResult res = MessageBox.Show(
"성공! 다시 하시겠습니까?", "Success", MessageBoxButton.YesNo);
if(res == MessageBoxResult.Yes)
{
resetRnd();
boardReset();
boardSet();
matched = 0;
}
}
}
// 매치가 안되었을 때는 다시 덮어주어야 한다 (4)
else
{
myTimer.Start();
}
}
<성공했을 때 보드 초기화 함수>
private void boardReset()
{
board.Children.Clear();
}
// rnd[] 배열 초기화
private void resetRnd()
{
for (int i = 0; i < 16; i++)
rnd[i] = 0;
}
<매칭 안될 시, 다시 덮어주는 타이머 함수>
private void MyTimer_Tick(object sender, EventArgs e)
{
myTimer.Stop();
first.Content = MakeImage("../../Images/check.png");
second.Content = MakeImage("../../Images/check.png");
first = null;
second = null;
}