///////////////////////////////////////////////////////////////////

        // Sağ tıklama uyarı işaret koymak için
        private void BtnSagTik(object sender, MouseEventArgs e)
        {
            GameMineButton btn = (GameMineButton)sender;

            if (btn.Text != "")
            {
                return;
            }

            if (e.Button == MouseButtons.Right)
            {
                if (btn.BackgroundImage == null)
                {
                    btn.BackgroundImage            = _btnGameStepImg;
                    btn.BackColor                  = btnGameStep_BackColor;
                    btn.FlatAppearance.BorderColor = btnGameNum_BorderColor;
                }
                else
                {
                    btn.BackgroundImage            = null;
                    btn.BackColor                  = btnGameDefault_BackColor;
                    btn.FlatAppearance.BorderColor = btnGameDefault_BorderColor;
                }
            }
        }
        ///////////////////////////////////////////////////////////////////

        private void BtnSolTik(object sender, EventArgs e)
        {
            GameMineButton btn = (GameMineButton)sender;

            // Buton sağ tık ile kilitlendiyse sol tıklanamasın.
            if (btn.Enabled == false || btn.BackgroundImage != null)
            {
                return;
            }
            //Bombaya tıklanınca
            if (btn.Tag.ToString() == "9")
            {
                BtnMayinliHepsiniAc();
                //MessageBox.Show("Oyunu kaybettin!");
                return;
            }
            // Boş butonları ve çevre rakamları açıyor
            else if (btn.Tag.ToString() == "0")
            {
                btn.Enabled = false;
                int[] cord  = btn.Name.Split(',').Select(Int32.Parse).ToArray();
                int   cord1 = cord[0];
                int   cord2 = cord[1];
                btn.FlatAppearance.BorderColor = btnGameClean_BorderColor;
                btn.BackColor = btnGameClean_BackColor;
                this.AcilmamisMayinsizButon--;

                // Boşları aç
                BtnBosDegerAc(cord1 + 1, cord2);
                BtnBosDegerAc(cord1 - 1, cord2);
                BtnBosDegerAc(cord1, cord2 + 1);
                BtnBosDegerAc(cord1, cord2 - 1);
                // Boşların çevresindeki rakamları aç
                BtnBosCevresindekiRakamlariAc(cord1 + 1, cord2 + 1);
                BtnBosCevresindekiRakamlariAc(cord1 - 1, cord2 - 1);
                BtnBosCevresindekiRakamlariAc(cord1 + 1, cord2 - 1);
                BtnBosCevresindekiRakamlariAc(cord1 - 1, cord2 + 1);

                BtnBosCevresindekiRakamlariAc(cord1 + 1, cord2);
                BtnBosCevresindekiRakamlariAc(cord1 - 1, cord2);
                BtnBosCevresindekiRakamlariAc(cord1, cord2 - 1);
                BtnBosCevresindekiRakamlariAc(cord1, cord2 + 1);
                return;
            }
            // Numaralı butonları açıyor
            else if (btn.Tag.ToString() != "0" && btn.Tag.ToString() != "9")
            {
                btn.Text      = btn.Tag.ToString();
                btn.Enabled   = false;
                btn.BackColor = btnGameNum_BackColor;
                btn.ForeColor = btnGameNum_ForeColor;
                btn.FlatAppearance.BorderColor = btnGameNum_BorderColor;
                // Skor puanlama
                skor += (int)btn.Tag + 2;
                this.AcilmamisMayinsizButon--;
            }
        }
        ///////////////////////////////////////////////////////////////////


        // Ramde bir adet buton heap kısmına uluşturulur
        // GameMineButton sınıfı Prototype desenini üzerinde taşır
        // Daha sonra oluşturulcak butonlar bu butondan deep copy yöntemiyle oluşturulur.
        private void CreateGameButton()
        {
            _btn           = new GameMineButton();
            _btn.Font      = _btnFont;
            _btn.Size      = _btnSize;
            _btn.Margin    = _btnMargin;
            _btn.Padding   = _btnPadding;
            _btn.TabStop   = false;
            _btn.TabIndex  = 10;
            _btn.Enabled   = true;
            _btn.FlatStyle = FlatStyle.Flat;
            _btn.BackColor = btnGameDefault_BackColor;
            _btn.FlatAppearance.BorderColor = btnGameDefault_BorderColor;
            _btn.BackgroundImageLayout      = ImageLayout.Stretch;
        }
        ///////////////////////////////////////////////////////////////////

        /// <summary>
        /// ikili dizi ile bir matris oluşturup kordinatları verildiğinde,
        /// buton bilgileri işlenir ve ilgili kordinata panel içinde konumlandırılır.
        /// Prototype Tasarım Deseni kullanılarak, butonlar "new" ile değil "deep copy" yöntemiyle üretilir.
        /// </summary>
        /// <param name="matrisMap">MatrisField sınıfında oluşturulan diziyi alır</param>
        /// <param name="cord_X">Dizinin x indisi arr[x,y]</param>
        /// <param name="cord_Y">Dizinin y indisi arr[x,y]</param>
        /// <param name="pnlPlatform">AnaForm'da oluşturulan panelin referansı</param>
        /// <returns>Dictonary listesine eklemek için Buton nesnesi geri döndürür</returns>
        private GameMineButton DinamikButonOlustur(int[,] matrisMap, int cord_X, int cord_Y, ref Panel pnlPlatform)
        {
            GameMineButton btn = (GameMineButton)_btn.Clone();

            btn.Tag  = matrisMap[cord_X, cord_Y];
            btn.Name = $"{cord_X},{cord_Y}"; // Kordinatlar isimlerden yakalanıyor

            _Point.X     = (cord_X * (btn.Height + 2));
            _Point.Y     = (cord_Y * (btn.Width + 2));
            btn.Location = _Point;

            btn.Click   += btnClickHandler;
            btn.MouseUp += btnSagClickHandler;
            btn.FlatAppearance.BorderColor = btnGameDefault_BorderColor;

            pnlPlatform.Controls.Add(btn);
            return(btn);
        }
        public IPrototype Clone(object val = null)
        {
            GameMineButton copyButton = Activator.CreateInstance <GameMineButton>(); //önce GameMineButton Bir instance oluşturulur.

            PropertyInfo[] piList = this.GetType()                                   //mevcut içerinde bulunduğumuz sınıfın property leri çekilir.
                                    .GetProperties();

            //mevcut property' lerden kopyalanmak istenen property ler belirtilir. Ancak bu örnekte hepsine gerek yoktur.
            //çünkü zaten oluşturuduğumuz copy sınıfının default değerleri içerisinde bulunduğumuz sınıf tarafından değiştirilmemektedir.
            //uygulama gereksinimine göre hepsi de kopyalanabilir.

            List <string> lst = new List <string>
            {
                "Font",
                "FlatStyle",
                "Size",
                "BackColor",
                "Margin",
                "BackgroundImage",
                "Padding",
                "Text",
                "TabStop",
                "ForeColor",
                "TabIndex",
                "Paint",
                "Enabled",
                "Tag",
                "BackgroundImageLayout"
            };

            foreach (PropertyInfo pi in piList.Where(i => lst.Contains(i.Name))) //içerisinde bulunduğumuz sınıfın propertyleri içerisinde dönülmeye başlanır.
            {
                if (pi.GetValue(copyButton, null) != pi.GetValue(this, null))    //sırayla yeni copy nesnemize atanır.
                {
                    if (pi.CanWrite)
                    {
                        pi.SetValue(copyButton, pi.GetValue(this, null), null);
                    }
                }
            }

            return(copyButton);
        }