Пример #1
0
        private void tsLoad_Click(object sender, EventArgs e)
        {
            #region Notes et pseudocode

            //      Si la grille courante a changé, ...
            //      S'occuper des champs globaux du formulaire
            //      S'occuper des champs hérités et des composantes:
            //           Cancel, timer, etc.
            //      Déterminer le fichier à lire
            //      Détruire l'ancienne grille
            //      Lire la grille
            //      Supprimer l'historique
            //      Générer la nouvelle grille

            #endregion Notes et pseudocode

            #region CODE

            //      Si la grille courante a changé, ...
            if (hasChanged)
            {
                switch (MessageBox.Show("Enregistrer la grille", "La grille a changé",
                                        MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
                {
                case DialogResult.Cancel: return;

                case DialogResult.Yes: tsSave_Click(sender, e); break;

                case DialogResult.No: break;
                }
            }

            //      Déterminer le fichier à lire
            OpenFileDialog d = new OpenFileDialog();
            d.Title = "Sélectionner le fichier à lire";
            if (d.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }

            //      Lire la nouvelle grille
            Contenu[,] jeu = null;;
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                FileStream      f  = new FileStream(d.FileName, FileMode.Open);
                jeu = bf.Deserialize(f) as Contenu[, ];
                f.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            //      Détruire l'ancienne grille et annotations ?
            foreach (Case c in grille)
            {
                c.Parent  = null;
                c.Visible = false;
            }
            foreach (Annotation annotation in annotationHorizontal)
            {
                annotation.Visible = false; // effacer
                annotation.Parent  = null;  // sera récupérée par le GC
            }
            foreach (Annotation annotation in annotationVertical)
            {
                annotation.Visible = false; // effacer
                annotation.Parent  = null;  // sera récupérée par le GC
            }

            //      Générer la nouvelle grille
            N = jeu.GetLength(0);

            grille = new Case[N, N];
            for (int row = 0; row < N; row++)
            {
                for (int col = 0; col < N; col++)
                {
                    grille[row, col] =
                        new Case(col * 42 + 2, row * 42 + 2, row, col, panel, jeu[row, col].originale, Case_Click);
                    Case b = grille[row, col];
                    b.Parent = panel;   // placer le bouton sur la grille
                    b.SetValue(jeu[row, col].valeur.ToString());
                }
            }

            // Générer les nouvelles annotations
            // Création et affichage des labels annotations
            for (int ctr = 0; ctr < N; ctr++)
            {
                annotationHorizontal[ctr] = new Annotation(ctr * 42 + 58, 40);
                Controls.Add(annotationHorizontal[ctr]);
                annotationVertical[ctr] = new Annotation(20, ctr * 42 + 75);
                Controls.Add(annotationVertical[ctr]);
            }

            // Parcourir la grille pour mettre à jours le nombre de zéro et de un des annotations
            for (int row = 0; row < N; row++)
            {
                for (int col = 0; col < N; col++)
                {
                    switch (grille[row, col].Text)
                    {
                    case "0":
                        annotationHorizontal[col].NbrZero++;
                        annotationVertical[row].NbrZero++;
                        break;

                    case "1":
                        annotationHorizontal[col].NbrUn++;
                        annotationVertical[row].NbrUn++;
                        break;
                    }
                }
            }

            // Mise à jours des annotations
            for (int ctr = 0; ctr < N; ctr++)
            {
                annotationHorizontal[ctr].MAJ();
                annotationVertical[ctr].MAJ();
            }

            //      S'occuper des champs globaux du formulaire
            historique.Clear();
            hasChanged = false;
            etat       = Etat.EnJeu;
            //      S'occuper des champs hérités et des composantes:
            //           Cancel, timer, etc.
            // Ajuster les dimensions du Panel
            panel.Width = panel.Height = N * 42 + 6;
            // Ajuster les dimensions de la fiche
            Width         = panel.Width + 200;
            Height        = panel.Height + 200;
            elapsed       = 0;
            timer.Enabled = false;

            #endregion CODE
        }
Пример #2
0
        private void Case_Click(object sender, EventArgs e)
        {
            #region Notes et pseudocode

            // Obtenir une référence sur la case cliquée.
            // Si la case est originale, on ne peut la changer.
            // Sauvegarder l'état actuel de la case (pour pouvoir annuler)
            //    Ici, il faut faire attention, si on clique la même case,
            //    on ne doit sauver qu'un historique.
            // Changer la valeur de la case ==> annotations aussi.
            // La grille est-elle complétée?
            //   Si oui, arrêter le temps, désactiver le menu annuler, afficher un message.
            //   Si non, activer le menu annuler, en jeu, activer le timer.

            #endregion Notes et pseudocode

            #region CODE

            // Obtenir une référence sur la case cliquée.
            Case c = sender as Case;

            // Si la case est originale, on ne peut la changer.
            if (c.originale)
            {
                return;
            }

            // Sauvegarder l'état actuel de la case (pour pouvoir annuler)
            //    Ici, il faut faire attention, si on clique la même case,
            //    on ne doit sauver qu'un historique.
            Case    precedent = null;
            Contenu pred      = null;
            if (historique.Count > 0)
            {
                pred      = historique[historique.Count - 1];
                precedent = grille[pred.row, pred.col];
            }
            if ((precedent != c))
            {
                historique.Add(new Contenu(c.row, c.col, c.Text[0], false));
            }
            // Changer la valeur de la case ==> annotations aussi.
            switch (c.Text[0])
            {
            case ' ':
                c.SetValue("0");
                // zero++
                annotationHorizontal[c.col].NbrZero++;
                annotationHorizontal[c.col].MAJ();
                annotationVertical[c.row].NbrZero++;
                annotationVertical[c.row].MAJ();
                break;

            case '0':
                c.SetValue("1");
                // zero--
                // un++
                annotationHorizontal[c.col].NbrZero--;
                annotationHorizontal[c.col].NbrUn++;
                annotationHorizontal[c.col].MAJ();
                annotationVertical[c.row].NbrZero--;
                annotationVertical[c.row].NbrUn++;
                annotationVertical[c.row].MAJ();
                break;

            case '1':
                c.SetValue(" ");
                // un--
                annotationHorizontal[c.col].NbrUn--;
                annotationHorizontal[c.col].MAJ();
                annotationVertical[c.row].NbrUn--;
                annotationVertical[c.row].MAJ();
                break;
            }

            // La grille est-elle complétée?
            //   Si oui, arrêter le temps, désactiver le menu annuler,
            //      afficher un message.

            //   Si non, activer le menu annuler, en jeu, activer le timer.
            hasChanged          = true;
            MenuAnnuler.Enabled = true;
            if (etat == Etat.Initial)
            {
                etat = Etat.EnJeu;
            }
            timer.Enabled = (etat == Etat.EnJeu);

            #endregion CODE
        }
Пример #3
0
        private void tsNew_Click(object sender, EventArgs e)
        {
            #region Notes et pseudocode

            //      S'occuper des champs globaux du formulaire
            //      Si la grille courante a changé, sauvegarder?
            //      Supprimer l'ancienne grille.
            //      Obtenir la dimension de la nouvelle grille
            //      Créer une grille NxN
            // NOTE : lorsque je crée ou supprime une grille, je
            //        dois m'occuper des annotations.

            #endregion Notes et pseudocode

            #region CODE

            if (hasChanged)
            {
                switch (MessageBox.Show("Enregistrer la grille", "La grille a changé",
                                        MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                {
                case DialogResult.Yes: tsSave_Click(sender, e); break;

                case DialogResult.No: break;
                }
            }
            foreach (Case c in grille)
            {
                c.Visible = false; // effacer
                c.Parent  = null;  // sera récupérée par le GC
            }
            // Pour obtenir la dimension de la nouvelle grille, il nous faudra un autre
            // formulaire.
            Form2 f = new Form2();
            f.ShowDialog();
            N = f.N;

            grille = new Case[N, N];
            for (int row = 0; row < N; row++)
            {
                for (int col = 0; col < N; col++)
                {
                    grille[row, col] =
                        new Case(col * 42 + 2, row * 42 + 2, row, col, panel, false, Case_Click);
                    Case b = grille[row, col];
                    b.Parent = panel;   // placer le bouton sur la grille
                    b.SetValue(" ");
                }
            }

            // Annotations ???
            foreach (Annotation annotation in annotationHorizontal)
            {
                annotation.Visible = false; // effacer
                annotation.Parent  = null;  // sera récupérée par le GC
            }
            foreach (Annotation annotation in annotationVertical)
            {
                annotation.Visible = false; // effacer
                annotation.Parent  = null;  // sera récupérée par le GC
            }

            // * Afficher et maj les annotations
            annotationHorizontal = new Annotation[N];
            annotationVertical   = new Annotation[N];

            // Création et affichage des labels annotations
            for (int ctr = 0; ctr < N; ctr++)
            {
                annotationHorizontal[ctr] = new Annotation(ctr * 42 + 58, 40);
                Controls.Add(annotationHorizontal[ctr]);
                annotationVertical[ctr] = new Annotation(20, ctr * 42 + 75);
                Controls.Add(annotationVertical[ctr]);
            }

            // Réinitialisation des annotations
            for (int ctr = 0; ctr < N; ctr++)
            {
                annotationHorizontal[ctr].NbrUn = 0;
                annotationVertical[ctr].NbrZero = 0;
                annotationHorizontal[ctr].MAJ();
                annotationVertical[ctr].MAJ();
            }

            // Ajuster les dimensions du Panel
            panel.Width = panel.Height = N * 42 + 6;
            // Ajuster les dimensions de la fiche
            Width  = panel.Width + 200;
            Height = panel.Height + 200;

            hasChanged = false;
            etat       = Etat.Création;
            historique.Clear();
            elapsed = 0;

            #endregion CODE
        }
Пример #4
0
        private void AfficherGrilleParDefaut()
        {
            string[] GrilleParDefaut =
            {
                "1     1 ",
                "  01 1  ",
                "  0     ",
                "1  1  1 ",
                "        ",
                "11    0 ",
                "1  1  0 ",
                "  01    "
            };
            // Créer la grille
            grille = new Case[8, 8];
            N      = 8;
            for (int row = 0; row < 8; row++)
            {
                for (int col = 0; col < 8; col++)
                {
                    grille[row, col] =
                        new Case(col * 42 + 2, row * 42 + 2, row, col, panel, false, Case_Click);
                    Case b = grille[row, col];
                    b.Parent    = panel; // placer le bouton sur la grille
                    b.Text      = GrilleParDefaut[row][col].ToString();
                    b.originale = (b.Text == "1") || (b.Text == "0");
                }
            }

            annotationHorizontal = new Annotation[N];
            annotationVertical   = new Annotation[N];
            // #### Ajuster les annotations

            // Création et affichage des labels annotations
            for (int ctr = 0; ctr < N; ctr++)
            {
                annotationHorizontal[ctr] = new Annotation(ctr * 42 + 58, 40);
                Controls.Add(annotationHorizontal[ctr]);
                annotationVertical[ctr] = new Annotation(20, ctr * 42 + 75);
                Controls.Add(annotationVertical[ctr]);
            }

            // Parcourir la grille pour mettre à jours le nombre de zéro et de un des annotations
            for (int row = 0; row < N; row++)
            {
                for (int col = 0; col < N; col++)
                {
                    // TODO: Remettre à 0 les valeurs des zéros et des uns
                    switch (grille[row, col].Text)
                    {
                    case "0":
                        annotationHorizontal[col].NbrZero++;
                        annotationVertical[row].NbrZero++;
                        break;

                    case "1":
                        annotationHorizontal[col].NbrUn++;
                        annotationVertical[row].NbrUn++;
                        break;
                    }
                }
            }

            // Mise à jours des annotations
            for (int ctr = 0; ctr < N; ctr++)
            {
                annotationHorizontal[ctr].MAJ();
                annotationVertical[ctr].MAJ();
            }

            etat = Etat.Initial;
        }