Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ayudita con sudoku (incompleto)

Estas en el tema de ayudita con sudoku (incompleto) en el foro de C/C++ en Foros del Web. Buenaas! El problema surge cuando en la funcion main es llamada la funcion mostrarcabecera (). En vez de los numeros, salen simbolos raros. Han de ...
  #1 (permalink)  
Antiguo 17/11/2010, 17:20
 
Fecha de Ingreso: noviembre-2010
Mensajes: 2
Antigüedad: 13 años, 4 meses
Puntos: 0
ayudita con sudoku (incompleto)

Buenaas!
El problema surge cuando en la funcion main es llamada la funcion mostrarcabecera ().
En vez de los numeros, salen simbolos raros.
Han de estar estos archivos para que funcione el programa en la carpeta del proyecto.

puzzles.txt
Código:
puzzle1
puzzle2
puzzle3
puzzle1.txt
Código:
2...578.3
7.....4..
.43......
.7.54....
32.876.49
....13.5.
......61.
..1.....4
4.736...2
puzzle2.txt
Código:
7..42..6.
.435..2..
.1..3.59.
.....4321
....9....
1643.....
.71.6..3.
..9..361.
.2..41..9
puzzle3.txt
Código:
.8..7..9.
..5..2...
2.....4.8
..7..61.5
..2.3.6..
1.82..9..
3.1.....9
...4..7..
.2..9..3.

Código:
#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");
}
  #2 (permalink)  
Antiguo 17/11/2010, 18:01
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 5 meses
Puntos: 9
Respuesta: ayudita con sudoku (incompleto)

Estas tratando de acceder a memoria que no reservaste ¬¬, Cuando declaras tu estructura Sudoku declaras una matriz de 3x3 para tu panel
Código:
typedef struct
{
	int espacios;
	char partida [14];
	char panel [3][3];
} Sudoku;
Pero utilizas un panel de 9x9, corrige eso y ya te muestra bien el tablero, aun asi tu programa tiene uno que otro error de logica.

Espero haberte ayudado

Saludos++
  #3 (permalink)  
Antiguo 18/11/2010, 10:38
 
Fecha de Ingreso: noviembre-2010
Mensajes: 2
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: ayudita con sudoku (incompleto)

Pues vaya tonteria!!
Yo me esperaba algo mas gordo.... fallo tecnico!
Aunqe haya alguna chapucilla hecha... ya digo que aun no esta terminado, solo es un proyecto, y avanzo lentamente.
Muchas gracias!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:36.