Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********************************/
- /*TURNO: VIERNES */
- /*GRUPO: 4 */
- /*AUTORES: ALBERTO LARA CARAVACA */
- /*ANGEL PEREZ LEMONCHE */
- /* */
- /*PRACTICA: 7 */
- /*EJERCICIO: PROYECTO SUDOKU */
- /* */
- /*FECHA: 21/12/10 */
- /*********************************/
- #define _CRT_SECURE_NO_DEPRECATE
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- typedef struct
- {
- int huecos;
- char partida[14];
- char panel[9][9];
- char original[9][9];
- char grabada[14];
- }Sudoku;
- /*MOSTRAR CABECERA*/
- void mostrarCabecera ()
- {
- printf (" **********************\n");
- printf (" * * * * *\n");
- printf (" * * SUDOKU *\n");
- printf (" * * * * *\n");
- printf (" **********************\n");
- }
- /*GUARDA TABLERO*/
- int guardaTablero(Sudoku juego)
- {
- /*VARIABLES*/
- FILE * g, * h, *i, *j;
- int a, b;
- char nombre[50];
- char cmpnom[50];
- char nombre2[50];
- char carpeta1[100] = "almacenadas/";
- char carpeta2[100] = "almacenadas/";
- h = fopen("general/almacenadas.txt", "a");
- if (h==NULL)
- return 0;
- j=fopen("general/almacenadas.txt", "r");
- if(j==NULL)
- return 0;
- printf("Introduzca el nombre de la partida que desea guardar: ");
- scanf("%s", nombre);
- while (!feof (j))
- {
- fscanf(j,"%s", cmpnom);
- if (strcmp(cmpnom, nombre)==0)
- break;
- }
- fclose (j);
- if (strcmp (cmpnom, nombre) != 0)
- fprintf(h, "%s\n", nombre);
- fclose (h);
- strcpy (nombre2, nombre);
- strcat (nombre, ".txt");
- strcat (nombre2," O.txt");
- strcat (carpeta1, nombre);
- strcat (carpeta2, nombre2);
- g = fopen(carpeta1, "w");
- if (g==NULL) return 0;
- i = fopen(carpeta2, "w");
- if (i==NULL) return 0;
- for(a=0; a<9; a++)
- {
- for(b=0; b<9; b++)
- {
- fprintf(i,"%c", juego.original[a][b]);
- if (juego.panel[a][b]== ' ')
- fprintf(g,".");
- else
- fprintf(g,"%c",juego.panel[a][b]);
- }
- fprintf(g,"\n");
- fprintf(i,"\n");
- }
- fclose (g);
- fclose (i);
- return 3;
- }
- /*COMPRUEBA COORDENADAS*/
- int compruebaCoordenadas(char * coord)
- {
- if(strlen(coord) != 2)
- return 0;
- else if ((coord[0] <'A' || coord [0] > 'I') || (coord[1] <'1' || coord [1] > '9'))
- return 0;
- else
- return 1;
- }
- /*CASILLA VACÍA*/
- int casillaVacia(Sudoku juego, char *coord)
- {
- coord [0]= coord [0]- 'A'; coord[1]=coord [1]-'1';
- if (juego.original[coord[0]][coord [1]] =='1')
- return 0;
- else
- return 1;
- }
- /*COMPRUEBA NÚMERO*/
- int compruebaNumero(char * num)
- {
- if(strlen(num) != 1)
- return 0;
- else if ((num[0] <'1' || num [0]> '9') && num[0]!= '.')
- return 0;
- else
- return 1;
- }
- /*COMPRUEBA POSICIÓN*/
- int compruebaPosicion (Sudoku juego, char *coord, char *num)
- {
- /*VARIABLES*/
- int fila, columna, q, p, f, c;
- fila=coord[0];
- columna=coord[1];
- f=(fila/3)*3;
- c=(columna/3)*3;
- //Comprobación de la columna
- for (q=0; q<9; q++)
- {
- if(juego.panel[q][columna]==num[0])
- return 5;
- }
- //Comprobación de la fila
- for(q=0; q<9; q++)
- {
- if(juego.panel[fila][q]==num[0])
- return 6;
- }
- //Comprobación del cuadrante
- for(q=0;q<3;q++)
- for(p=0;p<3;p++)
- {
- if (juego.panel[f+q][c+p]==num[0])
- return 7;
- }
- return 8;
- }
- /*INSERTA NÚMERO*/
- int insertaNumero(Sudoku *juego, char *coord)
- {
- /*VARIABLES*/
- char num[50];
- double porcentaje;
- int pos, numero;
- if (compruebaCoordenadas (coord) == 0)
- return 2;
- else if (casillaVacia (*juego, coord) == 0)
- return 3;
- printf("Introduzca el valor (1-9): ");
- scanf("\n%s", num);
- numero=compruebaNumero (num);
- if (numero == 0)
- return 4;
- pos=compruebaPosicion (*juego, coord, num);
- if (pos !=8)
- return pos;
- if (num[0]=='.')
- num[0]= ' ';
- juego->panel[coord[0]][coord[1]] = num[0];
- if (num[0]!=' ')
- juego->huecos--;
- else if(num[0]== ' ')
- juego->huecos++;
- porcentaje= 100 * (81.0 - juego->huecos)/81;
- printf("\n\nPartida: %s Numero de huecos: %d\nPorcentaje de tablero relleno:%.2lf%%\n",juego->partida, juego->huecos, porcentaje);
- return 1;
- }
- /*MENÚ INICIAL*/
- int menuinicial ()
- {
- int opcion;
- mostrarCabecera();
- printf("\n<Este Sudoku funciona en MAYUSCULAS si lo desea pulse BLOQ MAYUS>\n\n");
- printf("1 Empezar partida\n2 Recuperar una partida\n3 Salir del programa\n");
- printf(" Escoja una opcion: ");
- scanf("%d", &opcion);
- while (opcion < 1 || opcion > 3)
- {
- printf("Opcion Incorrecta. Escoja una opcion: ");
- scanf("%d", &opcion);
- }
- return opcion;
- }
- /*LEER PARTIDAS*/
- int leerPartidas (char* nombre)
- {
- FILE * f;
- char puzzle[10];
- f = fopen (nombre, "r");
- if (f == NULL)
- {
- return 0;
- }
- else
- {
- printf("Las partidas disponibles son:\n");
- while (!feof (f))
- {
- if (fscanf (f, "%s", puzzle) == 1)
- printf("%s\n", puzzle);
- else if (fscanf (f,"%s", puzzle) != 1)
- break;
- }
- fclose(f);
- }
- return 1;
- }
- /*COMPRUEBA ORIGINAL*/
- int compruebaOriginal(Sudoku * juego)
- {
- /*VARIABLES*/
- FILE * p;
- int i,j;
- char nombre[50];
- char carpeta[100]= "almacenadas/";
- strcpy (nombre, juego->partida);
- strcat (nombre, " O.txt");
- strcat (carpeta, nombre);
- p=fopen(carpeta, "r");
- if (p == NULL)
- return 0;
- for (i=0; i<9; i++)
- {
- for (j=0; j<9; j++)
- {
- fscanf(p, "\n%c", &juego->original[i][j]);
- }
- }
- fclose(p);
- return 1;
- }
- /*LEER TABLERO*/
- int leeTablero (Sudoku * juego, char * carp)
- {
- /*VARIABLES*/
- FILE * p;
- int i,j, valor;
- char nombre[50];
- char carpeta[100];
- strcpy(carpeta, carp);
- strcpy (nombre, juego->partida);
- strcat (nombre, ".txt");
- strcat (carpeta, nombre);
- p=fopen(carpeta, "r");
- if (p == NULL)
- return 0;
- valor=compruebaOriginal (juego);
- for (i=0; i<9; i++)
- {
- for (j=0; j<9; j++)
- {
- fscanf(p, "\n%c", &juego->panel[i][j]);
- if (juego->panel[i][j] =='.')
- {
- juego->panel[i][j]=' ';
- if (valor ==0)
- juego->original[i][j]='0';
- }
- else if(valor == 0)
- juego->original[i][j]='1';
- if (juego->panel[i][j]!= ' ')
- {
- juego->huecos = (juego->huecos - 1);
- }
- }
- }
- fclose (p);
- return 1;
- }
- /*DIBUJA TABLERO*/
- void dibujaTablero (Sudoku juego)
- {
- printf("\n |1 2 3|4 5 6|7 8 9|");
- printf("\n -+-----+-----+-----+");
- 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]);
- 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]);
- 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]);
- printf("\n -+-----+-----+-----+");
- 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]);
- 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]);
- 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]);
- printf("\n -+-----+-----+-----+");
- 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]);
- 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]);
- 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]);
- printf("\n --------------------\n");
- return;
- }
- /*EMPEZAR PARTIDA*/
- int empezarPartida(Sudoku *juego, char *archivo, char *carpeta)
- {
- /*VARIABLES*/
- int exitof, exitop;
- do{
- exitof= leerPartidas (archivo);
- if (exitof == 0)
- return 0;
- printf("\nIntroduzca nombre de la partida: ");
- scanf("%s", juego->partida);
- exitop = leeTablero(juego,carpeta);
- if (exitop == 0)
- {
- printf ("Error al abrir el archivo!\n");
- }
- }while(exitop == 0);
- dibujaTablero(*juego);
- return 1;
- }
- /*JUGAR*/
- int jugar(Sudoku *sudoku)
- {
- /*VARIABLES*/
- char dato[3];
- int valor;
- do{
- printf("Introduzca la posicion del hueco que quiera rellenar:\nFila (A-I) y Columna (1-9): ");
- scanf("%s", dato);
- if (dato[0]== 'S' && dato[1]=='A')
- return 1;
- else if (dato[0]=='G' && dato[1]=='P')
- return guardaTablero(*sudoku);
- valor = insertaNumero(sudoku, dato);
- if (valor == 1)
- dibujaTablero (*sudoku);
- else if(valor == 2)
- printf("Coordenadas erroneas!\n");
- else if (valor == 3)
- printf("Casilla fija!\n");
- else if (valor == 4)
- printf("Numero incorrecto!\n");
- else if (valor == 5)
- printf("Numero repetido en columna\n");
- else if (valor == 6)
- printf("Numero repetido en fila\n");
- else if (valor == 7)
- printf("Numero repetido en cuadrante\n");
- }while (sudoku->huecos !=0);
- return 2;
- }
- void fin ()
- {
- printf("\nSudoku completado!\n\n");
- printf (" \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\n");
- printf (" \1 * * * \1\n");
- printf (" \1 FIN DE LA PARTIDA! \1\n");
- printf (" \1 * * * \1\n");
- 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");
- }
- /*MAIN*/
- void main()
- {
- /*VARIABLES*/
- Sudoku mio;
- int opcion, valor;
- double porcen = 0.0;
- mio.huecos=81;
- opcion = menuinicial();
- switch (opcion)
- {
- case 1:
- printf("\nHa escogido la opcion: %d\n\n", opcion);
- printf("Cargando partida...\n");
- if (empezarPartida (&mio,"general/puzzles.txt","puzzles/") == 0)
- {
- printf("Error de apertura!\n");
- system("PAUSE");
- return;
- }
- porcen= 100 * (81.0 - mio.huecos)/81;
- printf("\nPartida: %s Numero de huecos: %d\nPorcentaje de tablero relleno:%.2lf%%\n", mio.partida, mio.huecos, porcen);
- 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");
- valor =jugar(&mio);
- if (valor == 0)
- {
- printf("Error de apertura!\n");
- system("PAUSE");
- return;
- }
- else if (valor == 1)
- {
- printf("Ha elegido salir!\n");
- system("PAUSE");
- return;
- }
- else if (valor == 3)
- {
- printf("Partida guardada con exito!\nVuelva de nuevo\n");
- }
- else if (valor == 2)
- {
- fin ();
- system("PAUSE");
- return;
- }
- break;
- case 2:
- printf("Ha escogido la opcion: %d\n\n", opcion);
- printf("Cargando partida...\n");
- if (empezarPartida (&mio,"general/almacenadas.txt","almacenadas/")==0)
- {
- printf("No hay partidas guardadas\nError de apertura!\n");
- system("PAUSE");
- return;
- }
- porcen= 100 * (81.0 - mio.huecos)/81;
- printf("\nPartida: %s Numero de huecos: %d\nPorcentaje de tablero relleno:%.2lf%%\n", mio.partida, mio.huecos, porcen);
- 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");
- valor = jugar(&mio);
- if (valor== 0)
- {
- printf("Error de apertura!\n");
- system("PAUSE");
- return;
- }
- else if (valor == 1)
- {
- printf("Ha elegido salir!\n");
- system("PAUSE");
- return;
- }
- else if (valor == 3)
- {
- printf("Partida guardada con exito!\nVuelva de nuevo\n");
- }
- else if (valor == 2)
- {
- fin();
- system("PAUSE");
- return;
- }
- break;
- case 3:
- printf("Ha escogido la opcion: %d\n", opcion);
- printf("Gracias por jugar, adios.\n");
- break;
- default:
- printf("Opcion incorrecta\n");
- system("PAUSE");
- return;
- }
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement