// TODO !! //========= /// <summary> /// Constructeur par défaut. /// /// Construit la grille 9x9 et classe les cellules en fonction /// de leur ligne, colonne et bloc. /// </summary> /// public Sudoku() { Lignes = new List <Ligne>(); Colonnes = new List <Colonne>(); Blocs = new List <Bloc>(); Grille = new Cellule[9, 9]; Groupes = new List <Groupe>(); for (int i = 0; i < 9; i++) { Lignes.Add(new Ligne(i)); Colonnes.Add(new Colonne(i)); Blocs.Add(new Bloc(i)); } Groupes.AddRange(Lignes); Groupes.AddRange(Colonnes); Groupes.AddRange(Blocs); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Grille[i, j] = new Cellule(Lignes.ElementAt(i), Colonnes.ElementAt(j), Blocs.ElementAt(GetNuméroBloc(i, j))); Lignes[i].Add(Grille[i, j]); Colonnes[j].Add(Grille[i, j]); Blocs[GetNuméroBloc(i, j)].Add(Grille[i, j]); } } }
/// <summary> /// Affichage en mode texte /// </summary> /// <returns>Chaîne de caractères contenant une représentation du sudoku</returns> public override string ToString() { string line = "+---+---+---++---+---+---++---+---+---+\n"; StringBuilder res = new StringBuilder(line); // Construction des lignes !! for (int li = 0; li < 9; li++) { // Chaque ligne de la grille est affichée sur 3 lignes écran for (int li_ec = 0; li_ec < 3; li_ec++) { res.Append("|"); for (int co = 0; co < 9; co++) { Cellule c = Grille[li, co]; // Chaque colonne est affichée sur 3 colonnes écran for (int co_ec = 0; co_ec < 3; co_ec++) { if (li_ec * co_ec == 1) { // On est au milieu de la cellule if (c.Fixé || c.Trouvé) { res.Append(c.Valeur); continue; } } if (li_ec == 1 && co_ec == 2 && c.Trouvé) { res.Append("."); continue; } if (li_ec == 2 && co_ec == 1 && c.Fixé) { res.Append("-"); continue; } int p = li_ec * 3 + co_ec + 1; res.Append(c.Contient(p) ? p.ToString() : " "); } res.Append("|"); if ((co + 1) % 3 == 0 && co != 8) { res.Append("|"); } } res.Append("\n"); } res.Append(line); if ((li + 1) % 3 == 0 && li != 8) { res.Append(line); } } return(res.ToString()); }
/// <summary> /// Constructeur par copie /// /// Duplique complètement une grille de sudoku en évitant le partage mémoire. /// </summary> /// <param name="sudo">Grille de sudoku à copier</param> public Sudoku(Sudoku sudo) { Lignes = new List <Ligne>(); Colonnes = new List <Colonne>(); Blocs = new List <Bloc>(); Grille = new Cellule[9, 9]; Groupes = new List <Groupe>(); foreach (Ligne copy in sudo.Lignes) { Ligne lgn = new Ligne(copy); lgn.Clear(); Lignes.Add(lgn); } foreach (var copy in sudo.Colonnes) { Colonne col = new Colonne(copy); col.Clear(); Colonnes.Add(col); } foreach (var copy in sudo.Blocs) { Bloc blo = new Bloc(copy); blo.Clear(); Blocs.Add(blo); } Groupes.AddRange(Lignes); Groupes.AddRange(Colonnes); Groupes.AddRange(Blocs); foreach (Cellule cel in sudo.Grille) { Cellule cl = new Cellule(cel, Lignes.ElementAt(cel.Ligne.Numéro), Colonnes.ElementAt(cel.Colonne.Numéro), Blocs.ElementAt(GetNuméroBloc(cel.Ligne.Numéro, cel.Colonne.Numéro))); Grille[cel.Ligne.Numéro, cel.Colonne.Numéro] = cl; Lignes[cel.Ligne.Numéro].Add(cl); Colonnes[cel.Colonne.Numéro].Add(cl); Blocs[GetNuméroBloc(cel.Ligne.Numéro, cel.Colonne.Numéro)].Add(cl); } }