본문 바로가기

C# Form

메모리 게임

기억력을 증진시키기 위해 화투가 좋다고 하는데... ㅎㅎ 맞는 말인지...

머리를 쓰는 것은 확실하니까, 도움이 될 것 같기는 합니다.

 

우리 학생이 제안한 프로그램을 만들어보았습니다.

 

 

프로그램이 시작되면 위와 같은 화면이 뜹니다. 게임시작 메뉴를 누르면 3장의 카드가 사라졌다가 다시 나타나는데 이때 없어진 순서대로 마우스를 누르면 점수가 올라갑니다. 순서가 틀리면 게임이 끝납니다.

 

처음에는 3장으로 시작하고 맞추면 4장, 5장, 6장, ... 등으로 12장까지 순서대로 없어졌다 나타납니다. 이 순서를 기억하는 연습을 하는 게임입니다.

 

using System;

using System.Drawing;
using System.Windows.Forms;
using System.Threading;

 

namespace memoryGame
{
    public partial class Form1 : Form
    {
        private Button[] btnList;

        public Form1()
        {
            InitializeComponent();

            btnList = new Button[] { null, button1, button2, button3, button4, button5, button6, button7, button8, button9, button10, button11, button12 };
            initCards();
           
            // 처음 3장의 감출 그림을 random 하게 선택한다.
            randomGen();
        }

        private void initCards()
        {
            for (int i = 1; i <= 12; i++)
            {
                string fName = @"c:\파일경로\img\" + i + ".png";
                Image bmp = Bitmap.FromFile(fName);
                btnList[i].Image = bmp;
                btnList[i].Text = "";
                btnList[i].Tag = i; // 카드번호를 Tag로 저장
            }
        }

        public int cards = 3;   // 최초 3장부터
        public int[] rnd { get; private set; }
        public int score = 0;

        private void randomGen()
        {
            rnd = new int[12];          // 뒤집어질 카드 번호 : 최초 3장 ~ 최대 12장
            int[] flag = new int[13];    // 중복 방지용
            int cnt = 0;

            for (int i = 0; i < 13; i++)
                flag[i] = 0;

            Random r = new Random();
            for (int i = 0; i < 100; i++)
            {
                int x = r.Next(12);
                if (flag[x] == 0)
                {
                    flag[x]++;
                    rnd[cnt] = x + 1;  // rnd[] : 1~12
                    if (++cnt >= cards)
                        break;
                }
            }
        }

        private void setImage()
        {          
            for (int i = 1; i <= 12; i++)
            {
                string fName = @"c:\파일경로\img\" + i + ".png";
                Image bmp = Bitmap.FromFile(fName);
                btnList[i].Image = bmp;
            }
        }

        private void showCards()
        {
            for (int i = 0; i < cards; i++)
            {
                drawHidden(rnd[i]);
                Thread.Sleep(1000);
                Application.DoEvents();
            }
            Thread.Sleep(1000);
            Application.DoEvents();
            setImage();
        }

        private void drawHidden(int hidden)
        {
            for (int i = 1; i <= 12; i++)
            {
                if (i == hidden)
                    btnList[i].Image = null;
                else
                {
                    string fName = @"c:\파일경로\img\" + i + ".png";
                    Image bmp = Bitmap.FromFile(fName);
                    btnList[i].Image = bmp;
                }
            }
        }

        private int[] btns = new int[13];   // 버튼을 누르는 순서대로 저장,  rnd[]와 비교
        private int sequence = 0;

        private void btnClick(object sender, EventArgs e)
        {               
            Button btn = sender as Button;           
            btns[sequence++] = (int)btn.Tag;
            if (sequence == cards)
            {
                if (checkResult())
                {
                    score += 10 * cards;
                    tsScore.Text = "점수: " + score;
                    MessageBox.Show("맞았습니다.\n다음 단계로 넘어갑니다.\n다음 단계는 "+(cards+1).ToString() + "장입니다.");
                    reStart();
                }
                else {
                    MessageBox.Show("틀렸습니다.\n게임을 종료합니다.");
                    Close();
                }
            }
        }

        // 다음 단계 시작
        private void reStart()
        {
            cards++;
            sequence = 0;
            randomGen();
            showCards();
        }

        private bool checkResult()
        {
            for (int i = 0; i < cards; i++)
            {
                if (rnd[i] != btns[i])
                    return false;
            }
            return true;
        }

        private void OnShown(object sender, EventArgs e)
        {
            MessageBox.Show("메뉴에서 시작을 누르세요. 처음은 3장부터 시작합니다~");
        }

        private void toolStripLabel1_Click(object sender, EventArgs e)
        {
            showCards();
        }

        private void toolStripLabel2_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

 

 

여기서 익혀야 할 부분은...

 

1. delay 주는 방법입니다.

 

            Thread.Sleep(1000);  // 단위 ms
            Application.DoEvents();

 

   이와 같이 쓰면, 1초간 쉬었다가 다음으로 넘어가게 됩니다.

   이것은 Form 에서 delay 줄 때 사용하는 방법입니다. WPF에서는 다른 방법을 씁니다.

 

2. 비트맵으로 버튼의 Image를 바꾸는 방법

 

    string fName = @"c:\파일경로\img\" + i + ".png";

    Image bmp = Bitmap.FromFile(fName);
    btnList[i].Image = bmp;

 

3. Button 에 Tag 속성을 이용하여 필요한 정보를 저장하는 방법


    btnList[i].Tag = i; // 카드번호를 Tag로 저장

 

Beeeye Dmu

 

'C# Form' 카테고리의 다른 글

Create Login Window in C# step by step  (0) 2016.06.13
How to Create a Database in Visual Studio in Less than 10 Minutes  (0) 2016.06.13
C# Form에서 delay 주기  (0) 2016.06.10
ListView 사용법  (0) 2015.10.01
Matching Game, 매칭게임  (3) 2014.11.25