// Boutons pour revenir en arrière.
        private void Button1_Click(object sender, EventArgs e)
        {
            // S'il l'user n'as pas encore joué ou qu'il n'as plus de vies, on ne peut pas annuler son dernier coup
            if (coupsJouées.Count == 0 || vies == 0)
            {
                return;
            }
            vies--;
            afficherVies();
            if (vies == 0)
            {
                button1.Visible = false;
            }
            effacerCouleur();                  //Enlever les cases rouges actuelles
            BoutonEchec b = coupsJouées.Pop(); //récupérer le dernier bouton joué

            b.Enabled = true;                  //le réactiver et effacer son texte
            b.Text    = "";
            --compteur;                        //le compteur passe a compteur - 1
            if (coupsJouées.Count == 0)        //Si il n'y a plus d'éléments dans la pile on s'arrête là.
            {
                button3.Visible = true;
                button2.Visible = false;
                return;
            }
            b = coupsJouées.Pop();// on récupère le bouton d'il y a 2 tour pour recliquer dessus
            Color c = b.BackColor;

            b.Enabled = true;
            --compteur;
            b.Text      = "";
            b.BackColor = Color.Red;
            b.PerformClick();
            b.BackColor = c;
        }
        private void CasesFonceésToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (compteur > 0)
            {
                MessageBox.Show("Vous ne pouvez pas faire ça en cours de partie.");
                return;
            }
            ColorDialog c = new ColorDialog();

            c.ShowDialog();
            if (c.Color.Equals(Color.Red))
            {
                MessageBox.Show("Le rouge est déjà utilisé pour discriminer les cases jouables, choix refusé");
                return;
            }
            noir = c.Color;
            for (int i = 2; i <= 9; ++i)
            {
                for (int j = 2; j <= 9; ++j)
                {
                    BoutonEchec b = echec[i, j];
                    Boolean     claire;
                    claire      = i % 2 == j % 2 ? true : false;
                    b.BackColor = claire ? blanc : noir;
                }
            }
        }
        private void ArcticToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem t    = sender as ToolStripMenuItem;
            string            path = t.Text;

            cavalier = Image.FromFile("images\\" + path + ".png");
            if (coupsJouées.Count != 0)
            {
                BoutonEchec b = coupsJouées.Peek();
                b.BackgroundImage = cavalier;
            }
        }
        private void ChargerPartieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (Properties.Settings.Default.InfoBoutons[0].Equals("Init"))
            {
                return;
            }
            replayToolStripMenuItem.PerformClick();
            StringCollection save = Properties.Settings.Default.InfoBoutons;
            int k = 0;

            for (int i = 2; i <= 9; ++i)
            {
                for (int j = 2; j <= 9; ++j)
                {
                    BoutonEchec b = echec[i, j];
                    String      p = save[k++];
                    b.fromCSV(p);
                }
            }
            if (coupsJouées.Count() != 0)
            {
                coupsJouées.Clear();
            }
            foreach (String param in Properties.Settings.Default.Pile)
            {
                String[] values = param.Split(',');
                int      i      = int.Parse(values[2]);
                int      j      = int.Parse(values[3]);
                coupsJouées.Push(echec[i, j]);
            }
            if (coupsJouées.Count() == 0)
            {
                compteur = 0;
                return;
            }
            BoutonEchec reprise = coupsJouées.Pop();

            reprise.Enabled = true;
            if (coupsJouées.Count() > 0)
            {
                reprise.BackColor = Color.Red;
            }
            compteur = coupsJouées.Count() == 0 ? 0 : int.Parse(coupsJouées.Peek().Text);
            reprise.PerformClick();
            vies = int.Parse(Properties.Settings.Default.Vie);
            afficherVies();
        }
 private void ReplayToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (coupsJouées.Count() != 0)
     {
         effacerCouleur();
         while (coupsJouées.Count() != 0)
         {
             BoutonEchec b = coupsJouées.Pop();
             b.Enabled = true;
             b.Text    = "";
         }
     }
     compteur = 0;
     vies     = 5;
     afficherVies();
     button1.Visible = true;
     button3.Visible = true;
     button2.Visible = false;
 }
        //Montrer solution
        private void Button2_Click(object sender, EventArgs e)
        {
            if (coupsJouées.Count == 0)
            {
                return;
            }
            DialogResult r = MessageBox.Show("Souhaitez vous voir la simulation complète (avec la même case de départ que celle que vous avez utilisée) ?", "Abandonner", MessageBoxButtons.YesNoCancel);

            if (r == DialogResult.Yes)
            {
                BoutonEchec b = coupsJouées.Last();
                Form2       f = new Form2(b.getLigne(), b.getColonne());
                this.Hide();
                f.ShowDialog();
                this.Close();
            }
            if (r == DialogResult.No)
            {
                replayToolStripMenuItem.PerformClick();
            }
        }
        private void montrerCasesPossibles()
        {
            BoutonEchec b     = coupsJouées.Peek();
            int         ligne = b.getLigne();
            int         col   = b.getColonne();
            int         n     = 0;

            for (int l = 0; l < depj.Length; ++l)
            {
                BoutonEchec next = echec[ligne + depi[l], col + depj[l]];
                if (next.Enabled)
                {
                    next.BackColor = Color.Red;
                    ++n;
                }
            }
            if (n == 0)
            {
                String s = compteur != 64 ? "Vous avez perdu :(" : this.Text.Equals("Tricheur !") ? "Vous n'avez aucun mérite ... ":"BRAVO ! ";
                MessageBox.Show(s, "Fin de partie.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        private void effacerCouleur()
        {
            if (coupsJouées.Count == 0)
            {
                return;
            }
            BoutonEchec b     = coupsJouées.Peek();
            int         ligne = b.getLigne();
            int         col   = b.getColonne();

            b.BackgroundImage = null;
            Boolean claire = b.BackColor.Equals(blanc);

            for (int l = 0; l < depj.Length; ++l)
            {
                BoutonEchec next = echec[ligne + depi[l], col + depj[l]];
                if (next.Enabled)
                {
                    next.BackColor = claire ? noir : blanc;
                }
            }
        }
        //Clique sur une case de l'échiquier
        private void Boutons_Click(object sender, EventArgs e)
        {
            BoutonEchec b = sender as BoutonEchec;

            if (!b.BackColor.Equals(Color.Red) && compteur != 0)
            {
                return;
            }
            if (coupsJouées.Count != 0)
            {//On affiche le compteur sur la case précédente, pour éviter de superposer image et texte.
                effacerCouleur();
                BoutonEchec précédent = coupsJouées.Peek();
                précédent.Text = compteur.ToString();
            }
            button3.Visible = false;
            button2.Visible = true;
            ++compteur;
            coupsJouées.Push(b);
            //b.Text = compteur.ToString();
            b.BackgroundImage = cavalier;
            b.Enabled         = false;
            montrerCasesPossibles();
        }
 private void Form1_Load(object sender, EventArgs e)
 {
     echec    = new BoutonEchec[12, 12];
     compteur = 0;
     vies     = 5;
     afficherVies();
     coupsJouées     = new Stack <BoutonEchec>();
     cavalier        = Image.FromFile("images\\Cheval par défaut.png");
     button2.Visible = false;
     for (int i = 0; i < 12; i++)
     {
         for (int j = 0; j < 12; j++)
         {
             BoutonEchec b = new BoutonEchec(i, j);
             if (i < 2 | i > 9 | j < 2 | j > 9)
             {
                 b.Enabled = false;
             }
             else
             {
                 this.Controls.Add(b);
                 Point p = new Point(90 + 50 * i, 90 + 50 * j);
                 b.Location = p;
                 Size s = new Size(50, 50);
                 b.Size = s;
                 //b.Text = i +"" + j;
                 b.Click += new EventHandler(this.Boutons_Click);
                 Boolean claire;
                 claire      = i % 2 == j % 2 ? true : false;
                 b.BackColor = claire ? blanc : noir;
                 b.Font      = new Font("Impact", 15);
             }
             echec[i, j] = b;
         }
     }
     WindowState = FormWindowState.Maximized;
 }