Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include "devatypes.h"
- #include "utils.h"
- //#include "pilehexadocu.h"
- #include "entreessorties.h"
- #include "grille.h"
- #include "grille3D.h"
- #include "resolution.h"
- // Pour [mieux] fonctionner sous windows, la ligne suivante doit être commentée
- // de manière à saisir la grille via un scanf au lieu d'utiliser un paramètre
- // sur la ligne de commande.
- //#define HEXALINUX
- //-----------------------------------------------------------------------------
- #ifdef HEXALINUX
- int main (int argc, const TString argv[])
- #else
- int main (void)
- #endif
- {
- unsigned int GTaille = 0; // Taille de la grille (4, 9, 16, 25, 36...)
- unsigned int RTaille = 0; // Taille d'une région (2, 3, 4, 5, 6...)
- TPileCoupsJoues pile; // Pile des coups joués
- TGrille grille = NULL; // Grille de jeu
- TGrille3D grille3D = NULL; // Grille des compteurs
- TMarques marques; // Grille de marqueurs
- unsigned int plan; // Variable de boucle pour énumérer les plans 1 à GTaille
- unsigned int nbCoupsUniques; // Utilisé pour annuler coups uniques (backtracks)
- //bool okunicite = false; // Pas de doublon dans la grille ?
- //bool auMoins1CoupUnique; // Indique s'il y a eu des coups unique à jouer
- bool trouve; // Point de départ, trouvé ?
- TPosition position; // Position de départ
- unsigned int ligne;
- unsigned int colonne;
- unsigned int chiffre;
- unsigned int coupsjoues; // Coups joues pour tester la pile des coups joués
- char nomfichier[255]; // Chemin complet du fichier contenant la grille
- int choix ;
- int score = 0 ;
- #ifdef HEXALINUX
- // Récupération du chemin et du nom du fichier contenant la grille
- // depuis le première paramètre sur la ligne de commande
- if (argc != 2)
- afficheerreur("hexadoku: nom de fichier grille manquant (en argument sur la ligne de commande)");
- strncpy(nomfichier, argv[1], 255);
- #else
- // Récupération du chemin et du nom du fichier contenant la grille
- // via une saisir au clavier
- // puts("hexadoku: Entrez le chemin et le nom du fichier (chemin complet) contenant la grille :");
- // scanf("%255s", nomfichier);
- strcpy(nomfichier, choixGrille());
- #endif
- GTaille = lireTailleGrille(nomfichier);
- if (GTaille == 0)
- afficheerreur("hexadoku: fichier grille introuvable ou taille de grille incorrecte (en argument sur la ligne de commande)");
- RTaille = RacineEntiere(GTaille);
- printf("# Sudoku de taille %ux%u - %d régions de taille %dx%d\n",
- GTaille, GTaille, GTaille, RTaille, RTaille);
- initPileCoupsJoues(&pile, GTaille * GTaille);
- initGrille(&grille, GTaille);
- initGrille3D(&grille3D, GTaille);
- initMarques(&marques, GTaille);
- lireGrille(nomfichier, GTaille, RTaille, grille);
- puts("Grille de jeu :\n");
- afficheGrille(grille, GTaille, RTaille);
- puts("Liste des caractères utilisables dans la grille de sudoku :\n");
- affichelistecaracteres(grille, GTaille);
- if (verifieUnicite(grille, GTaille, RTaille) == false)
- afficheerreur("sudoku: doublon(s) dans la grille");
- /*
- // Plans 1 à GTaille + cumul (possibilités de jeu)
- miseajourPlans(grille, grille3D, GTaille, RTaille);
- puts("Grille des possibilités de jeu :\n");
- afficheGrillePossibilites(grille3D, grille, GTaille, RTaille);
- puts("Plan 0 de la Grille3D :\n");
- afficheGrilleCompteursPlan(grille3D, GTaille, 0);
- for (plan=1; plan<=GTaille; plan++) {
- printf("Possibilités de placement du symbole %d :\n\n", plan);
- afficheGrilleCompteursPlan(grille3D, GTaille, plan);
- }
- }
- */
- GTaille = lireTailleGrille(nomfichier);
- if (GTaille == 0)
- afficheerreur("hexadoku: fichier grille introuvable ou taille de grille incorrecte (en argument sur la ligne de commande)");
- RTaille = RacineEntiere(GTaille);
- printf("# Sudoku de taille %ux%u - %d régions de taille %dx%d\n",
- GTaille, GTaille, GTaille, RTaille, RTaille);
- do
- {
- puts("\n** 1 - Jouer un Coup **\n");
- puts("** 2 - Annuler un coup **\n");
- puts("** 3 - Afficher de l'aide **\n");
- puts("** 4 - Sauvegarder la grille **\n");
- puts("** 5 - Quitter le jeux **\n ");
- puts("Veuillez faire votre choix");
- scanf("%d",&choix);
- if (choix==1)
- {
- system("@cls||clear");
- afficheGrille(grille,GTaille,RTaille);
- char symbole ;
- int coderetour; // Code de retour de scanf
- do
- {
- printf("Veuillez entrer la ligne, la colonne et le symbole pour jouer un coup : ");
- coderetour = scanf("%u %u %1s", &ligne, &colonne, &symbole);
- switch (coderetour)
- {
- case 0:
- puts("\n Aucune valeur correcte, veuillez saisir de nouveau.\n");
- break;
- case 1:
- puts("\n Une seule valeur correcte sur les trois, veuillez saisir de nouveau.\n");
- break;
- case 2:
- puts("\n Deux valeurs correctes sur les trois, veuillez saisir de nouveau.\n");
- break;
- case 3:
- break; // Valeurs correctes, ne rien afficher
- default:
- puts("\n Erreur inattendue, arrêtez d'utiliser Micro$oft Windows !\n");
- break;
- }
- }
- while (coderetour != 3);
- // Test si coup possible
- ligne-- ;
- colonne -- ;
- if ( (1<=ligne<=GTaille) && ( 1<=colonne<=GTaille ) &&
- (char2plan(grille,GTaille,symbole)>0) &&
- (grille[ligne][colonne] == '0') &&
- (symboleautoriseenligne(grille,GTaille,ligne,char2plan(grille,GTaille,symbole))==1) &&
- (symboleautoriseencolonne(grille,GTaille,colonne,char2plan(grille,GTaille,symbole))==1) &&
- (symboleautoriseenregion(grille,GTaille,RTaille,ligne,colonne,char2plan(grille,GTaille,symbole))==true) )
- {
- printf("%u %u",ligne,colonne);
- jouerUnCoup(grille, grille3D, GTaille, RTaille,
- ligne, colonne, char2plan(grille,GTaille,symbole), &pile);
- puts("joue\n");
- miseajourPlans(grille, grille3D, GTaille, RTaille);
- puts("Grille de jeu :\n");
- afficheGrille(grille, GTaille, RTaille);
- }
- else
- {
- printf("Coup non autorise \n");
- }
- system("@cls||clear");
- afficheGrille(grille,GTaille,RTaille);
- score+=20 ;
- printf("+ 20 points allez y continuez ");
- }
- if (choix==2) // Annuler un coup
- {
- system("@cls||clear");
- afficheGrille(grille,GTaille,RTaille);
- annulerUnCoup(grille,&pile);
- printf("Grille apres annulation d'un coup\n") ;
- system("@cls||clear");
- score-=10 ;
- printf("-10 points soyez sure avant de jouer la prochaine fois ! ");
- afficheGrille(grille,GTaille,RTaille);
- }
- if (choix==3)
- { score-=20 ;
- system("@cls||clear");
- afficheGrille(grille,GTaille,RTaille);
- nbCoupsUniques = 0;
- // Chercher nouveau point de départ pour tenter de jouer un coup :
- cherchePointDeDepart(grille, grille3D, marques, GTaille, &trouve, &position);
- // Abandonner les recherches depuis cette grille si plus possible de jouer un coup !
- if (trouve == false)
- {
- // Plus de point de départ
- if (grilleComplete(grille, GTaille))
- {
- afficheGrille(grille, GTaille, RTaille);
- puts("\nGrille complète\n--> Solution trouvée !\n");
- break;
- }
- puts("\nAucun point de départ trouvé !\n");
- break; // Aucun point de départ trouvé
- }
- marques[position.ligne][position.colonne] = false; // Annuler la marque courante (pour solution non récursive)
- // Est-ce une position où un (seul) symbole peut être joué ?
- if (grille3D[position.ligne+1][position.colonne+1][0] == 0)
- {
- puts("\n Il faut commencer a jouer avant de demander l'aide ! ");
- break; // Cas particulier, grille non faisable
- }
- else if (grille3D[position.ligne+1][position.colonne+1][0] == 1)
- {
- nbCoupsUniques++;
- }
- else
- // Nous avons la position (position.ligne,c), il reste à déterminer le chiffre
- // (i.e. le numéro du symbole ou le numéro de plan "p") à jouer.
- //
- // Cherchons d'abord les possibilités de jeu unique :
- trouve = false;
- plan = 0; // Commence à 0 car incrémenté avant le test (trouve = ...)
- while ((!trouve) && (plan < GTaille) && (grille3D[position.ligne+1][position.colonne+1][0] == 1))
- {
- plan++;
- // Chiffre à jouer "trouvé" !?
- trouve = (grille3D[position.ligne+1][position.colonne+1][plan] == 1);
- }
- if (!trouve)
- {
- puts("Impossible de trouver une possibilité de jeu unique, cherche possibilité de jeu multiple");
- // Cherchons d'abord les possibilités de jeu multiple :
- plan = 0; // Commence à 0 car incrémenté avant le test (trouve = ...)
- while ((!trouve) && (plan < GTaille))
- {
- plan++;
- // Chiffre à jouer "trouvé" !?
- trouve = (grille3D[position.ligne+1][position.colonne+1][plan] == 1);
- }
- if (!trouve)
- {
- puts("\n Impossible de trouver une possibilité de jeu multiple !\n");
- break;
- }
- }
- printf("Vous pouvez jouez %d \n",plan);
- printf("Ce coup qui sera joué ne se comptera pas à vos points ! \n");
- afficheGrille(grille,GTaille,RTaille);
- }
- }
- while ( (choix!=5) && (grilleComplete(grille, GTaille) )) ;
- afficheGrille(grille,GTaille,RTaille);
- if (choix!=5) printf("Grille remplie ! Check your score : %d \n",score);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement