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 }
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 }
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 }