elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:05  


Tema destacado: Entra al canal IRC oficial de #elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Sudoku [Aporte]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Sudoku [Aporte]  (Leído 2,603 veces)
AxXioma


Desconectado Desconectado

Mensajes: 795


Algunos pájaros no pueden ser enjaulados...


Ver Perfil
Sudoku [Aporte]
« en: 12 Febrero 2008, 19:18 »

Buenas, estos dos ultimos dias he trabajado en un sudoku, empecé creando la parte grafica con printf y poco a poco fuí realizando el programa, haciendo uso de la lógica.

Es un pequeño aporte si me es permitido, para programadores noveles que, como yo estan empezando en el maravilloso mundo de la programacion y les gusta la informatica, tengo otros programas como un juego de preguntas, una calculadora, entre otros relativamente sencillos que he ido haciendo conforme amplio conocimientos en programacion.

No sabía muy bien como programar un sudoku pero ahí ha quedado el resultado, para programadores experimentados solicito critica constructiva, para programadores noveles, este trozo de codigo que puede que ayude a alguien.
Quien tenga una duda con el code, contestaré gustosamente las preguntas via mp.

Muchas gracias, aqui va el code:

Código:
/******************************************************************************/
/*  Name: Sudoku V.1                                                          */
/*  Author: Sergio Garre                                                      */
/*  Date: 12/02/08 17:55                                                      */
/*  Description: Un simple sudoku realizado haciendo uso de matrices, el      */
/*               usuario interactua con las coordeandas y la lógica para      */
/*               rellenarlo, finalmente se comprueba si está bien o mal.      */
/******************************************************************************/

#include <stdio.h>
#include <stdlib.h>

int main (void)

{
    int exy [9][9]= {
     
            0, 2, 0, 0, 0, 3, 0, 0, 4,
            3, 0, 0, 0, 6, 0, 0, 7, 8,
            0, 0, 0, 8, 0, 0, 0, 2, 0,
            6, 4, 0, 1, 3, 0, 0, 8, 0,
            8, 0, 0, 0, 0, 0, 0, 0, 1,
            0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 4, 0, 5, 3, 0,
            1, 0, 0, 0, 7, 0, 0, 6, 0,
            0, 5, 0, 0, 0, 0, 0, 0, 2
                   
                    };
   
    int solucion[9][9]= {
   
            9, 2, 8, 7, 1, 3, 6, 5, 4,
            3, 1, 5, 2, 6, 4, 9, 7, 8,
            4, 6, 7, 8, 9, 5, 1, 2, 3,
            6, 4, 2, 1, 3, 9, 7, 8, 5,
            8, 9, 3, 6, 5, 7, 2, 4, 1,
            5, 7, 1, 4, 2, 8, 3, 9, 6,
            2, 8, 6, 9, 4, 1, 5, 3, 7,
            1, 3, 4, 5, 7, 2, 8, 6, 9,
            7, 5, 9, 3, 8, 6, 4, 1, 2
                   
                        };
     
    int numero=0, opcM, c;
    int x, y;
     
 do{
     
     printf ("\n\t\t\t\tMENU\n");
     printf ("\t\t\t\t----\n");
     printf ("\n1.Nuevo Juego.\n\n");
     printf ("0.Salir.\n\n");
     
     printf ("Escoja una opcion (0-1)\n\n");
     scanf ("%d", &opcM);
     
     switch (opcM)
     
     {
   
    case 1: 
         
    do{
   
    printf ("\n");
    printf ("      0   1   2    3   4   5    6   7   8  \n\n");
    printf (" 0  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [0][0], exy [0][1], exy [0][2], exy [0][3], exy [0][4], exy [0][5], exy [0][6], exy [0][7], exy [0][8]);
    printf ("    ------------  -----------  ------------\n");
    printf (" 1  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [1][0], exy [1][1], exy [1][2], exy [1][3], exy [1][4], exy [1][5], exy [1][6], exy [1][7], exy [1][8]);
    printf ("    ------------  -----------  ------------\n");
    printf (" 2  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [2][0], exy [2][1], exy [2][2], exy [2][3], exy [2][4], exy [2][5], exy [2][6], exy [2][7], exy [2][8]);
    printf ("    ------------  -----------  ------------\n");
    printf ("    ------------  -----------  ------------\n");
    printf (" 3  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [3][0], exy [3][1], exy [3][2], exy [3][3], exy [3][4], exy [3][5], exy [3][6], exy [3][7], exy [3][8]);
    printf ("    ------------  -----------  ------------\n");
    printf (" 4  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [4][0], exy [4][1], exy [4][2], exy [4][3], exy [4][4], exy [4][5], exy [4][6], exy [4][7], exy [4][8]);
    printf ("    ------------  -----------  ------------\n");
    printf (" 5  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [5][0], exy [5][1], exy [5][2], exy [5][3], exy [5][4], exy [5][5], exy [5][6], exy [5][7], exy [5][8]);
    printf ("    ------------  -----------  ------------\n");
    printf ("    ------------  -----------  ------------\n");
    printf (" 6  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [6][0], exy [6][1], exy [6][2], exy [6][3], exy [6][4], exy [6][5], exy [6][6], exy [6][7], exy [6][8]);
    printf ("    ------------  -----------  ------------\n");
    printf (" 7  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [7][0], exy [7][1], exy [7][2], exy [7][3], exy [7][4], exy [7][5], exy [7][6], exy [7][7], exy [7][8]);
    printf ("    ------------  -----------  ------------\n");
    printf (" 8  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n", exy [8][0], exy [8][1], exy [8][2], exy [8][3], exy [8][4], exy [8][5], exy [8][6], exy [8][7], exy [8][8]);
    printf ("    ------------  -----------  ------------\n\n");
   
    printf ("Introduzca una coordenada: ");
    scanf ("%d %d", &x, &y);
   
    if (exy [x][y]!= exy [0][1] && exy [x][y]!= exy [0][5] && exy [x][y]!= exy [0][8] && exy [x][y]!= exy [1][0] &&
        exy [x][y]!= exy [1][4] && exy [x][y]!= exy [1][7] && exy [x][y]!= exy [1][8] && exy [x][y]!= exy [2][3] &&
        exy [x][y]!= exy [2][7] && exy [x][y]!= exy [3][0] && exy [x][y]!= exy [3][1] && exy [x][y]!= exy [3][3] &&
        exy [x][y]!= exy [3][4] && exy [x][y]!= exy [3][7] && exy [x][y]!= exy [4][0] && exy [x][y]!= exy [4][8] &&
        exy [x][y]!= exy [6][4] && exy [x][y]!= exy [6][6] && exy [x][y]!= exy [6][7] && exy [x][y]!= exy [7][0] &&
        exy [x][y]!= exy [7][4] && exy [x][y]!= exy [7][7] && exy [x][y]!= exy [8][1] && exy [x][y]!= exy [8][8])
    {
                   
               printf ("Introduzca un numero: ");
               scanf ("%d", &numero);
   
               if (numero <1 || numero>9)
               {
                          printf ("El numero debe estar comprendido entre 1-9.\n");     
               }
               else
               {
                          exy [x][y]= numero;
               }
    }
    else
    {
               printf ("La coordenada introducida no es accesible.\n");
    }
   
    fflush (stdin);   
   
    printf ("Para comprobar pulse [1], de lo contrario otro numero y siga jugando: ");
    scanf ("%d", &c);
           
    if (c==1)
    {
                   if (exy [9][9] == solucion [9][9])
                   {
                           printf ("\nFelicidades, lo has conseguido.\n");
                           system ("pause");
                           exit (0);
                   }
                   else
                   {
                           printf ("\nLo siento, no lo has conseguido.\n\n");
                           system ("pause");
                           exit (0);
                   }
    }
       
    system ("cls");
   
    }while (c!=1);
 
    case 0:
         
    system ("exit");
           
    default: printf ("Opcion Incorrecta.");
   
     }
 
 }while (opcM!=0);
 
}

/******************************************************************************/
/*                                                                            */
/*                             FIN DEL PROGRAMA                               */
/*                                                                            */
/******************************************************************************/
Saludos  :)

PD: Si encuentran algun error, no duden en avisarme de ello. ;)


« Última modificación: 12 Febrero 2008, 19:29 por sarkis » En línea





.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.561


Shrödingerificado


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #1 en: 13 Febrero 2008, 02:50 »

Seguí el otro hilo, y aunque no sé exactamente qué es lo que te interesa de la programación voy a hacer una crítica, espero que sea constructiva.

Yo me preocuparía menos por el resultado de los programas que se realizan para aprender, y me preocuparía menos de la presentación, lo bien que queden en pantalla y el interfaz en general. Me preocuparía de la algorítmica, por ejemplo. El tiempo que has dedicado a poner los comentarios tan bonitos, el sudoku ya hecho, y a usar el exy para que salga bonito por la pantalla estaría mejor invertido en (por ejemplo y en mi opinión) hacer un programa que resuelva sudokus o que los cree aleatoriamente. Si no respondí en el otro hilo es porque me pareció que estabas más preocupado por el interfaz que por la lógica, y no me interesa el interfaz ni quería desviar el tema.

Creo, en mi humilde opinión, que habría sido más instructivo preocuparse de la lógica. Por eso, si quieres aprender y ser capaz de resolver problemas complejos programando, yo me preocuparía de esa clase de cosas. El interfaz, al fin y al cabo, se puede hacer con glade más o menos fácilmente.


En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Flakito81


Desconectado Desconectado

Mensajes: 508



Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #2 en: 13 Febrero 2008, 02:58 »

Voy a hacer un poko de crítica constructiva:

TEMA I: "Codificación"

1- Se pueden usar los bucles trankilamente para ahorrar algo de código. Para mostrar la matriz podrías hacer algo como:
Código:
for (i = 0; i < 9; i ++)
{
   for (j = 0; j < 9; j++)
      printf ("%d", exy[i][j]);
   printf("\n");
}
La parte bonita es facil de conseguir, y te lo dejo de tarea ;)

2- La verdad es que con el SUPER if que has hecho es facil perderse, es mas facil y eficiente hacer algo como:
Código:
if (exy[x][y] != '0')
   printf ("posicion no valida");
else
   exy[x][y] = numero;
Eso suponiendo que las coordenadas comiencen a contar desde cero, lo cual para las personas no tiene demasiado sentido. Lo logico es comenzar desde 1 a 9, pero como el array va de 0 a 8 tendras q restar 1 a 'x' e  'y', ejemplo:
Código:
   exy[x-1][y-1]


TEMA II: "Errores varios"
Analiza el siguiente código:
Código:
   if (exy [9][9] == solucion [9][9])
                   {
                           printf ("\nFelicidades, lo has conseguido.\n");
                           system ("pause");
                           exit (0);
                   }
                   else
                   {
                           printf ("\nLo siento, no lo has conseguido.\n\n");
                           system ("pause");
                           exit (0);
                   }
1- las matrices estan fuera de rango: Aunque tengas 9 posiciones van de 0 a 8, por tanto seria: exy[8][8] (igual para la matriz solucion)
2- Suponiendo que esten dentro de rango. ¿Qué estas haciendo en realidad? Comprobar si el sudoku está bien resuelto ¿cierto?
     a- Das como sudoku bien resuelto aquel sudoku en el que coincida la posicion [8][8] con la cifra sel array solucion[8][8], aunque el resto esté mal o ni esté resuelto, tan solo has de tener esa cifra bien.
     b- Dado que tienes en la matriz exy esa posicion ( exy[8][8] ) y además coincide con la solucion, ese sudoku siempre estará bien resuleto hagamos lo que hagamos.

TEMA III: "Propuesta"
Te propongo que revices todo el código, soluciones los errores y además que hagas un sudoku donde se hagan las comprobaciones de fila, columna y región (con bucles) cada vez que se teclea una cifra.
Una vez terminado que no haga falta tener una matriz con la solucion sino que haga una comprobracion más simple, por ejemplo hacer un bucle anidado (como el que está posteado mas arriba) y que compruebes que no existen ceros ( 0 ) en la matriz, eso, junto con la comprobacion al teclear el numero, indicará quue el sudoku está bien resuelto.
Como extra puedes hacer un fichero de texto dnd escribas el sudoku a rellenar y luego leyendo el fichero vas rellenando la matriz.

En este mismo foro hay informacion de sobra sobre el sudoku y de como hacer las comprobaciones. No obstante siempre que tengas alguna duda puedes preguntar en el foro, como es normal.

Un saludo!!!
« Última modificación: 13 Febrero 2008, 03:02 por Flakito81 » En línea
sempus
Dakishimetai no ni...
Colaborador
***
Desconectado Desconectado

Mensajes: 2.326


GJDAM 愛している


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #3 en: 13 Febrero 2008, 04:58 »

Seguí el otro hilo, y aunque no sé exactamente qué es lo que te interesa de la programación voy a hacer una crítica, espero que sea constructiva.

Yo me preocuparía menos por el resultado de los programas que se realizan para aprender, y me preocuparía menos de la presentación, lo bien que queden en pantalla y el interfaz en general. Me preocuparía de la algorítmica, por ejemplo. El tiempo que has dedicado a poner los comentarios tan bonitos, el sudoku ya hecho, y a usar el exy para que salga bonito por la pantalla estaría mejor invertido en (por ejemplo y en mi opinión) hacer un programa que resuelva sudokus o que los cree aleatoriamente. Si no respondí en el otro hilo es porque me pareció que estabas más preocupado por el interfaz que por la lógica, y no me interesa el interfaz ni quería desviar el tema.

Creo, en mi humilde opinión, que habría sido más instructivo preocuparse de la lógica. Por eso, si quieres aprender y ser capaz de resolver problemas complejos programando, yo me preocuparía de esa clase de cosas. El interfaz, al fin y al cabo, se puede hacer con glade más o menos fácilmente.
Oye disculpa que te moleste con una pregunta tan tonta,pero conoces uno para kde que no sea el Qt?.
gracias y un salu
En línea

...si la tuviera detendría el tiempo para verla como lo hago en este momento y seria feliz eternamente...
Descarga openSUSE
GroK


Desconectado Desconectado

Mensajes: 680


...I have become comfortably numb...


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #4 en: 13 Febrero 2008, 05:17 »

Oye disculpa que te moleste con una pregunta tan tonta,pero conoces uno para kde que no sea el Qt?

KDevelop trae un diseñador de interfaces, por ejemplo.



Saludos
En línea

"I put on my Hendrix album and my son said 'Dad, who's that?' and i said 'Well son, that's God' "- Robert Plant

AxXioma


Desconectado Desconectado

Mensajes: 795


Algunos pájaros no pueden ser enjaulados...


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #5 en: 13 Febrero 2008, 15:40 »

Seguí el otro hilo, y aunque no sé exactamente qué es lo que te interesa de la programación voy a hacer una crítica, espero que sea constructiva.

Yo me preocuparía menos por el resultado de los programas que se realizan para aprender, y me preocuparía menos de la presentación, lo bien que queden en pantalla y el interfaz en general. Me preocuparía de la algorítmica, por ejemplo. El tiempo que has dedicado a poner los comentarios tan bonitos, el sudoku ya hecho, y a usar el exy para que salga bonito por la pantalla estaría mejor invertido en (por ejemplo y en mi opinión) hacer un programa que resuelva sudokus o que los cree aleatoriamente. Si no respondí en el otro hilo es porque me pareció que estabas más preocupado por el interfaz que por la lógica, y no me interesa el interfaz ni quería desviar el tema.

Creo, en mi humilde opinión, que habría sido más instructivo preocuparse de la lógica. Por eso, si quieres aprender y ser capaz de resolver problemas complejos programando, yo me preocuparía de esa clase de cosas. El interfaz, al fin y al cabo, se puede hacer con glade más o menos fácilmente.

Buenas, me alegra que des tu opinion, y mas de esa manera tan constructiva, bueno vamos por partes.

¿Que me interesa de la programacion?

La verdad, estoy aprendiendo por gusto, desde los 10 años me ha gustado la informatica y hay temporadas en las que aprendo hardware, hago otras cosas y temporadas en las que me dedico a software por una sencilla razón, aprender.
Estoy en primero de bachillerato, quiero en un futuro estudiar informatica en la universidad, y voy aprendiendo por mi cuenta lo que puedo.  :)

Sobre tu critica hacia el programa:

La agradezco y me hará reflexionar sobre en que cosas o no debo centrarme demasiado en este mundillo, la verdad mi intencion no era solo la de presentar una interfaz bien hecha, era la de hacerla para aclarame sobre como se mostraria en pantalla los numeros, como el usuario podria interactuar con el programa...pero para nada me interesa la interfaz, y menos en ms-dos que no me atrae para nada.

La presentacion que le he hecho al code...es simplemente para que pueda entenderlao la gente, aunque veo por otros posts que tanto if confunde  :P

Y para finalizar, quiero decirte que sí que es mejor centrarse en la algorítmica del programa pero tampoco era mi intencion la de hacer un programa complejo, simplemente un programita pequeño que me siente por ejemplo la base de como crear una matriz y algunos conceptos mas que creo que para programadores iniciados es algo que no se nace domiando.

Aclarada esa parte, tengo una pregunta, ¿podrias explicar algo mas de "glade" y como es su funcionamiento etc?

--------------------------------------------------------------------------------------------------
Voy a hacer un poko de crítica constructiva:

TEMA I: "Codificación"

1- Se pueden usar los bucles trankilamente para ahorrar algo de código. Para mostrar la matriz podrías hacer algo como:
Código:
for (i = 0; i < 9; i ++)
{
   for (j = 0; j < 9; j++)
      printf ("%d", exy[i][j]);
   printf("\n");
}
La parte bonita es facil de conseguir, y te lo dejo de tarea ;)

2- La verdad es que con el SUPER if que has hecho es facil perderse, es mas facil y eficiente hacer algo como:
Código:
if (exy[x][y] != '0')
   printf ("posicion no valida");
else
   exy[x][y] = numero;
Eso suponiendo que las coordenadas comiencen a contar desde cero, lo cual para las personas no tiene demasiado sentido. Lo logico es comenzar desde 1 a 9, pero como el array va de 0 a 8 tendras q restar 1 a 'x' e  'y', ejemplo:
Código:
   exy[x-1][y-1]


TEMA II: "Errores varios"
Analiza el siguiente código:
Código:
   if (exy [9][9] == solucion [9][9])
                   {
                           printf ("\nFelicidades, lo has conseguido.\n");
                           system ("pause");
                           exit (0);
                   }
                   else
                   {
                           printf ("\nLo siento, no lo has conseguido.\n\n");
                           system ("pause");
                           exit (0);
                   }
1- las matrices estan fuera de rango: Aunque tengas 9 posiciones van de 0 a 8, por tanto seria: exy[8][8] (igual para la matriz solucion)
2- Suponiendo que esten dentro de rango. ¿Qué estas haciendo en realidad? Comprobar si el sudoku está bien resuelto ¿cierto?
     a- Das como sudoku bien resuelto aquel sudoku en el que coincida la posicion [8][8] con la cifra sel array solucion[8][8], aunque el resto esté mal o ni esté resuelto, tan solo has de tener esa cifra bien.
     b- Dado que tienes en la matriz exy esa posicion ( exy[8][8] ) y además coincide con la solucion, ese sudoku siempre estará bien resuleto hagamos lo que hagamos.

TEMA III: "Propuesta"
Te propongo que revices todo el código, soluciones los errores y además que hagas un sudoku donde se hagan las comprobaciones de fila, columna y región (con bucles) cada vez que se teclea una cifra.
Una vez terminado que no haga falta tener una matriz con la solucion sino que haga una comprobracion más simple, por ejemplo hacer un bucle anidado (como el que está posteado mas arriba) y que compruebes que no existen ceros ( 0 ) en la matriz, eso, junto con la comprobacion al teclear el numero, indicará quue el sudoku está bien resuelto.
Como extra puedes hacer un fichero de texto dnd escribas el sudoku a rellenar y luego leyendo el fichero vas rellenando la matriz.

En este mismo foro hay informacion de sobra sobre el sudoku y de como hacer las comprobaciones. No obstante siempre que tengas alguna duda puedes preguntar en el foro, como es normal.

Un saludo!!!

Bueno, decir que acepto tus sugerencias y me parecen interesantes, estoy deacuerdo contigo en todo pero aclaro que mi intencion no era hacer un programa complejo, igual ayer fuí un poco precoz en postear el codigo pensando que iba a ser de ayuda.

Bueno ya para finalizar, la comprobacion que hago aqui:

Código:
if (exy [9][9] == solucion [9][9])
                   {
                           printf ("\nFelicidades, lo has conseguido.\n");
                           system ("pause");
                           exit (0);
                   }
                   else
                   {
                           printf ("\nLo siento, no lo has conseguido.\n\n");
                           system ("pause");
                           exit (0);
                   }
Pienso que cuando hace la comprobacion, a la matriz exy se le han asignado numeros introducidos por el usuario, al querer comprobar se comprobara la matriz exy con solucion y si es igual estará bien el sudoku, si no no ahi creo que te has equivocado pero bueno alomejor confundo yo...

Bueno gracias a todos por sus sugerencias y ayuda.

Un Saludo
En línea





.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.561


Shrödingerificado


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #6 en: 13 Febrero 2008, 15:57 »

Glade es una herramienta gráfica para desarrollar GUIs, no es la única, para C/C++ existe también el Qt designer y KDevelop permite hacer lo mismo. Para otros lenguajes hay otras, Visual Basic es probablemente el más famoso por esto, pero java netbeans tiene un editor muy bueno.

Por eso, por que es relativamente fácil desarrollar GUIs creo que no tiene mucho sentido dedicar tiempo a aprender a hacer interfaces no gráficos, ni interfaces en general, cuando hay otras cosas, en mi opinión, más interesantes.

PD: la presentación del código es importante en cuanto a tabulaciones, etc. porque lo hace más legible, pero el comentario del final por ejemplo creo que no es necesario. Aparte las líneas deberían tener un largo máximo de 80 caracteres, normalmente los editores de hoy en día no tienen problemas en mostrar líneas más largas, pero no se ha establecido un largo máximo "estándar" distinto de 80 todavía.
« Última modificación: 13 Febrero 2008, 16:00 por Ragnarok » En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Flakito81


Desconectado Desconectado

Mensajes: 508



Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #7 en: 13 Febrero 2008, 17:09 »

Código:
  int exy [9][9]= {
     
            0, 2, 0, 0, 0, 3, 0, 0, 4,
            3, 0, 0, 0, 6, 0, 0, 7, 8,
            0, 0, 0, 8, 0, 0, 0, 2, 0,
            6, 4, 0, 1, 3, 0, 0, 8, 0,
            8, 0, 0, 0, 0, 0, 0, 0, 1,
            0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 4, 0, 5, 3, 0,
            1, 0, 0, 0, 7, 0, 0, 6, 0,
            0, 5, 0, 0, 0, 0, 0, 0, 2 <-- mira
                   
                    };
   
    int solucion[9][9]= {
   
            9, 2, 8, 7, 1, 3, 6, 5, 4,
            3, 1, 5, 2, 6, 4, 9, 7, 8,
            4, 6, 7, 8, 9, 5, 1, 2, 3,
            6, 4, 2, 1, 3, 9, 7, 8, 5,
            8, 9, 3, 6, 5, 7, 2, 4, 1,
            5, 7, 1, 4, 2, 8, 3, 9, 6,
            2, 8, 6, 9, 4, 1, 5, 3, 7,
            1, 3, 4, 5, 7, 2, 8, 6, 9,
            7, 5, 9, 3, 8, 6, 4, 1, 2  <-- mira
                   
                        };
      if (exy [9][9] == solucion [9][9]) <-- (ESTA FUERA DE RANGO)
                   {
                           printf ("\nFelicidades, lo has conseguido.\n");
                           system ("pause");
                           exit (0);
                   }
                   else
                   {
                           printf ("\nLo siento, no lo has conseguido.\n\n");
                           system ("pause");
                           exit (0);
                   }

Viendo las matrices ¿no crees que exy[8][8] es igual a solucion[8][8] ? Dicho de otra manera, el usuario no puede cambiar el valor en esa posicion.

De los errores de aprende y lo ideal es q intentes hacer el programa de manera correcta. En principio no te preocupes tanto por la presentacion q eso solo es cuestion de dedicar un poco mas de tiempo, lo importante es la lógica que hay detras.

Partiendo de la idea que no he probado tu código haz la siguiente prueba: introduce un numero en el sudoku y luego haz la comprobacion a ver si no te lo da como correcto, aunque en realidad sepas q falta rellenarlo. Para hacer la prueba corrige if (exy [9][9] == solucion [9][9]) por if (exy [8][8] == solucion [8][8])
Un saludo!!
En línea
AxXioma


Desconectado Desconectado

Mensajes: 795


Algunos pájaros no pueden ser enjaulados...


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #8 en: 13 Febrero 2008, 20:36 »

Ya entiendo, ahora me doy cuenta y veo que ha sido el error mas tonto que he podido cometer, creia que al especificarle que hiciera la comprobacion, tendria en cuenta todas las celdas de la matriz...por dios vaya fallo, ahora me doy cuenta de que debo ponerle un bucle que recorra todas las celdas.

Ahora entiendo, el recorrido de las celdas con dos for, ha sido un fallo tonto que no me di cuenta al programar. Cuando tenga tiempo lo modifico y posteo.

Muchas gracias.
En línea





.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
AxXioma


Desconectado Desconectado

Mensajes: 795


Algunos pájaros no pueden ser enjaulados...


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #9 en: 14 Julio 2008, 18:43 »

Hola, buenas tardes:

Lo primero que tengo que hacer por postear en un hilo tan viejo como éste es pedir disculpas, espero que sean aceptadas. La razón de la resurrección de este tema es que acabo de ver que en un hilo de concentración de aportes y demás códigos de C estaba en el, y en principio yo creé el tema.

Quedó en el olvido con el paso del tiempo y no tuve oportunidad de postear el código, y ahora al verlo puesto en el hilo de aportes, no he podido remediar corregirlo y postearlo ya que los codes que aquí estan posteados están mal ya que el juego independientemente de como lo realizaras siempre era válido.

Código
/******************************************************************************/
/*  Name: Sudoku V.1                                                          */
/*  Author: Sergio Garre                                                      */
/*  Date: 14/07/08                                                            */
/*  Description: Un simple sudoku realizado haciendo uso de matrices, el      */
/*               usuario interactua con las coordeandas y la lógica para      */
/*               rellenarlo, finalmente se comprueba si está bien o mal.      */
/******************************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
 
int
main (void)
{
 int exy[9][9] = {
 
   0, 2, 0, 0, 0, 3, 0, 0, 4,
   3, 0, 0, 0, 6, 0, 0, 7, 8,
   0, 0, 0, 8, 0, 0, 0, 2, 0,
   6, 4, 0, 1, 3, 0, 0, 8, 0,
   8, 0, 0, 0, 0, 0, 0, 0, 1,
   0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 4, 0, 5, 3, 0,
   1, 0, 0, 0, 7, 0, 0, 6, 0,
   0, 5, 0, 0, 0, 0, 0, 0, 2
 };
 
 int solucion[9][9] = {
 
   9, 2, 8, 7, 1, 3, 6, 5, 4,
   3, 1, 5, 2, 6, 4, 9, 7, 8,
   4, 6, 7, 8, 9, 5, 1, 2, 3,
   6, 4, 2, 1, 3, 9, 7, 8, 5,
   8, 9, 3, 6, 5, 7, 2, 4, 1,
   5, 7, 1, 4, 2, 8, 3, 9, 6,
   2, 8, 6, 9, 4, 1, 5, 3, 7,
   1, 3, 4, 5, 7, 2, 8, 6, 9,
   7, 5, 9, 3, 8, 6, 4, 1, 2
 };
 
 int numero = 0, opcM, c, i, j, contador = 0;
 int x, y;
 
 do
   {
 
     printf ("\n\t\t\t\tMENÚ\n");
     printf ("\t\t\t\t----\n");
     printf ("\n1.Nuevo Juego.\n\n");
     printf ("0.Salir.\n\n");
 
     printf ("Escoja una opción (0-1)\n\n");
     scanf ("%d", &opcM);
 
     switch (opcM)
 
{
 
case 1:
 
 do
   {
 
     printf ("\n");
     printf ("      0   1   2    3   4   5    6   7   8  \n\n");
     printf
(" 0  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[0][0], exy[0][1], exy[0][2], exy[0][3], exy[0][4],
exy[0][5], exy[0][6], exy[0][7], exy[0][8]);
     printf ("    ------------  -----------  ------------\n");
     printf
(" 1  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[1][0], exy[1][1], exy[1][2], exy[1][3], exy[1][4],
exy[1][5], exy[1][6], exy[1][7], exy[1][8]);
     printf ("    ------------  -----------  ------------\n");
     printf
(" 2  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[2][0], exy[2][1], exy[2][2], exy[2][3], exy[2][4],
exy[2][5], exy[2][6], exy[2][7], exy[2][8]);
     printf ("    ------------  -----------  ------------\n");
     printf ("    ------------  -----------  ------------\n");
     printf
(" 3  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[3][0], exy[3][1], exy[3][2], exy[3][3], exy[3][4],
exy[3][5], exy[3][6], exy[3][7], exy[3][8]);
     printf ("    ------------  -----------  ------------\n");
     printf
(" 4  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[4][0], exy[4][1], exy[4][2], exy[4][3], exy[4][4],
exy[4][5], exy[4][6], exy[4][7], exy[4][8]);
     printf ("    ------------  -----------  ------------\n");
     printf
(" 5  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[5][0], exy[5][1], exy[5][2], exy[5][3], exy[5][4],
exy[5][5], exy[5][6], exy[5][7], exy[5][8]);
     printf ("    ------------  -----------  ------------\n");
     printf ("    ------------  -----------  ------------\n");
     printf
(" 6  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[6][0], exy[6][1], exy[6][2], exy[6][3], exy[6][4],
exy[6][5], exy[6][6], exy[6][7], exy[6][8]);
     printf ("    ------------  -----------  ------------\n");
     printf
(" 7  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[7][0], exy[7][1], exy[7][2], exy[7][3], exy[7][4],
exy[7][5], exy[7][6], exy[7][7], exy[7][8]);
     printf ("    ------------  -----------  ------------\n");
     printf
(" 8  | %d | %d | %d || %d | %d | %d || %d | %d | %d |\n",
exy[8][0], exy[8][1], exy[8][2], exy[8][3], exy[8][4],
exy[8][5], exy[8][6], exy[8][7], exy[8][8]);
     printf ("    ------------  -----------  ------------\n\n");
 
     printf ("Introduzca una coordenada: ");
     scanf ("%d %d", &x, &y);
 
     if (exy[x][y] != exy[0][1] && exy[x][y] != exy[0][5]
 && exy[x][y] != exy[0][8] && exy[x][y] != exy[1][0]
 && exy[x][y] != exy[1][4] && exy[x][y] != exy[1][7]
 && exy[x][y] != exy[1][8] && exy[x][y] != exy[2][3]
 && exy[x][y] != exy[2][7] && exy[x][y] != exy[3][0]
 && exy[x][y] != exy[3][1] && exy[x][y] != exy[3][3]
 && exy[x][y] != exy[3][4] && exy[x][y] != exy[3][7]
 && exy[x][y] != exy[4][0] && exy[x][y] != exy[4][8]
 && exy[x][y] != exy[6][4] && exy[x][y] != exy[6][6]
 && exy[x][y] != exy[6][7] && exy[x][y] != exy[7][0]
 && exy[x][y] != exy[7][4] && exy[x][y] != exy[7][7]
 && exy[x][y] != exy[8][1] && exy[x][y] != exy[8][8])
{
 
 printf ("Introduzca un numero: ");
 scanf ("%d", &numero);
 
 if (numero < 1 || numero > 9)
   {
     printf
("El numero debe estar comprendido entre 1-9.\n");
   }
 else
   {
     exy[x][y] = numero;
   }
}
     else
{
 printf ("La coordenada introducida no es accesible.\n");
}
 
     fflush (stdin);
 
     printf
("Para comprobar pulse [1], para seguir jugando, cualquier otra tecla: ");
     scanf ("%d", &c);
 
     if (c == 1)
{
 for (i = 0; i < 9; i++)
   {
     for (j = 0; j < 9; j++)
{
 if (exy[i][j] == solucion[i][j])
   {
     printf ("Casilla [%d][%d]: Correcta\n", i + 1,
     j + 1);
   }
 if (exy[i][j] != solucion[i][j])
   {
     printf ("Casilla [%d][%d]: Incorrecta\n", i + 1,
     j + 1);
     contador++;
   }
}
   }
}
     if (contador > 0)
{
 printf ("No lo has conseguido.\n");
}
     else
{
 printf ("Enhorabuena, lo has conseguido.\n");
}
 
     system ("clear");
 
   }
 while (c != 1);
 
case 0:
 
 return (0);
 
default:
 printf ("Opción Incorrecta.");
 
}
 
   }
 while (opcM != 0);
 
 return (0);
 
}
 
/******************************************************************************/
/*                                                                            */
/*                             FIN DEL PROGRAMA                               */
/*                                                                            */
/******************************************************************************/
 
Saludos y perdonen las molestias.
« Última modificación: 25 Agosto 2008, 01:32 por Sarkis » En línea





.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
neo007

Desconectado Desconectado

Mensajes: 81



Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #10 en: 15 Julio 2008, 07:56 »

estoy de acuerdo con Ragnarok. hubiese sido mejor un prog que resolviera sudokus..... xq uno ya hecho no tiene mucha ciencia...... solo es comparar si dos matrices son iguales...... y la comprobacion de los datos (el rango d columnas, filas, y valosres que peude presentar una coordenada.....
En línea
AxXioma


Desconectado Desconectado

Mensajes: 795


Algunos pájaros no pueden ser enjaulados...


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #11 en: 15 Julio 2008, 13:26 »

estoy de acuerdo con Ragnarok. hubiese sido mejor un prog que resolviera sudokus..... xq uno ya hecho no tiene mucha ciencia...... solo es comparar si dos matrices son iguales...... y la comprobacion de los datos (el rango d columnas, filas, y valosres que peude presentar una coordenada.....

Como dije, mi objetivo no era ese y lo unico que pretendía era aportar algo al foro y a esos programadores noveles que recien empiezan y no saben ni leer datos de una matriz. No pretendía que fuera el programa estrella, tan solo un simple aporte que en vez de llamarlo sudoku, puedo llamarlo lectura de matrices si asi se esta más conforme...

Si un día me da la vena de programar alguna aplicación que resuelva sudokus, lo postearé, de mientras esto es lo que hay y espero que le sea a alguien de ayuda.

PD: Más arriba tambien he añadido que solo he modificado el código para que esté bien, ya que no iba a dejar algo así como aporte.

Saludos
« Última modificación: 15 Julio 2008, 13:38 por sarkis » En línea





.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
DN

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #12 en: 2 Agosto 2008, 01:56 »

Buen programa amigo, aunque tal y como han dicho por ahi se puede arreglar algo de tu code, entre otras cosas, deberias usar mas los estatutos for, while, do while, etc.  ;) ;)

Por lo demas pues yo pienso que bien.  ;D ;D
En línea
NephiT

Desconectado Desconectado

Mensajes: 4


Gott Weiss Ich Will Keine Engel Sein


Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #13 en: 10 Agosto 2008, 20:11 »

Hola, que tal.
Yo soy nuevo en el tema de la programacion y queria saber cual es la diferencia entre poner
 printf ("Escoja una opción (0-1)\n\n");
y
 cout << "Escoja una opcion (0-1) <<endl << endl;
 porque estoy viendo que muchas personas usan mas el "printf" mas que el "cout" y yo aprendi a usar el "cout"
¿Tiene que ver con el compilador que se utiliza?
o ¿es por temas de conevincia/costumbre?
Gracias y ojala yo puediera hacer programas asi dentro de poco.
En línea
TheMaker


Desconectado Desconectado

Mensajes: 513



Ver Perfil
Re: Sudoku [Aporte]
« Respuesta #14 en: 10 Agosto 2008, 20:22 »

C --> printf
C++ --> cout
En línea

Gibe money please or I report you
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C++] Sudoku V1.00
Programación C/C++
JuaN-ThE-HaCKeR 10 4,900 Último mensaje 8 Julio 2009, 06:19
por Diov
[APORTE] ucProgressBar
Programación Visual Basic
raul338 2 697 Último mensaje 10 Diciembre 2010, 17:56
por Hurubnar
[APORTE] ucIpAddressBox
Programación Visual Basic
raul338 0 466 Último mensaje 11 Diciembre 2010, 22:26
por raul338
[RETO] Sudoku « 1 2 »
Programación Visual Basic
Psyke1 25 2,400 Último mensaje 24 Septiembre 2011, 13:02
por mDrinky
Resolución sudoku heuristica
Programación General
psylock 6 1,490 Último mensaje 14 Noviembre 2011, 11:25
por BlackZeroX (Astaroth)
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines