elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Java / Re: Codigo para crear SUDOKUS en: 14 Agosto 2017, 20:38 pm
Hola amigo

Tenia pensado que solo fuera soluciones unicas por lo tanto el valor minimo de elementos que deben aparecer es de 17 pistas o valores para cada sudoku, si es menos que 17 ya seria de solucion multiple que por ahora no lo tengo comtemplado. por esta razon y tratando de adelantar habia pensado en la dificultad del juego asignado valores o pistas que mostrar para cada una. pero aun no tengo muy claro como hacer para mostrar dicha cantidad de valores de forma aleatoria en la matriz en esas estoy vamos a ver como me va cualquier cosa te sigo avisando.

Buen dia bendiciones.
2  Programación / Java / Re: Codigo para crear SUDOKUS en: 14 Agosto 2017, 02:04 am
olvida esa pregunta es algo muy tonto tenia que matriz[][] = matriz2[][] claro por eso me imprimia ceros le esta asignando valores de la segunda matriz q estaba vacia que tonteria ...
3  Programación / Java / Re: Codigo para crear SUDOKUS en: 14 Agosto 2017, 01:13 am
Nebire amigo una pregunta

es correcto hacer esto

Código:
 public static void GeneradorAleatorio() {
    .
    .
    .
 GeneradorDePistas(matriz);  // aqui invoco la funcion y le mando la matriz que ya tiene el sudoku resuelto
}

la idea es copiar esa matriz a una matriz2 para trabajar sobre ella lo de las pistas, es decir la cantidad de numeros que va a salir en el sudoku que vamos a resolver

Código:
public static void GeneradorDePistas(int matriz[][]){
        
        int matriz2 [][] = new int [9][9];
        
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                matriz[i][j] = matriz2[i][j];
            }
        }
        
        System.out.println("");
        System.out.println("");
        for (int i = 0; i < 9; i++) {
            System.out.println("");
            for (int j = 0; j < 9; j++) {
                System.out.print(matriz2[i][j] + "\t");
            }
        }
    }

al ejecutarlo de esta funcion no me imprime la copia si no una matriz de solo ceros
4  Programación / Java / Re: Codigo para crear SUDOKUS en: 13 Agosto 2017, 22:07 pm
Hola NEbire te doy mil gracias por la ayuda ya logre hacerlo solo me faltaba evaluar cuando el indice de ese arrayazar llegaba a 0 para que devolviera 0 como tu lo tenias,  para asi poder entrar en la parte que corrige el bloqueo, ya pude realizarlo mil gracias por todo.

ahora viene la parte grafica. cuando este terminado o necesite ayuda te comentare e igual lo publicare para que les sirva de guia a los que inicen algo similar
5  Programación / Java / Re: Codigo para crear SUDOKUS en: 13 Agosto 2017, 02:36 am
Hola nebire espero que estes bien ...

mira pido disculpas por no haberte comentado nada de hace tiempo pero no me encontraba en la ciudad y no habia podido continuar con este proyecto.

Bueno te comento que sigo un poco perdido con el tema del parametro que pasas donde tienes el out
Código:
Array Byte = Funcion TomarAusentes(Array Byte Presentes(), Out Entero NumAusentes)
entiendo que es el indice del vector ausentes pero no se manejarlo como tu lo haces por ende las ultimas funciones de devolverValorAzar no las hice si no que lo hice como yo pude, por otro lado el metodo generarSudoku ya lo hice si tenias razon era algo muy sencillo probe el codigo hasta donde me deviuelve los valores ausentes y todo esta correcto pero aun asi me sigue presentando el bloqueo y solo me llena aproximadamente unos 36 a 44 valores de ahi no me pasa y no se si es un error en la funcion que devuelve el valorAzar pero no me esta retrocediendo y me esta botando un error que traduce que debe ser positivo.

Te coloco el error completo
Código:
Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive
at java.util.Random.nextInt(Random.java:388)
at Clases.Tratando.SeleccionarValorAzar(Tratando.java:199)
at Clases.Tratando.GeneradorAleatorio(Tratando.java:14)
at Clases.Tratando.main(Tratando.java:205)
C:\Users\Edilberto\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

y te coloco el sodigo completo de lo que hice

Código:
package Clases;
import java.util.Random;
public class Tratando {

    public static void GeneradorAleatorio() {
       
        int matriz[][];
        int fila = 1, columna, intentos, valor;
        matriz = PrimeraFila();
        do {
            columna = 0;
            intentos = 0;
            do {
                valor  = SeleccionarValorAzar(matriz, fila, columna);
                if (valor > 0) {
                    matriz[fila][columna] = valor;
                    columna++;
                }else{
                    for (int i = 0; i < columna; i++) {
                        matriz[fila][i] = 0;
                    }
                    intentos++;
                    if (intentos == 5) {
                        System.out.println("intentos: " + intentos);
                        if (fila>0) {
                            fila = fila-1;
                            for (int i = 0; i < 8; i++) {
                                matriz[fila][i] = 0;
                            }
                        }
                        intentos = 0;
                    }
                    columna = 0;
                }
            } while (columna < 9);
            fila++;
        } while (fila < 9);
       
        for (int k = 0; k < 9; k++) {
            System.out.println("");
            for (int h = 0; h < 9; h++) {
                System.out.print(matriz[k][h] + "\t");
            }
        }
    }
   
    public static int [][] PrimeraFila() {
       
        int matriz[][] = new int[9][9];
        Random ran = new Random();
        int fila = 0;
        int numero;
        int em=0;
        int cont=0,j;
        int i = 0;
        while (i < 9) {
            numero = 1 + ran.nextInt(9);
            if (em == 0) {
                matriz[fila][i] = numero;
                em++;
            }else{
                cont = 0;
                j = 0;
                while (j < i) {
                    if (numero == matriz[fila][j]) {
                        cont++;
                        break;
                    }else{
                        matriz[fila][i] = numero;
                    }
                    j++;
                }
            }
            if (cont==0) {
                i++;
            }
        }
       
        return matriz;
    }

    public static int [] GetFila(int matriz[][], int fila) {
       
        int filas[] = new int[9];
        System.arraycopy(matriz[fila], 0, filas, 0, 9);
        return filas;
    }

    public static int [] GetColumna(int matriz [][], int columna) {
        int columnas[] = new int[9];
        for (int i = 0; i < 9; i++) {
            columnas[i] = matriz[i][columna];
        }
        return columnas;
    }

    public static int [] GetCaja(int matriz[][], int filas, int columnas) {

        int minfila = 0, maxfila = 0;
        int mincolum = 0, maxcolum = 0;

        if (filas >= 0 && filas < 3) {
            minfila = 0;
            maxfila = 2;
        } else if (filas >= 3 && filas < 6) {
            minfila = 3;
            maxfila = 5;
        } else if (filas >= 7 && filas < 9){
            minfila = 6;
            maxfila = 8;
        }

        if (columnas >= 0 && columnas < 3) {
            mincolum = 0;
            maxcolum = 2;
        } else if (columnas >= 3 && columnas < 6) {
            mincolum = 3;
            maxcolum = 5;
        } else if (columnas >= 7 && columnas < 9){
            mincolum = 6;
            maxcolum = 8;
        }
       
        int caja[] = new int[9];
        int k = 0;

        for (int i = minfila; i <= maxfila; i++) {
            for (int j = mincolum; j <= maxcolum; j++) {
                caja[k] = matriz[i][j];
                k++;
            }
        }
        return caja;
    }

    public static int[] unificarArray (int filas[], int columnas[], int caja[]) {
       
        int unificado[] = new int[10];
       
        for (int i = 0; i < 9; i++) {
            if (filas[i]>0) {
                unificado[filas[i]] += 1;
            }
            if (columnas[i]>0) {
                unificado[columnas[i]] += 1;
            }
            if (caja[i]>0) {
                unificado[caja[i]] += 1;
            }
        }
        unificado[0] = 0;
       
        for (int i = 1; i < 10; i++) {
            if (unificado[i] > 0) {
                unificado[i] = i;
            }
        }
        return unificado;
    }
   
    public static int [] TomarAusentes (int unificado[]){
        int cont = 0;
        for (int i = 1; i < 10; i++) {
            if (unificado[i] == 0) {
                cont++;
            }
        }
       
        int ausentes[] = new int [cont];
       
        int k=0;
        for (int j = 1; j < 10; j++) {
            if (unificado[j] == 0) {
                ausentes[k] = j;
                k++;
            }
        }
       
        return ausentes;
    }
   
    public static int [] GetArrayAusentes (int matriz [][], int x, int y){
        int tempfila[] = GetFila(matriz, x);
        int tempcolum[] = GetColumna(matriz, y);
        int tempcaja [] = GetCaja(matriz, x, y);
       
        int temp [] = unificarArray(tempfila, tempcolum, tempcaja);
       
        return TomarAusentes(temp);
    }
   
    public static int SeleccionarValorAzar (int matriz [][], int x, int y){
        int n;
        int temp[] = GetArrayAusentes(matriz, x, y);
        for (int i = 0; i < temp.length; i++) {
            System.out.print("\n"+temp[i]+"\t");
        }
        Random rand = new Random();
        n = + rand.nextInt(temp.length);
        System.out.println(":" + temp[n]);
        return temp[n];
    }
   
    public static void main(String[] args) {
        GeneradorAleatorio();
    }
}
6  Programación / Java / Re: Codigo para crear SUDOKUS en: 5 Agosto 2017, 10:44 am
Hola NEBIRE que mas como etas espero que muy bien.

Bueno te comento ya hoy pude sentarme realmente a dedicarle tiempo a esto y creo que me fue super bien por que creo que adelante bastante y de la forma correcta, modifique cosas que para mi estaban demasiado enredadas y que no sabia si el codigo se estaba ejecutando de forma correcta pero llegue a un punto que no te entiendo y es la parte final de rellenar el sudoku como lo tienes en el siguiente codigo:

Código:
//código previo
            Valor = SeleccionarValorAzar(Columna, Fila)  //la función que obtiene un valor de cada vez.
            Si (Valor>0) luego
                Sudoku((Fila * c_Nueve) + Columna) = valor   //Sudoku() es el array que mantiene internamente los valores.             
                Columna +=1
            Si no
                // Borra los valores de la fila actual
                Bucle para k desde 0 a columna
                    Sudoku((Fila * c_Nueve) + k) = 0
                Fin bucle

                // Tras 10 intentos en la misma fila, borramos también la fila previa
                Intentos += 1
                Si (Intentos = 10) luego
                    Si (Fila > 0) luego  // no podemos retroceder a filas más atrás que la primera.
                        Fila = (Fila - 1) // Borramos también la fila anterior (y si sucede otra vez, la previa, etc...)
                        Bucle para k desde 0 To c_Ocho
                            Sudoku((Fila * c_Nueve) + k) = 0                           
                        Fin Bucle
                    Fin si
                    Intentos = 0
                Fin si
                Columna = 0
            Fin si
.... // código después...
aqui hay cosas obvias y otras no tanto.
1- cual es ese array sudoku y para que sirve ? no lo entiendo la verdad

2- yo estoy trabajando con una matriz bidimensional y en mi funcion generadoraleatorio() es donde supuestamente lo lleno(Segun mi forma de hacerlo) pero no se en que lugar estaria metiendo este codigo que te muestro arriba el tuyo, por que tu hablas de codigo previo y codigo despues ???

3- por otro lado tengo muchas dudas con la funcion de tomar ausentes por que pones como parametro un out NumAusentes

Código:
Array Byte = Funcion TomarAusentes(Array Byte Presentes(), Out Entero NumAusentes)
no entiendo por que pones ese valor ahi, o bueno creo saberlo, lo haces para tener el indice de ese vector pero lo que no se es por que tenerlo de parametro si al llamarlo de otra funcion como lo haces en
Código:
Array byte = GetArrayAusentes(Entero X, Entero Y,  Out Entero NumAusentes)

ese valor no lo utilizas de ninguna manera o por lo menos no lo veo que lo hagas para mi ese valor por parametro no sirve por que el dato que se utiliza es es que devuelve la funcion como tal.

La verdad no me queda muy claro eso voy a colocar el codigo que tengo solo para que me ayudes a depurar errores pero solo faltaria que me explicaras eso que te pido para poder hacer las funciones de valor azar y la de permitido o admisible no entiendo el por que tu tienes otras mas tampoco.
Código:
package Clases;

import java.util.Random;

public class Tratando {

    public static void GeneradorAleatorio() {
       
        int matriz[][] = new int[9][9];
               
        for (int i = 0; i < 9; i++) {
            System.out.println("");
            for (int j = 0; j < 9; j++) {
                System.out.print(matriz[i][j] + "\t");
            }
        }
    }

    public static int [] GetFila(int matriz[][], int fila) {
        int filas[] = new int[9];
        for (int i = 0; i < 9; i++) {
            filas[i] = matriz[fila][i];
        }
        return filas;
    }

    public static int [] GetColumna(int matriz [][], int columna) {
        int columnas[] = new int[9];
        for (int i = 0; i < 9; i++) {
            columnas[i] = matriz[i][columna];
        }
        return columnas;
    }

    public static int [] GetCaja(int matriz[][], int filas, int columnas) {

        int minfila, maxfila;
        int mincolum, maxcolum;

        if (filas >= 0 && filas < 3) {
            minfila = 0;
            maxfila = 2;
        } else if (filas >= 3 && filas < 6) {
            minfila = 3;
            maxfila = 5;
        } else {
            minfila = 6;
            maxfila = 8;
        }

        if (columnas >= 0 && columnas < 3) {
            mincolum = 0;
            maxcolum = 2;
        } else if (columnas >= 3 && columnas < 6) {
            mincolum = 3;
            maxcolum = 5;
        } else {
            mincolum = 6;
            maxcolum = 8;
        }
       
        int caja[] = new int[9];
        int k = 0;

        for (int i = minfila; i < maxfila; i++) {
            for (int j = mincolum; j < maxcolum; j++) {
                caja[k] = matriz[i][j];
                k++;
            }
        }
        return caja;
    }

    public static int[] unificarArray (int filas[], int columnas[], int caja[]) {
       
        int unificado[] = new int[10];
       
        for (int i = 0; i < 9; i++) {
            if (filas[i]>0) {
                unificado[filas[i]] += 1;
            }
            if (columnas[i]>0) {
                unificado[columnas[i]] += 1;
            }
            if (caja[i]>0) {
                unificado[caja[i]] += 1;
            }
        }
        unificado[0] = 0;
       
        for (int i = 1; i < 10; i++) {
            if (unificado[i]>0) {
                unificado[i] = i;
            }
        }
        return unificado;
    }
   
    public static int [] TomarAusentes (int unificado[]){
        int ausentes[] = new int [9];
        int k=0;
        for (int i = 1; i < 10; i++) {
            if (unificado[i] == 0) {
                ausentes[k] = i;
                k++;
            }
        }
        return ausentes;
    }
   
//    public static int ValorAZar (int matriz[][], int i, int j) {
//       
//        Random rand = new Random();
//       
//     
//        return azar[n];
//    }
//    public otra funcion (){
//        int tempfila[];
//        int tempcolum[];
//        int tempcaja[];
//        int tempo[];
//       
//          tempfila = GetFila(matriz, i);
//        tempcolum = GetColumna(matriz, j);
//        tempcaja = GetCaja(matriz, i, j);
//    }
   
    public static void main(String[] args) {

        GeneradorAleatorio();//
       
    }
}
La parte comentada es donde iria las funciones que me faltan por entender.
7  Programación / Java / Re: Codigo para crear SUDOKUS en: 3 Agosto 2017, 07:12 am
lo que hago para contar con la matriz en todo el codigo es declararla como static  como si fuera una variable global, eso mismo es lo que estaba intentando con los otros array ponerlos globales a ver si me funcionaba y ya habia corregido lo de los parametros solo pase los necesarios para cada funcion, solo seria optimizar el codigo de la caja como lo recomendaste.

Por otro lado hay algunas cosas que no entiendo de tu codigo pero lo estoy intentando a mi manera tratando de interpretar tu codigo.

A la hora de crear el unificado tengo problemas con el ciclo lo empiezo en 1 hasta <= 9 para que no tome los valores de 0 y me bota error, esto es lo que llevo hasta el momento no esta terminado ni depurado hay sobre la marcha me voy dando cuenta que me falta

Código:
package Clases;

import java.util.Random;

public class Tratando {

    static Random rand = new Random();

    static int matriz[][] = new int[9][9];
    static int filas[] = new int[9];
    static int columnas[] = new int[9];
    static int caja[] = new int[9];
    static int unificado[] = new int[9];
    static int ausentes[] = new int [9];
    public static void GeneradorAleatorio() {

        int numero;
        int em = 0;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                numero = 1 + rand.nextInt(9);
                if (em == 0) {
                    matriz[i][j] = numero;
                    em++;
                }else{
                    if (NumeroPermitido(numero)) {
                        matriz[i][j] = numero;
                    }
                }
            }
        }
       
        for (int i = 0; i < 9; i++) {
            System.out.println("");
            for (int j = 0; j < 9; j++) {
                System.out.print(matriz[i][j] + "\t");
            }
        }
    }

    public static void GetFila(int fila) {

        for (int i = 0; i < 9; i++) {
            filas[i] = matriz[fila][i];
        }
    }

    public static void GetColumna(int columna) {

        for (int i = 0; i < 9; i++) {
            columnas[i] = matriz[i][columna];
        }
    }

    public static void GetCaja(int filas, int columnas) {

        int minfila, maxfila;
        int mincolum, maxcolum;

        if (filas >= 0 && filas < 3) {
            minfila = 0;
            maxfila = 2;
        } else if (filas >= 3 && filas < 6) {
            minfila = 3;
            maxfila = 5;
        } else {
            minfila = 6;
            maxfila = 8;
        }

        if (columnas >= 0 && columnas < 3) {
            mincolum = 0;
            maxcolum = 2;
        } else if (columnas >= 3 && columnas < 6) {
            mincolum = 3;
            maxcolum = 5;
        } else {
            mincolum = 6;
            maxcolum = 8;
        }

        int k = 0;

        for (int i = minfila; i < maxfila; i++) {
            for (int j = mincolum; j < maxcolum; j++) {
                caja[k] = matriz[i][j];
                k++;
            }
        }
    }

    public static void unificarArray() {

        for (int i = 0; i < 9; i++) {
            unificado[filas[i]] = unificado[filas[i]] + 1;
            unificado[columnas[i]] = unificado[columnas[i]] + 1;
            unificado[caja[i]] = unificado[caja[i]] + 1;
        }

        for (int i = 0; i < 9; i++) {
            System.out.print(unificado[i] + "\t");
        }
    }
   
    public static void TomarAusentes (){
       
       
        int numeros;
        for (int i = 0; i < 10; i++) {
            if (unificado[i] == 0) {
                ausentes[i] = i;
               
            }
        }
    }
   
    public static boolean NumeroPermitido (int valor){
        boolean resultado = true;
        for (int i = 0; i < ausentes.length ; i++) {
            if (valor == ausentes[i]) {
                resultado = false;
                break;
            }
        }
        return resultado;
    }

    public static void main(String[] args) {

        GeneradorAleatorio();
       
    }
}
8  Programación / Java / Re: Codigo para crear SUDOKUS en: 3 Agosto 2017, 04:08 am
Nebire amigo tengo problemas al unificar los tres arrays en uno no se como pasarlos como parametros a la funcion Unificado.

solo llevo las tres funciones que obtienen los arrays de fila, columna y caja
me podrias ayudar.

Código:
public static int [] obtenerFila (int matriz[][], int filas, int columnas){
        int renglon[] = new int[9];
        for (int i = 0; i < 9; i++) {
            renglon[i]=matriz[i][columnas];
        }
        return renglon;
    }
   
    public static int [] obtenerColumna (int matriz[][], int filas, int columnas){
        int colum[] = new int[9];
        for (int i = 0; i < 9; i++) {
            colum[i]=matriz[filas][i];
        }
        return colum;
    }
   
    public static int [] obtenerCaja (int matriz[][], int filas, int columnas){
       
        int minfila, maxfila;
        int mincolum, maxcolum;
       
        if (filas >= 0 && filas < 3) {
            minfila = 0;
            maxfila = 2;
        }else if (filas >= 3 && filas < 6) {
            minfila = 3;
            maxfila = 5;
        }else {
            minfila = 6;
            maxfila = 8;
        }     
       
        if (columnas >= 0 && columnas < 3) {
            mincolum = 0;
            maxcolum = 2;
        }else if (columnas >=3 && columnas <6) {
            mincolum = 3;
            maxcolum = 5;
        }else{
            mincolum = 6;
            maxcolum = 8;
        }
       
        int k=0;
        int caja[] = new int[9];
        for (int i = minfila; i < maxfila; i++) {
            for (int j = mincolum; j < maxcolum; j++) {
                caja[k]=matriz[i][j];
                k++;
            }
        }
        return caja;
    }
9  Programación / Java / Re: Codigo para crear SUDOKUS en: 1 Agosto 2017, 08:34 am
Hola NEBIRE que tal,

Ya esta mucho mejor esto ya puedo decir que comprendo muchisimo mas tu logica solo me queda ponerlo en practica y mirar hasta donde llego, cualquier inquietud o ayuda que necesite te la estare comunicando muchisimas gracias por tu colaboracion hasta el momento, espero poder seguir contando contigo jajajaj

Bendiciones Saludos a todos
10  Programación / Java / Re: Ayuda con codigo en java en: 31 Julio 2017, 06:31 am
Hola amigos como estan ?, espero que bien.

Bueno primero que todo quiero agradecerles el tiempo que dedicaron ambos compañeros para revisar el codigo y ayudarme, de verdad les agradezco mucho. Pero retomando el tema NEBIRE la verdad no entiendo mucho tu logica, intento comprender  lo que me dices, pero no lo logro primero me dices que cree numeros del 1 al 8  y calcule la ultima posicion por fila, columna o caja buscando la que falte, eso por un lado, luego hablas de crear 3 arrays distintos para para hallar valores entre los cuales debo obetener los que faltan (Es lo que entiendo) osea estando en tal posicion que cree una fila una columna y un bloque ??? .... y me perdi  ;D ;D no se de verdad hay muchas cosas que no entiendo de tu codigo, podrias por favor intentar enseñarme tu logica con palabras o pasos mas simples no se como decirte, pero como dice mi profesor de programacion "formas de programar hay muchas", tal vez yo no lo veo como tu no lo entiendo por que esta es tu forma pero intenta explicarme tu logica (asi sea sin codigo solo la logica) que si entiendo la logica ya vere de que manera lo programo..

No se si entiendas el punto no quiero tener que hacer algo como tu jajaj si no poder aprender de ti...

te agradezco muchisimo a ti a todos los que puedan participar

cuidense y espero sus respuestas.
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines