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