Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.82 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "devatypes.h"
  5. #include "utils.h"
  6. //#include "pilehexadocu.h"
  7. #include "entreessorties.h"
  8. #include "grille.h"
  9. #include "grille3D.h"
  10. #include "resolution.h"
  11.  
  12. // Pour [mieux] fonctionner sous windows, la ligne suivante doit être commentée
  13. // de manière à saisir la grille via un scanf au lieu d'utiliser un paramètre
  14. // sur la ligne de commande.
  15. //#define HEXALINUX
  16.  
  17. //-----------------------------------------------------------------------------
  18. #ifdef HEXALINUX
  19. int main (int argc, const TString argv[])
  20. #else
  21. int main (void)
  22. #endif
  23. {
  24. unsigned int GTaille = 0; // Taille de la grille (4, 9, 16, 25, 36...)
  25. unsigned int RTaille = 0; // Taille d'une région (2, 3, 4, 5, 6...)
  26. TPileCoupsJoues pile; // Pile des coups joués
  27. TGrille grille = NULL; // Grille de jeu
  28. TGrille3D grille3D = NULL; // Grille des compteurs
  29. TMarques marques; // Grille de marqueurs
  30. unsigned int plan; // Variable de boucle pour énumérer les plans 1 à GTaille
  31. unsigned int nbCoupsUniques; // Utilisé pour annuler coups uniques (backtracks)
  32. //bool okunicite = false; // Pas de doublon dans la grille ?
  33. //bool auMoins1CoupUnique; // Indique s'il y a eu des coups unique à jouer
  34. bool trouve; // Point de départ, trouvé ?
  35. TPosition position; // Position de départ
  36. unsigned int ligne;
  37. unsigned int colonne;
  38. unsigned int chiffre;
  39. unsigned int coupsjoues; // Coups joues pour tester la pile des coups joués
  40. char nomfichier[255]; // Chemin complet du fichier contenant la grille
  41. int choix ;
  42. int score = 0 ;
  43.  
  44. #ifdef HEXALINUX
  45. // Récupération du chemin et du nom du fichier contenant la grille
  46. // depuis le première paramètre sur la ligne de commande
  47. if (argc != 2)
  48. afficheerreur("hexadoku: nom de fichier grille manquant (en argument sur la ligne de commande)");
  49. strncpy(nomfichier, argv[1], 255);
  50. #else
  51. // Récupération du chemin et du nom du fichier contenant la grille
  52. // via une saisir au clavier
  53. // puts("hexadoku: Entrez le chemin et le nom du fichier (chemin complet) contenant la grille :");
  54. // scanf("%255s", nomfichier);
  55. strcpy(nomfichier, choixGrille());
  56. #endif
  57.  
  58. GTaille = lireTailleGrille(nomfichier);
  59. if (GTaille == 0)
  60. afficheerreur("hexadoku: fichier grille introuvable ou taille de grille incorrecte (en argument sur la ligne de commande)");
  61.  
  62. RTaille = RacineEntiere(GTaille);
  63. printf("# Sudoku de taille %ux%u - %d régions de taille %dx%d\n",
  64. GTaille, GTaille, GTaille, RTaille, RTaille);
  65.  
  66. initPileCoupsJoues(&pile, GTaille * GTaille);
  67. initGrille(&grille, GTaille);
  68. initGrille3D(&grille3D, GTaille);
  69. initMarques(&marques, GTaille);
  70. lireGrille(nomfichier, GTaille, RTaille, grille);
  71.  
  72. puts("Grille de jeu :\n");
  73. afficheGrille(grille, GTaille, RTaille);
  74.  
  75. puts("Liste des caractères utilisables dans la grille de sudoku :\n");
  76. affichelistecaracteres(grille, GTaille);
  77.  
  78. if (verifieUnicite(grille, GTaille, RTaille) == false)
  79. afficheerreur("sudoku: doublon(s) dans la grille");
  80. /*
  81. // Plans 1 à GTaille + cumul (possibilités de jeu)
  82. miseajourPlans(grille, grille3D, GTaille, RTaille);
  83.  
  84. puts("Grille des possibilités de jeu :\n");
  85. afficheGrillePossibilites(grille3D, grille, GTaille, RTaille);
  86.  
  87. puts("Plan 0 de la Grille3D :\n");
  88. afficheGrilleCompteursPlan(grille3D, GTaille, 0);
  89.  
  90. for (plan=1; plan<=GTaille; plan++) {
  91. printf("Possibilités de placement du symbole %d :\n\n", plan);
  92. afficheGrilleCompteursPlan(grille3D, GTaille, plan);
  93. }
  94. }
  95. */
  96.  
  97. GTaille = lireTailleGrille(nomfichier);
  98. if (GTaille == 0)
  99. afficheerreur("hexadoku: fichier grille introuvable ou taille de grille incorrecte (en argument sur la ligne de commande)");
  100.  
  101. RTaille = RacineEntiere(GTaille);
  102. printf("# Sudoku de taille %ux%u - %d régions de taille %dx%d\n",
  103. GTaille, GTaille, GTaille, RTaille, RTaille);
  104.  
  105. do
  106. {
  107. puts("\n** 1 - Jouer un Coup **\n");
  108. puts("** 2 - Annuler un coup **\n");
  109. puts("** 3 - Afficher de l'aide **\n");
  110. puts("** 4 - Sauvegarder la grille **\n");
  111. puts("** 5 - Quitter le jeux **\n ");
  112.  
  113. puts("Veuillez faire votre choix");
  114.  
  115. scanf("%d",&choix);
  116. if (choix==1)
  117. {
  118. system("@cls||clear");
  119. afficheGrille(grille,GTaille,RTaille);
  120.  
  121. char symbole ;
  122.  
  123. int coderetour; // Code de retour de scanf
  124.  
  125. do
  126. {
  127. printf("Veuillez entrer la ligne, la colonne et le symbole pour jouer un coup : ");
  128.  
  129. coderetour = scanf("%u %u %1s", &ligne, &colonne, &symbole);
  130. switch (coderetour)
  131. {
  132. case 0:
  133. puts("\n Aucune valeur correcte, veuillez saisir de nouveau.\n");
  134.  
  135. break;
  136. case 1:
  137. puts("\n Une seule valeur correcte sur les trois, veuillez saisir de nouveau.\n");
  138.  
  139. break;
  140. case 2:
  141. puts("\n Deux valeurs correctes sur les trois, veuillez saisir de nouveau.\n");
  142.  
  143. break;
  144. case 3:
  145. break; // Valeurs correctes, ne rien afficher
  146. default:
  147. puts("\n Erreur inattendue, arrêtez d'utiliser Micro$oft Windows !\n");
  148.  
  149. break;
  150. }
  151. }
  152. while (coderetour != 3);
  153.  
  154.  
  155. // Test si coup possible
  156. ligne-- ;
  157. colonne -- ;
  158. if ( (1<=ligne<=GTaille) && ( 1<=colonne<=GTaille ) &&
  159. (char2plan(grille,GTaille,symbole)>0) &&
  160. (grille[ligne][colonne] == '0') &&
  161. (symboleautoriseenligne(grille,GTaille,ligne,char2plan(grille,GTaille,symbole))==1) &&
  162. (symboleautoriseencolonne(grille,GTaille,colonne,char2plan(grille,GTaille,symbole))==1) &&
  163. (symboleautoriseenregion(grille,GTaille,RTaille,ligne,colonne,char2plan(grille,GTaille,symbole))==true) )
  164.  
  165. {
  166.  
  167. printf("%u %u",ligne,colonne);
  168. jouerUnCoup(grille, grille3D, GTaille, RTaille,
  169. ligne, colonne, char2plan(grille,GTaille,symbole), &pile);
  170. puts("joue\n");
  171. miseajourPlans(grille, grille3D, GTaille, RTaille);
  172. puts("Grille de jeu :\n");
  173. afficheGrille(grille, GTaille, RTaille);
  174.  
  175. }
  176.  
  177.  
  178. else
  179. {
  180. printf("Coup non autorise \n");
  181.  
  182. }
  183.  
  184.  
  185.  
  186. system("@cls||clear");
  187.  
  188. afficheGrille(grille,GTaille,RTaille);
  189.  
  190.  
  191.  
  192. score+=20 ;
  193. printf("+ 20 points allez y continuez ");
  194.  
  195. }
  196. if (choix==2) // Annuler un coup
  197. {
  198. system("@cls||clear");
  199.  
  200. afficheGrille(grille,GTaille,RTaille);
  201.  
  202. annulerUnCoup(grille,&pile);
  203. printf("Grille apres annulation d'un coup\n") ;
  204. system("@cls||clear");
  205. score-=10 ;
  206. printf("-10 points soyez sure avant de jouer la prochaine fois ! ");
  207. afficheGrille(grille,GTaille,RTaille);
  208. }
  209.  
  210. if (choix==3)
  211.  
  212. { score-=20 ;
  213. system("@cls||clear");
  214.  
  215. afficheGrille(grille,GTaille,RTaille);
  216.  
  217. nbCoupsUniques = 0;
  218. // Chercher nouveau point de départ pour tenter de jouer un coup :
  219. cherchePointDeDepart(grille, grille3D, marques, GTaille, &trouve, &position);
  220. // Abandonner les recherches depuis cette grille si plus possible de jouer un coup !
  221. if (trouve == false)
  222. {
  223. // Plus de point de départ
  224. if (grilleComplete(grille, GTaille))
  225. {
  226. afficheGrille(grille, GTaille, RTaille);
  227. puts("\nGrille complète\n--> Solution trouvée !\n");
  228. break;
  229. }
  230. puts("\nAucun point de départ trouvé !\n");
  231. break; // Aucun point de départ trouvé
  232.  
  233. }
  234. marques[position.ligne][position.colonne] = false; // Annuler la marque courante (pour solution non récursive)
  235.  
  236.  
  237. // Est-ce une position où un (seul) symbole peut être joué ?
  238. if (grille3D[position.ligne+1][position.colonne+1][0] == 0)
  239. {
  240. puts("\n Il faut commencer a jouer avant de demander l'aide ! ");
  241.  
  242. break; // Cas particulier, grille non faisable
  243. }
  244. else if (grille3D[position.ligne+1][position.colonne+1][0] == 1)
  245. {
  246. nbCoupsUniques++;
  247. }
  248. else
  249.  
  250. // Nous avons la position (position.ligne,c), il reste à déterminer le chiffre
  251. // (i.e. le numéro du symbole ou le numéro de plan "p") à jouer.
  252. //
  253. // Cherchons d'abord les possibilités de jeu unique :
  254. trouve = false;
  255. plan = 0; // Commence à 0 car incrémenté avant le test (trouve = ...)
  256. while ((!trouve) && (plan < GTaille) && (grille3D[position.ligne+1][position.colonne+1][0] == 1))
  257. {
  258. plan++;
  259. // Chiffre à jouer "trouvé" !?
  260. trouve = (grille3D[position.ligne+1][position.colonne+1][plan] == 1);
  261. }
  262. if (!trouve)
  263. {
  264. puts("Impossible de trouver une possibilité de jeu unique, cherche possibilité de jeu multiple");
  265. // Cherchons d'abord les possibilités de jeu multiple :
  266. plan = 0; // Commence à 0 car incrémenté avant le test (trouve = ...)
  267. while ((!trouve) && (plan < GTaille))
  268. {
  269. plan++;
  270. // Chiffre à jouer "trouvé" !?
  271. trouve = (grille3D[position.ligne+1][position.colonne+1][plan] == 1);
  272. }
  273. if (!trouve)
  274. {
  275. puts("\n Impossible de trouver une possibilité de jeu multiple !\n");
  276. break;
  277. }
  278. }
  279.  
  280. printf("Vous pouvez jouez %d \n",plan);
  281. printf("Ce coup qui sera joué ne se comptera pas à vos points ! \n");
  282.  
  283. afficheGrille(grille,GTaille,RTaille);
  284.  
  285.  
  286.  
  287. }
  288.  
  289.  
  290. }
  291. while ( (choix!=5) && (grilleComplete(grille, GTaille) )) ;
  292. afficheGrille(grille,GTaille,RTaille);
  293. if (choix!=5) printf("Grille remplie ! Check your score : %d \n",score);
  294. return 0;
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement