Beispiel #1
0
        // 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]);
                }
            }
        }
Beispiel #2
0
        /// <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());
        }
Beispiel #3
0
        /// <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);
            }
        }