/// <summary> /// Méthode permettant de tester si une case d'une grille est nécessaire pour valider le principe d'unicité /// </summary> /// <param name="g"></param> /// <param name="position"></param> /// <returns></returns> private static bool TesterCase(Grille g, int position) { int compteurReussite = 0; int x = position / 9; int y = position % 9; for (int chiffre = 1; chiffre <= 9; chiffre++) { if (chiffre != g.GetCaseValue(x, y)) { Grille aTester = new Grille(g); aTester.SetCaseValue(x, y, chiffre); if (CaseValide(aTester, 0) && aTester.CheckSudoku()) { compteurReussite += 1; if (compteurReussite == 1) { return(false); } } } } if (compteurReussite == 0) { g.SetCaseValue(x, y, 0); } return(true); }
/// <summary> /// Méthode permettant de remplir la grille de sudoku /// </summary> /// <param name="grille">Grille</param> /// <param name="coordonnee">Coordonnée de la case</param> /// <returns>Grille rempli</returns> private static bool CaseValide(Grille grille, int coordonnee) { if (coordonnee == 9 * 9) { return(true); } int i = coordonnee / 9; int j = coordonnee % 9; if (grille.GetCaseValue(i, j) != 0) { return(CaseValide(grille, coordonnee + 1)); } for (int chiffre = 1; chiffre <= 9; chiffre++) { if (AbsentSurLigne(chiffre, grille, i) && AbsentSurColonne(chiffre, grille, j) && AbsentSurBloc(chiffre, grille, i, j)) { grille.SetCaseValue(i, j, chiffre); if (CaseValide(grille, coordonnee + 1)) { return(true); } } } grille.SetCaseValue(i, j, 0); return(false); }
private void helpClick(object sender, EventArgs e) { var x = MessageBox.Show("Une case du sudoku va être rempli. Voulez-vous utilisez l'aide ?", "Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (x == DialogResult.No) { } else { if (isGrilleEgale(this.grille, this.grille.Solution)) { } else { bool trouve = true; do { Random rnd = new Random(); int pos = rnd.Next(1, 81); int value = grille.GetCaseValue(pos / 9, pos % 9); if (value == 0) { grille.SetCaseValue(pos / 9, pos % 9, grille.Solution.GetCaseValue(pos / 9, pos % 9)); trouve = false; this.tabLabel[pos].Text = grille.Solution.GetCaseValue(pos / 9, pos % 9).ToString(); } } while (trouve); } } }
/// <summary> /// Méthode permettant de savoir si un chiffre un déjà présent sur une colonne donnée /// </summary> /// <param name="chiffre">Chiffre a vérifier</param> /// <param name="g">Grille sur laquelle se trouve la colonne</param> /// <param name="j">Colonne a vérifier</param> /// <returns></returns> private static bool AbsentSurColonne(int chiffre, Grille g, int j) { for (int i = 0; i < 9; i++) { if (g.GetCaseValue(i, j) == chiffre) { return(false); } } return(true); }
/// <summary> /// Méthode permettant de savoir si un chiffre est présent sur la ligne donnée /// </summary> /// <param name="chiffre">Chiffre a vérifier</param> /// <param name="g">Grille sur laquelle se trouve la ligne</param> /// <param name="i">Ligne a vérifier</param> /// <returns>True si absent, false sinon </returns> private static bool AbsentSurLigne(int chiffre, Grille g, int i) { for (int j = 0; j < 9; j++) { if (g.GetCaseValue(i, j) == chiffre) { return(false); } } return(true); }
public Grille(Grille g) { InitialiserGrille(); for (int i = 0; i <= 8; i++) { for (int j = 0; j <= 8; j++) { SetCaseValue(i, j, g.GetCaseValue(i, j)); } } }
/// <summary> /// Méthode permettant de check si un chiffre est présent dans un carré /// </summary> /// <param name="chiffre">Chiffre a vérifier</param> /// <param name="g">Grille sur laquelle se trouve le carré</param> /// <param name="i">position en x</param> /// <param name="j">position en y</param> /// <returns></returns> private static bool AbsentSurBloc(int chiffre, Grille g, int i, int j) { int _i = i - (i % 3), _j = j - (j % 3); for (i = _i; i < _i + 3; i++) { for (j = _j; j < _j + 3; j++) { if (g.GetCaseValue(i, j) == chiffre) { return(false); } } } return(true); }
/// <summary> /// Permet de générer la grille et de mettre des cases vides /// </summary> /// <param name="nbCases">Nombre de cases à afficher</param> /// <returns>Une grille avec des 0 sur les cases à deviner</returns> public static Grille GenererGrilleAléatoire(int nbCases) { Grille grille = GenerateurGrille.Generation(); for (int i = 1; i <= 81 - nbCases; i++) { int x; int y; do { Random rnd = new Random(); x = rnd.Next(9); y = rnd.Next(9); } while (grille.GetCaseValue(x, y) == 0); grille.SetCaseValue(x, y, 0); grille.GetCase(x, y).IsChecked = true; } return(grille); }