/* Sudoku - Program.cs Programme console de Demo du Moteur de résolution du Sudoku Version 1.1 - Last Modif : 26/04/2006 17:45 Développé par SeBeuh < sebeuh [arobase] ajsinfo [point] net > (c) 2006 - http://sebeuh.ajsinfo.net */ using System; using System.Collections.Generic; using System.Text; using System.IO; namespace SudokuSolve { class Program { static void Main(string[] args) { // Initialisation Console.Title = "SudokuSolver 1.1 by SeBeuH"; // Chargement de la grille initiale // Soit par fichier ou soit l'exemple du programme (ChargerExemple()) Grille grInitiale, grResolu; if (args.Length > 0) grInitiale = Charger(args[0]); else grInitiale = ChargerExemple(); // Initialisation du moteur Moteur moteur = new Moteur(grInitiale); // Affichage de la grille initiale Afficher(grInitiale); // Pret pour la resolution ? Console.WriteLine("\n\nAppuyez sur ENTER pour démarrer la resolution de la grille"); Console.Read(); Console.WriteLine("\nRésolution en cours...."); // Démarrage du chrono DateTime dtDebut = DateTime.Now; // Resolution de la grille et affichage grResolu = moteur.Resolution(); Afficher(grResolu); // Fin du chrono TimeSpan tps = DateTime.Now - dtDebut; // Affichage du chrono et fin ! Console.Write("\n\nSudoku resolu !\nTrouvé en " + tps.Milliseconds.ToString() + " ms"); // Enregister la grille ? Console.Write("\nVoulez vous enregistrer la grille ? (taper Y pour Oui) "); Console.Read(); if (Console.ReadLine().ToString().ToLower() == "y") Enregistrer(grResolu, tps.Milliseconds.ToString()); } // Fonction d'affichage console de la grille du sudoku static void Afficher(Grille grille) { Console.Clear(); Console.WriteLine("SudokuSolver 1.1 by SeBeuH"); Console.BackgroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Red; for (int a = 0; a < 9; a++ ) { for(int b = 0; b < 9; b++) { string space; // Gestion des couleurs if (grille.contenu[a,b].locked) Console.ForegroundColor = ConsoleColor.Blue; else Console.ForegroundColor = ConsoleColor.Red; // Gestion de l'affichage if (b == 0) { space = "\n"; Console.Write("\n"); for (int ab = 0; ab < 9; ab++) Console.Write("\t"); } else space = ""; // Affichage if (grille.contenu[a,b].valeur == 0) Console.Write(space + ".\t"); else Console.Write(space + grille.contenu[a, b].valeur + "\t"); } } // Couleur par defaut Console.ResetColor(); } // Fonction permettant de charger une grille depuis un fichier // et retourne une grille static Grille Charger(string fichier) { try { Grille grille = new Grille(true); // Ouverture du fichier FileStream istream = new FileStream(fichier, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(istream); int ligne = 0; string[][] contenu = new string[9][]; // Lecture du fichier while (reader.Peek() > 0) { string str = reader.ReadLine(); if(!str.StartsWith("#")) contenu[ligne++] = str.Split(new char [] {';'}); } istream.Close (); // Remplissage de la grille for (int a = 0; a < 9; a++) { for (int b = 0; b < 9; b++) { if (Convert.ToInt16(contenu[a][b]) != 0) { grille.contenu[a, b].valeur = Convert.ToInt16(contenu[a][b]); grille.contenu[a, b].locked = true; } } } // Retourne la grille return grille; } catch (Exception ex) { // Oups !! Erreur ^^ Console.WriteLine ("Impossible de charger le fichier\nErreur :" + ex.Message); Console.Read(); Environment.Exit(1); return new Grille(); } } // Fonction permettant l'enregistrement de la grille static void Enregistrer(Grille grille, string temps) { Console.Write("Nom du fichier : "); string fichier = Console.ReadLine(); try { // Ouverture du fichier FileStream istream = new FileStream(fichier, FileMode.Create, FileAccess.Write); StreamWriter writer = new StreamWriter(istream); // Ecriture de l'entete writer.WriteLine("# SudokuSolver 1.1 by Sebeuh "); writer.WriteLine("# Resolution de cette grille en " + temps + " ms"); writer.WriteLine("# Resolu le " + DateTime.Now.ToShortDateString() + " à " + DateTime.Now.ToShortTimeString()); // Ecriture de la grille for (int a = 0; a < 9; a++) { for (int b = 0; b < 9; b++) { if (b == 8) writer.WriteLine(grille.contenu[a, b].valeur.ToString()); else writer.Write(grille.contenu[a, b].valeur.ToString() + ";"); } } // Fin writer.Close(); istream.Close(); Console.WriteLine("La grille a bien été enregistré dans " + fichier); } catch (Exception ex) { // Erreur !! Console.WriteLine("Erreur lors de l'enregistrement de la grille"); Console.WriteLine("Erreur : " + ex.Message); } Console.Read(); } // Fonction de génération d'une grille de sudoku // Grille tiré du 20minutes du 25/04/06 - Niveau facile static Grille ChargerExemple() { Grille test = new Grille(true); // Ligne 0 test.contenu[0, 0].valeur = 2; test.contenu[0, 2].valeur = 4; test.contenu[0, 3].valeur = 5; test.contenu[0, 4].valeur = 9; test.contenu[0, 7].valeur = 3; test.contenu[0, 8].valeur = 7; // Ligne 1 test.contenu[1, 2].valeur = 3; test.contenu[1, 3].valeur = 7; test.contenu[1, 5].valeur = 8; test.contenu[1, 6].valeur = 1; test.contenu[1, 7].valeur = 2; // Ligne 2 test.contenu[2, 1].valeur = 7; test.contenu[2, 2].valeur = 1; test.contenu[2, 3].valeur = 3; test.contenu[2, 8].valeur = 8; // Ligne 3 test.contenu[3, 7].valeur = 5; // Ligne 4 test.contenu[4, 0].valeur = 7; test.contenu[4, 2].valeur = 5; test.contenu[4, 6].valeur = 3; test.contenu[4, 8].valeur = 9; // Ligne 5 test.contenu[5, 1].valeur = 1; // Ligne 6 test.contenu[6, 0].valeur = 9; test.contenu[6, 5].valeur = 3; test.contenu[6, 6].valeur = 2; test.contenu[6, 7].valeur = 7; // Ligne 7 test.contenu[7, 1].valeur = 2; test.contenu[7, 2].valeur = 6; test.contenu[7, 3].valeur = 8; test.contenu[7, 5].valeur = 9; test.contenu[7, 6].valeur = 5; // Ligne 8 test.contenu[8, 0].valeur = 1; test.contenu[8, 1].valeur = 5; test.contenu[8, 4].valeur = 6; test.contenu[8, 5].valeur = 4; test.contenu[8, 6].valeur = 9; test.contenu[8, 8].valeur = 3; // Blocage des cases inscrites for (int a = 0; a < 9; a++) { for (int b = 0; b < 9; b++) { if(test.contenu[a, b].valeur > 0) test.contenu[a, b].locked = true; } } return test; } } }