Пример #1
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
            #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 ???
            // Afficher et maj les annotations

            // 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
        }
Пример #2
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
            #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;
            }

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

            //      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
        }
Пример #3
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
            #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"); break;

            case '0': c.SetValue("1"); break;

            case '1': c.SetValue(" "); 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
        }