Advertisement
Guest User

Untitled

a guest
Jul 5th, 2017
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
DOT 12.64 KB | None | 0 0
  1. /*********************************/
  2. /*TURNO: VIERNES                 */
  3. /*GRUPO: 4                       */
  4. /*AUTORES: ALBERTO LARA CARAVACA */
  5. /*ANGEL PEREZ LEMONCHE           */
  6. /*                               */
  7. /*PRACTICA: 7                    */
  8. /*EJERCICIO: PROYECTO SUDOKU     */
  9. /*                               */
  10. /*FECHA: 21/12/10                */
  11. /*********************************/
  12.  
  13. #define _CRT_SECURE_NO_DEPRECATE
  14. #define _CRT_SECURE_NO_WARNINGS
  15.  
  16. #include <stdio.h>
  17. #include <string.h>
  18.  
  19.  
  20. typedef struct
  21. {
  22. int huecos;
  23. char partida[14];
  24. char panel[9][9];
  25. char original[9][9];
  26. char grabada[14];
  27. }Sudoku;
  28.  
  29. /*MOSTRAR CABECERA*/
  30. void mostrarCabecera ()
  31. {
  32. printf (" **********************\n");
  33. printf (" *   *     *     *    *\n");
  34. printf (" *    *   SUDOKU      *\n");
  35. printf (" *   *      *     *   *\n");
  36. printf (" **********************\n");
  37. }
  38.  
  39. /*GUARDA TABLERO*/
  40. int guardaTablero(Sudoku juego)
  41. {
  42.     /*VARIABLES*/
  43.     FILE * g, * h, *i, *j;
  44.     int a, b;
  45.     char nombre[50];
  46.     char cmpnom[50];
  47.     char nombre2[50];
  48.     char carpeta1[100] = "almacenadas/";
  49.     char carpeta2[100] = "almacenadas/";
  50.  
  51.         h = fopen("general/almacenadas.txt", "a");
  52.     if (h==NULL)
  53.        return 0;
  54.        j=fopen("general/almacenadas.txt", "r");
  55.     if(j==NULL)
  56.        return 0;
  57.           printf("Introduzca el nombre de la partida que desea guardar: ");
  58.           scanf("%s", nombre);
  59.     while (!feof (j))
  60.     {
  61.     fscanf(j,"%s", cmpnom);
  62.    
  63.     if (strcmp(cmpnom, nombre)==0)
  64.        break;
  65.     }
  66.     fclose (j);
  67.    
  68.     if (strcmp (cmpnom, nombre) != 0)
  69.     fprintf(h, "%s\n", nombre);
  70.     fclose (h);
  71.  
  72.     strcpy (nombre2, nombre);
  73.     strcat (nombre, ".txt");
  74.     strcat (nombre2," O.txt");
  75.     strcat (carpeta1, nombre);
  76.     strcat (carpeta2, nombre2);
  77.        
  78.     g = fopen(carpeta1, "w");
  79.     if (g==NULL) return 0;
  80.  
  81.     i = fopen(carpeta2, "w");
  82.     if (i==NULL) return 0;
  83.  
  84.     for(a=0; a<9; a++)
  85.         {
  86.             for(b=0; b<9; b++)
  87.             {
  88.                 fprintf(i,"%c", juego.original[a][b]);
  89.  
  90.                 if (juego.panel[a][b]== ' ')
  91.                     fprintf(g,".");
  92.                 else
  93.                     fprintf(g,"%c",juego.panel[a][b]);
  94.             }
  95.             fprintf(g,"\n");
  96.             fprintf(i,"\n");
  97.     }
  98.     fclose (g);
  99.     fclose (i);
  100.     return 3;
  101. }
  102. /*COMPRUEBA COORDENADAS*/
  103. int compruebaCoordenadas(char * coord)
  104. {
  105.     if(strlen(coord) != 2)
  106.         return 0;
  107.  
  108.     else if ((coord[0] <'A' || coord [0] > 'I') || (coord[1] <'1' || coord [1] > '9'))
  109.         return 0;
  110.  
  111.     else
  112.         return 1;
  113. }
  114.  
  115. /*CASILLA VACÍA*/
  116. int casillaVacia(Sudoku juego, char *coord)
  117. {
  118.     coord [0]= coord [0]- 'A'; coord[1]=coord [1]-'1';
  119.     if  (juego.original[coord[0]][coord [1]] =='1')
  120.         return 0;
  121.     else
  122.         return 1;
  123. }
  124.  
  125. /*COMPRUEBA NÚMERO*/
  126. int compruebaNumero(char * num)
  127. {
  128.     if(strlen(num) != 1)
  129.         return 0;
  130.  
  131.     else if ((num[0] <'1' || num [0]> '9') && num[0]!= '.')
  132.         return 0;
  133.  
  134.     else
  135.         return 1;
  136. }
  137.  
  138. /*COMPRUEBA POSICIÓN*/
  139. int compruebaPosicion (Sudoku juego, char *coord, char *num)
  140. {
  141.     /*VARIABLES*/
  142.     int fila, columna, q, p, f, c;
  143.  
  144.     fila=coord[0];
  145.     columna=coord[1];
  146.  
  147.     f=(fila/3)*3;
  148.     c=(columna/3)*3;
  149.  
  150. //Comprobación de la columna
  151.     for (q=0; q<9; q++)
  152.     {
  153.         if(juego.panel[q][columna]==num[0])
  154.         return 5;
  155.     }
  156. //Comprobación de la fila
  157.     for(q=0; q<9; q++)
  158.     {
  159.         if(juego.panel[fila][q]==num[0])
  160.         return 6;
  161.     }
  162. //Comprobación del cuadrante
  163.     for(q=0;q<3;q++)
  164.         for(p=0;p<3;p++)
  165.         {
  166.             if (juego.panel[f+q][c+p]==num[0])
  167.             return 7;
  168.         }
  169.     return 8;
  170. }
  171.  
  172. /*INSERTA NÚMERO*/
  173. int insertaNumero(Sudoku *juego, char *coord)
  174. {
  175.     /*VARIABLES*/
  176.     char num[50];
  177.     double porcentaje;
  178.     int pos, numero;
  179.  
  180.     if (compruebaCoordenadas (coord) == 0)
  181.         return 2;
  182.     else if (casillaVacia (*juego, coord) == 0)
  183.         return 3;
  184.  
  185.             printf("Introduzca el valor (1-9): ");
  186.             scanf("\n%s", num);
  187.             numero=compruebaNumero (num);
  188.     if (numero == 0)
  189.         return 4;
  190.  
  191.             pos=compruebaPosicion (*juego, coord, num);
  192.     if (pos !=8)
  193.         return pos;
  194.  
  195.       if (num[0]=='.')
  196.       num[0]= ' ';
  197.             juego->panel[coord[0]][coord[1]] = num[0];
  198.             if (num[0]!=' ')
  199.            juego->huecos--;
  200.            else if(num[0]== ' ')
  201.            juego->huecos++;
  202.            porcentaje= 100 * (81.0 - juego->huecos)/81;
  203.         printf("\n\nPartida: %s Numero de huecos: %d\nPorcentaje de tablero relleno:%.2lf%%\n",juego->partida, juego->huecos, porcentaje);
  204.         return 1;
  205. }
  206.  
  207. /*MENÚ INICIAL*/
  208. int menuinicial ()
  209. {
  210.     int opcion;
  211.     mostrarCabecera();
  212.     printf("\n<Este Sudoku funciona en MAYUSCULAS si lo desea pulse BLOQ MAYUS>\n\n");
  213.     printf("1 Empezar partida\n2 Recuperar una partida\n3 Salir del programa\n");
  214.     printf("  Escoja una opcion: ");
  215.     scanf("%d", &opcion);
  216.     while (opcion < 1 || opcion > 3)
  217.         {
  218.             printf("Opcion Incorrecta. Escoja una opcion: ");
  219.             scanf("%d", &opcion);
  220.         }
  221.             return opcion;
  222. }
  223.  
  224. /*LEER PARTIDAS*/
  225. int leerPartidas (char* nombre)
  226. {
  227.     FILE * f;
  228.     char puzzle[10];
  229.     f = fopen (nombre, "r");
  230.     if (f == NULL)
  231.         {
  232.         return 0;
  233.         }
  234.     else
  235.         {
  236.             printf("Las partidas disponibles son:\n");
  237.             while (!feof (f))
  238.             {
  239.             if (fscanf (f, "%s", puzzle) == 1)
  240.                 printf("%s\n", puzzle);
  241.             else if (fscanf (f,"%s", puzzle) != 1)
  242.                 break;
  243.             }
  244.             fclose(f);
  245.         }
  246.     return 1;
  247. }
  248. /*COMPRUEBA ORIGINAL*/
  249. int compruebaOriginal(Sudoku * juego)
  250. {
  251.     /*VARIABLES*/
  252.     FILE * p;
  253.     int i,j;
  254.     char nombre[50];
  255.     char carpeta[100]= "almacenadas/";
  256.  
  257.     strcpy (nombre, juego->partida);
  258.     strcat (nombre, " O.txt");
  259.     strcat (carpeta, nombre);
  260.  
  261.     p=fopen(carpeta, "r");
  262.   if (p == NULL)
  263.     return 0;
  264.  
  265.     for (i=0; i<9; i++)
  266.     {
  267.     for (j=0; j<9; j++)
  268.         {
  269.             fscanf(p, "\n%c", &juego->original[i][j]);
  270.         }
  271.     }
  272.     fclose(p);
  273.     return 1;
  274. }
  275. /*LEER TABLERO*/
  276. int leeTablero (Sudoku * juego, char * carp)
  277. {
  278.     /*VARIABLES*/
  279.     FILE * p;
  280.     int i,j, valor;
  281.     char nombre[50];
  282.     char carpeta[100];
  283.  
  284.     strcpy(carpeta, carp);
  285.     strcpy (nombre, juego->partida);
  286.     strcat (nombre, ".txt");
  287.     strcat (carpeta, nombre);
  288.  
  289.     p=fopen(carpeta, "r");
  290.   if (p == NULL)
  291.     return 0;
  292.     valor=compruebaOriginal (juego);
  293.     for (i=0; i<9; i++)
  294.     {
  295.     for (j=0; j<9; j++)
  296.         {
  297.             fscanf(p, "\n%c", &juego->panel[i][j]);
  298.  
  299.             if (juego->panel[i][j] =='.')
  300.         {
  301.         juego->panel[i][j]=' ';
  302.             if (valor ==0)
  303.             juego->original[i][j]='0';
  304.         }
  305.             else if(valor == 0)
  306.                 juego->original[i][j]='1';
  307.  
  308.  
  309.         if (juego->panel[i][j]!= ' ')
  310.             {
  311.             juego->huecos = (juego->huecos - 1);
  312.             }
  313.         }
  314.     }
  315.     fclose (p);
  316.     return 1;
  317. }
  318.  
  319. /*DIBUJA TABLERO*/
  320. void dibujaTablero (Sudoku juego)
  321. {
  322.     printf("\n  |1 2 3|4 5 6|7 8 9|");
  323.     printf("\n -+-----+-----+-----+");                    
  324.     printf("\n A|%c %c %c|%c %c %c|%c %c %c|", juego.panel[0][0], juego.panel[0][1], juego.panel[0][2], juego.panel[0][3], juego.panel[0][4], juego.panel[0][5], juego.panel[0][6], juego.panel[0][7], juego.panel[0][8]);
  325.     printf("\n B|%c %c %c|%c %c %c|%c %c %c|", juego.panel[1][0], juego.panel[1][1], juego.panel[1][2], juego.panel[1][3], juego.panel[1][4], juego.panel[1][5], juego.panel[1][6], juego.panel[1][7], juego.panel[1][8]);
  326.     printf("\n C|%c %c %c|%c %c %c|%c %c %c|", juego.panel[2][0], juego.panel[2][1], juego.panel[2][2], juego.panel[2][3], juego.panel[2][4], juego.panel[2][5], juego.panel[2][6], juego.panel[2][7], juego.panel[2][8]);
  327.     printf("\n -+-----+-----+-----+");
  328.     printf("\n D|%c %c %c|%c %c %c|%c %c %c|", juego.panel[3][0], juego.panel[3][1], juego.panel[3][2], juego.panel[3][3], juego.panel[3][4], juego.panel[3][5], juego.panel[3][6], juego.panel[3][7], juego.panel[3][8]);
  329.     printf("\n E|%c %c %c|%c %c %c|%c %c %c|", juego.panel[4][0], juego.panel[4][1], juego.panel[4][2], juego.panel[4][3], juego.panel[4][4], juego.panel[4][5], juego.panel[4][6], juego.panel[4][7], juego.panel[4][8]);
  330.     printf("\n F|%c %c %c|%c %c %c|%c %c %c|", juego.panel[5][0], juego.panel[5][1], juego.panel[5][2], juego.panel[5][3], juego.panel[5][4], juego.panel[5][5], juego.panel[5][6], juego.panel[5][7], juego.panel[5][8]);
  331.     printf("\n -+-----+-----+-----+");
  332.     printf("\n G|%c %c %c|%c %c %c|%c %c %c|", juego.panel[6][0], juego.panel[6][1], juego.panel[6][2], juego.panel[6][3], juego.panel[6][4], juego.panel[6][5], juego.panel[6][6], juego.panel[6][7], juego.panel[6][8]);
  333.     printf("\n H|%c %c %c|%c %c %c|%c %c %c|", juego.panel[7][0], juego.panel[7][1], juego.panel[7][2], juego.panel[7][3], juego.panel[7][4], juego.panel[7][5], juego.panel[7][6], juego.panel[7][7], juego.panel[7][8]);
  334.     printf("\n I|%c %c %c|%c %c %c|%c %c %c|", juego.panel[8][0], juego.panel[8][1], juego.panel[8][2], juego.panel[8][3], juego.panel[8][4], juego.panel[8][5], juego.panel[8][6], juego.panel[8][7], juego.panel[8][8]);
  335.     printf("\n --------------------\n");
  336.     return;
  337. }
  338.  
  339. /*EMPEZAR PARTIDA*/
  340. int empezarPartida(Sudoku *juego, char *archivo, char *carpeta)
  341. {
  342.     /*VARIABLES*/
  343.     int exitof, exitop;
  344.  
  345.  
  346.      do{
  347.         exitof= leerPartidas (archivo);
  348.         if (exitof == 0)
  349.                 return 0;
  350.  
  351.         printf("\nIntroduzca nombre de la partida: ");
  352.         scanf("%s", juego->partida);
  353.  
  354.         exitop = leeTablero(juego,carpeta);
  355.         if (exitop == 0)
  356.             {
  357.                 printf ("Error al abrir el archivo!\n");
  358.             }
  359.     }while(exitop == 0);
  360.  
  361.     dibujaTablero(*juego);
  362.     return 1;
  363.     }
  364.  
  365. /*JUGAR*/
  366. int jugar(Sudoku *sudoku)
  367. {
  368.     /*VARIABLES*/
  369.     char dato[3];
  370.     int valor;
  371.  
  372.        do{
  373.         printf("Introduzca la posicion del hueco que quiera rellenar:\nFila (A-I) y Columna (1-9): ");
  374.         scanf("%s", dato);
  375.  
  376.         if (dato[0]== 'S' && dato[1]=='A')
  377.             return 1;
  378.  
  379.         else if (dato[0]=='G' && dato[1]=='P')
  380.             return guardaTablero(*sudoku);
  381.  
  382.         valor = insertaNumero(sudoku, dato);
  383.  
  384.         if (valor == 1)
  385.             dibujaTablero (*sudoku);
  386.  
  387.         else if(valor == 2)
  388.             printf("Coordenadas erroneas!\n");
  389.  
  390.         else if (valor == 3)
  391.             printf("Casilla fija!\n");
  392.  
  393.         else if (valor == 4)
  394.             printf("Numero incorrecto!\n");
  395.  
  396.         else if (valor == 5)
  397.             printf("Numero repetido en columna\n");
  398.  
  399.         else if (valor == 6)
  400.             printf("Numero repetido en fila\n");
  401.  
  402.         else if (valor == 7)
  403.             printf("Numero repetido en cuadrante\n");
  404.  
  405.  
  406.         }while (sudoku->huecos !=0);
  407.  
  408.        return 2;
  409. }
  410.  
  411. void fin ()
  412. {
  413.  
  414.         printf("\nSudoku completado!\n\n");
  415. printf (" \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\n");
  416. printf (" \1   *     *     *    \1\n");
  417. printf (" \1 FIN DE LA PARTIDA! \1\n");
  418. printf (" \1   *      *     *   \1\n");
  419. printf (" \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\n\n");
  420. }
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428. /*MAIN*/
  429. void main()
  430.      {
  431.      /*VARIABLES*/
  432.      Sudoku mio;
  433.      int opcion, valor;
  434.  
  435.      double porcen = 0.0;
  436.      mio.huecos=81;
  437.  
  438.      opcion = menuinicial();
  439.  
  440.      switch (opcion)
  441.      {
  442.      case 1:
  443.      printf("\nHa escogido la opcion: %d\n\n", opcion);
  444.      printf("Cargando partida...\n");
  445.  
  446.      if (empezarPartida (&mio,"general/puzzles.txt","puzzles/") == 0)
  447.      {
  448.          printf("Error de apertura!\n");
  449.          system("PAUSE");
  450.          return;
  451.      }
  452.  
  453.      porcen= 100 * (81.0 - mio.huecos)/81;
  454.      printf("\nPartida: %s Numero de huecos: %d\nPorcentaje de tablero relleno:%.2lf%%\n", mio.partida, mio.huecos, porcen);
  455.  
  456.      printf("\n <* Si desea SALIR de la partida introduzca la posicion 'SA' *>\n <* Si desea GUARDAR  la partida introduzca la posicion 'GP' *>\n  <* Si desea BORRAR  una casilla introduzca   el valor '.' *>\n\n");
  457.  
  458.      valor =jugar(&mio);
  459.  
  460.     if (valor == 0)
  461.     {
  462.         printf("Error de apertura!\n");
  463.         system("PAUSE");
  464.         return;
  465.     }
  466.  
  467.     else if (valor == 1)
  468.     {
  469.         printf("Ha elegido salir!\n");
  470.         system("PAUSE");
  471.         return;
  472.     }
  473.     else if (valor == 3)
  474.     {
  475.         printf("Partida guardada con exito!\nVuelva de nuevo\n");
  476.     }
  477.     else if (valor == 2)
  478.     {
  479.         fin ();
  480.         system("PAUSE");
  481.         return;
  482.     }
  483.         break;
  484.  
  485.   case 2:
  486.   printf("Ha escogido la opcion: %d\n\n", opcion);
  487.   printf("Cargando partida...\n");
  488.  
  489.   if (empezarPartida (&mio,"general/almacenadas.txt","almacenadas/")==0)
  490.     {
  491.     printf("No hay partidas guardadas\nError de apertura!\n");
  492.     system("PAUSE");
  493.     return;
  494.     }
  495.  
  496.     porcen= 100 * (81.0 - mio.huecos)/81;
  497.      printf("\nPartida: %s Numero de huecos: %d\nPorcentaje de tablero relleno:%.2lf%%\n", mio.partida, mio.huecos, porcen);
  498.  
  499.      printf("\n <* Si desea SALIR de la partida introduzca la posicion 'SA' *>\n <* Si desea GUARDAR  la partida introduzca la posicion 'GP' *>\n  <* Si desea BORRAR  una casilla introduzca   el valor '.' *>\n\n");
  500.  
  501.     valor = jugar(&mio);
  502.  
  503.     if (valor== 0)
  504.     {
  505.         printf("Error de apertura!\n");
  506.         system("PAUSE");
  507.         return;
  508.     }
  509.  
  510.     else if (valor == 1)
  511.     {
  512.         printf("Ha elegido salir!\n");
  513.         system("PAUSE");
  514.         return;
  515.     }
  516.     else if (valor == 3)
  517.     {
  518.         printf("Partida guardada con exito!\nVuelva de nuevo\n");
  519.     }
  520.     else if (valor == 2)
  521.     {
  522.     fin();
  523.  system("PAUSE");
  524.         return;
  525.     }
  526.         break;
  527.  
  528.   case 3:
  529.   printf("Ha escogido la opcion: %d\n", opcion);
  530.   printf("Gracias por jugar, adios.\n");
  531.   break;
  532.  
  533.   default:
  534.   printf("Opcion incorrecta\n");
  535.   system("PAUSE");
  536.  
  537.   return;
  538. }
  539. system("PAUSE");
  540. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement