[C#]Matching Game

강서현·2022년 6월 18일
0

C#

목록 보기
3/23

<프로그램 진행과정>
1. 16개 버튼을 만들어서 board에 넣는다
2. 이때 랜덤하게 각 버튼에 숫자(0~7)을 할당한다
3. 이 숫자를 Button.Tag에 저장한다
4. 뒤집힌 그림(Check 이미지)으로 표시한다

1. 반복문으로 버튼만들기

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);
      }
}

1-1 이미지 파일 불러오기

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;

1-2 랜덤숫자를 만들어 8쌍의 그림 표시하기

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개의 그림을 표시
    }

<원리>

2. 버튼을 클릭할 때 처리

  1. Tag숫자에 따라 그림을 표시해주고
  2. 첫번째와 두번째 누른 버튼이 같은지 체크
  3. 같다면 그대로 오픈
  4. 다르면 다시 체크박스로
//추가
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;
    }
profile
Recording...

0개의 댓글