#include <stdio.h>
#include <string.h>
#define _CRT_SECURE_NO_DEPRECAT
#define _CRT_SECURE_NO_WARNINGS
typedef struct
{
int espacios;
char partida [14];
char panel [3][3];
} Sudoku;
void mostrarcabecera ()
{
printf ("***********************\n");
printf ("* *\n");
printf ("* SUDOKU *\n");
printf ("* *\n");
printf ("***********************\n\n");
}
int menuinicial ()
{
int opcion;
printf ("Que desea hacer?\n");
printf ("1) Empezar a jugar\n");
printf ("2) Recuperar una partida\n");
printf ("3) Salir del programa\n");
scanf ("%d", &opcion);
return opcion;
}
int leerpartida ()
{
Sudoku x;
FILE *f;
f = fopen ("puzzles.txt", "r");
if (f == NULL)
{
printf ("Error de apertura del archivo. El programa se cerrara.\n");
return 0;
}
else
{
printf ("Las partidas disponibles son:\n");
while (!feof (f))
{
fscanf (f, "%s", x.partida);
printf ("%s\n", x.partida);
}
fclose (f);
return 1;
}
}
void dibujatablero (Sudoku x)
{
double porcentaje = (1 - (x.espacios / 81.00)) * 100;
printf ("Numero de huecos: %d\nPorcentaje de tablero relleno: %.2lf %%\n\n", x.espacios, porcentaje);
printf (" | 1 2 3 | 4 5 6 | 7 8 9 |\n");
printf ("- - + - - - + - - - + - - - +\n");
printf ("-A- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [0][0], x.panel [0][1], x.panel [0][2], x.panel [0][3], x.panel [0][4], x.panel [0][5], x.panel [0][6], x.panel [0][7], x.panel [0][8]);
printf ("-B- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [1][0], x.panel [1][1], x.panel [1][2], x.panel [1][3], x.panel [1][4], x.panel [1][5], x.panel [1][6], x.panel [1][7], x.panel [1][8]);
printf ("-C- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [2][0], x.panel [2][1], x.panel [2][2], x.panel [2][3], x.panel [2][4], x.panel [2][5], x.panel [2][6], x.panel [2][7], x.panel [2][8]);
printf ("- - + - - - + - - - + - - - +\n");
printf ("-D- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [3][0], x.panel [3][1], x.panel [3][2], x.panel [3][3], x.panel [3][4], x.panel [3][5], x.panel [3][6], x.panel [3][7], x.panel [3][8]);
printf ("-E- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [4][0], x.panel [4][1], x.panel [4][2], x.panel [4][3], x.panel [4][4], x.panel [4][5], x.panel [4][6], x.panel [4][7], x.panel [4][8]);
printf ("-F- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [5][0], x.panel [5][1], x.panel [5][2], x.panel [5][3], x.panel [5][4], x.panel [5][5], x.panel [5][6], x.panel [5][7], x.panel [5][8]);
printf ("- - + - - - + - - - + - - - +\n");
printf ("-G- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [6][0], x.panel [6][1], x.panel [6][2], x.panel [6][3], x.panel [6][4], x.panel [6][5], x.panel [6][6], x.panel [6][7], x.panel [6][8]);
printf ("-H- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [7][0], x.panel [7][1], x.panel [7][2], x.panel [7][3], x.panel [7][4], x.panel [7][5], x.panel [7][6], x.panel [7][7], x.panel [7][8]);
printf ("-I- + %c %c %c | %c %c %c | %c %c %c +\n", x.panel [8][0], x.panel [8][1], x.panel [8][2], x.panel [8][3], x.panel [8][4], x.panel [8][5], x.panel [8][6], x.panel [8][7], x.panel [8][8]);
printf ("- - - - - - - - - - - - - - +\n");
}
void main ()
{
Sudoku x;
FILE *f;
int opcion;
double porcentaje;
char posicion[3];
int numero, a, b;
int fila, columna;
int retorno;
mostrarcabecera ();
opcion = menuinicial ();
while (opcion != 1 && opcion != 2 && opcion != 3)
{
printf ("No ha elegido ninguna opcion valida, intentelo de nuevo:\n");
printf ("Que desea hacer?\n");
printf ("1) Empezar a jugar\n");
printf ("2) Recuperar una partida\n");
printf ("3) Salir del programa\n");
scanf ("%d", &opcion);
}
switch (opcion)
{
case 1:
printf ("Ha elegido empezar a jugar.\n");
break;
case 2:
printf ("Aqui ira el codigo para recuperar una partida.\n");
return;
case 3:
printf ("Ha elegido salir del programa. Adios.\n");
return;
}
do
{
retorno = leerpartida ();
if (retorno == 0)
{
printf ("El fichero no se ha abierto correctamente. El programa se cerrara.\n");
return;
}
printf ("\nEscriba el nombre de la partida que desee comenzar: ");
scanf ("%s", x.partida);
strcat (x.partida, ".txt");
f = fopen (x.partida, "r");
}while (f == NULL);
printf ("\nLa partida %s va a comenzar...\n\n\n", x.partida);
for (fila = 0, x.espacios = 81; fila < 9 ; fila++)
{
for (columna = 0; columna < 9 ; columna++)
{
fscanf (f, "\n%c", &x.panel [fila][columna]);
if (x.panel [fila][columna] != '.')
x.espacios = x.espacios - 1;
if (x.panel [fila][columna] == '.')
x.panel [fila][columna] = 32;
}
}
printf ("A continuacion, comienza el juego...\n");
dibujatablero (x);
while (x.espacios >= 1)
{
printf ("Introduzca posicion (FilaColumna): ");
scanf ("\n%c%c", &posicion [0], &posicion [1]);
a = posicion[0] - 65;
b = posicion[1] - 49;
if (posicion [0] == 'S' && posicion [1] == 'A')
{
printf ("Ha elegido abandonar el programa. Gracias por jugar, adios.\n");
return;
}
else
{
while (a != 0 && a != 1 && a != 2 && a != 3 && a != 4 && a != 5 && a != 6 && a != 7 && a != 8 || b != 0 && b != 1 && b != 2 && b != 3 && b != 4 && b != 5 && b != 6 && b != 7 && b != 82 || x.panel [a][b] != '.')
{
if (a != 0 && a != 1 && a != 2 && a != 3 && a != 4 && a != 5 && a != 6 && a != 7 && a != 8)
{
printf ("La fila escogida no es valida.\n");
printf ("Introduzca de nuevo: ");
scanf ("\n%c%c", &posicion [0], &posicion [1]);
a = posicion[0] - 65;
b = posicion[1] - 49;
}
else if (b != 0 && b != 1 && b != 2 && b != 3 && b != 4 && b != 5 && b != 6 && b != 7 && b != 8)
{
printf ("La columna escogida no es valida.\n");
printf ("Introduzca de nuevo: ");
scanf ("\n%c%c", &posicion [0], &posicion [1]);
a = posicion[0] - 65;
b = posicion[1] - 49;
}
else
{
printf ("La posicion esta ocupada.\n");
printf ("Introduzca de nuevo: ");
scanf ("\n%c%c", &posicion [0], &posicion [1]);
a = posicion[0] - 65;
b = posicion[1] - 49;
}
}
printf ("Introduce el numero: ");
scanf ("%d", &numero);
while (numero != 1 && numero != 2 && numero != 3 && numero != 4 && numero != 5 && numero != 6 && numero != 7 && numero != 8 && numero != 9)
{
printf ("El numero escogido no es valido.\n");
printf ("Introduzca de nuevo:");
scanf ("%d", &numero);
}
printf ("El numero %d sera introducido en la posicion %c%c.\n", numero, posicion[0], posicion [1]);
x.panel [a][b] = numero + '0';
dibujatablero (x);
x.espacios = x.espacios - 1;
}
}
printf ("El juego ha terminado, gracias por jugar.\n");
}