Foros del Web » Programando para Internet » Javascript »

Reto de programación

Estas en el tema de Reto de programación en el foro de Javascript en Foros del Web. Estoy desarrollando un juego en HTML5 y JS. Trata sobre hacer filas moviendo unos cuadros. Cuando esto ocurre deberían desaparecer. Esta prácticamente acabado, solo le ...
  #1 (permalink)  
Antiguo 20/11/2013, 03:25
 
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Reto de programación

Estoy desarrollando un juego en HTML5 y JS. Trata sobre hacer filas moviendo unos cuadros. Cuando esto ocurre deberían desaparecer. Esta prácticamente acabado, solo le falta una función. Y aqui es donde esta mi problema que no consigo resolver.

Tengo una matriz de 7x7 (la declaro como aaTabla), dentro esta relleno de 0. Si Hay un cuadro en esa posición, cambia el 0 por un 1.

La pregunta es: ¿Como puedo encontrar cuando tres cuadros forman una fila? (tanto en horizontal, como vertical, como en diagonal). En otras palabras, cuando en mi matriz tengo tres unos formando una fila, columna o diagonal.

Mi intención es que mi función se llame

function limpiarFilas(inaaTabla) {

}

Y cambie los unos que forman lineas por ceros.
  #2 (permalink)  
Antiguo 20/11/2013, 04:26
Avatar de Crazylegs  
Fecha de Ingreso: septiembre-2013
Ubicación: Barcelona
Mensajes: 74
Antigüedad: 11 años, 1 mes
Puntos: 14
Respuesta: Reto de programación

Podrías hacer un bucle que mirase las filas, las columnas y las diagonales. Dentro de cada bucle mirar si la posición contiene un 1, si es así guardas la posición de la matriz en un array auxiliar y sumas uno a un contador, sino contiene un 1 borras ese array auxiliar y pones el contador a 0. después de cada bucle compruebas que el contador sea 3 o mayor, si es así con el bucle auxiliar pones 0 donde toca.

No sé si me he explicado bien. Espero que te sirva de base.
__________________
¡Mira mis tutoriales web!
  #3 (permalink)  
Antiguo 20/11/2013, 04:28
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Reto de programación

Hazlo por fuerza bruta, y cuando consigas que funcione, intenta refinarlo para eliminar comprobaciones absurdas y reducir bucles.

Por fuerza bruta consiste en un bucle anidado (dos FOR) que recorra todas las celdas de tu array bidimensional.

Cuando tengas la celda, ejecutarás un bucle mas, que irá de 0 a 2 (para comprobar si hay 3 en línea). Dicho índice se lo incrementarás a por ejemplo la columna, para comprobar si hay 3 casillas seguidas en la misma fila con el valor 1. Ten cuidado de no sobrepasar el tamaño máximo del array. Si encuentras tres seguidas, vuelve a ejecutar el mismo for pero esta vez poniendo las casillas a cero.

Luego haces lo mismo con las columnas, incrementando esta vez al fila.
Y despues lo mismo para diagonals, incrementando fila y columna. Y por último, para la diagonal inversa, incrementando la columnay restando a la fila.

En pseudo codigo

Código Javascript:
Ver original
  1. for (fila=0;fila<7;fila++)
  2. {
  3.     for(columna=0;columna<7;columna++)
  4.     {
  5.         //Bucle para comprobar filas
  6.         aciertos=0;
  7.         for (casilla=0;casilla<2 || columna+casilla<7;casilla++)
  8.        {
  9.             if tablero[fila,columna+casilla]==1  aciertos++;
  10.        }
  11.        if aciertos==3
  12.       {
  13.             for (casilla=0;casilla<2;casilla++)
  14.             {
  15.                  tablero[fila,columna+casilla]==0;
  16.              }
  17.       }
  18.       aciertos=0;
  19.       //Bucle para columnas, curratelo
  20.       //Bucle para diagonal izquierda-derecha, curratelo
  21.       //Bucle para diagonal derecha-izquierda, curratelo
  22.     }
  23. }
  #4 (permalink)  
Antiguo 20/11/2013, 06:12
 
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Respuesta: Reto de programación

Cita:
Iniciado por Crazylegs Ver Mensaje
Podrías hacer un bucle que mirase las filas, las columnas y las diagonales. Dentro de cada bucle mirar si la posición contiene un 1, si es así guardas la posición de la matriz en un array auxiliar y sumas uno a un contador, sino contiene un 1 borras ese array auxiliar y pones el contador a 0. después de cada bucle compruebas que el contador sea 3 o mayor, si es así con el bucle auxiliar pones 0 donde toca.

No sé si me he explicado bien. Espero que te sirva de base.
Si es lo primero que intenté.

Código:
 /**
     * Metodo que quita las filas que coinciden
     */
    this.quitarLineas = function() {
        var aaTem = new Array();
        var iCont = 0;
        //Busca en horizontal
        for (var i = 0; i < this.iLogTab; i++) {
            for (var j = 0; j < this.iLogTab - 1; j++) {
                if(this.aaTablero[i][j] != 0 
                    && this.aaTablero[i][j + 1] != 0
                    && this.aaTablero[i][j] == this.aaTablero[i][j + 1]) {
                    aaTem[aaTem.length] = new Array(i, j);
                    iCont++;
                } else if(iCont >= this.iNumLineas && j != 0) {
                    aaTem[aaTem.length] = new Array(i, j);
                    iCont = 0;
                    for (var k = 0; k < aaTem.length; k++) {
                            this.aaTablero[aaTem[k][0]][aaTem[k][1]] = 0;
                            console.log('Ehhh ' + aaTem[k][0] + ' ' + aaTem[k][1]);
                    }
                    aaTem = new Array();
                } else {
                    iCont = 0;
                    aaTem = new Array();
                }
            }
        }
    }
Pero ni funciona ni sirve para las diagonales

Gracias de todos modos.
  #5 (permalink)  
Antiguo 20/11/2013, 06:15
 
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Respuesta: Reto de programación

Cita:
Iniciado por marlanga Ver Mensaje
Hazlo por fuerza bruta, y cuando consigas que funcione, intenta refinarlo para eliminar comprobaciones absurdas y reducir bucles.

Por fuerza bruta consiste en un bucle anidado (dos FOR) que recorra todas las celdas de tu array bidimensional.

Cuando tengas la celda, ejecutarás un bucle mas, que irá de 0 a 2 (para comprobar si hay 3 en línea). Dicho índice se lo incrementarás a por ejemplo la columna, para comprobar si hay 3 casillas seguidas en la misma fila con el valor 1. Ten cuidado de no sobrepasar el tamaño máximo del array. Si encuentras tres seguidas, vuelve a ejecutar el mismo for pero esta vez poniendo las casillas a cero.

Luego haces lo mismo con las columnas, incrementando esta vez al fila.
Y despues lo mismo para diagonals, incrementando fila y columna. Y por último, para la diagonal inversa, incrementando la columnay restando a la fila.

En pseudo codigo

Código Javascript:
Ver original
  1. for (fila=0;fila<7;fila++)
  2. {
  3.     for(columna=0;columna<7;columna++)
  4.     {
  5.         //Bucle para comprobar filas
  6.         aciertos=0;
  7.         for (casilla=0;casilla<2 || columna+casilla<7;casilla++)
  8.        {
  9.             if tablero[fila,columna+casilla]==1  aciertos++;
  10.        }
  11.        if aciertos==3
  12.       {
  13.             for (casilla=0;casilla<2;casilla++)
  14.             {
  15.                  tablero[fila,columna+casilla]==0;
  16.              }
  17.       }
  18.       aciertos=0;
  19.       //Bucle para columnas, curratelo
  20.       //Bucle para diagonal izquierda-derecha, curratelo
  21.       //Bucle para diagonal derecha-izquierda, curratelo
  22.     }
  23. }
No lo he probado, te lo digo desde la ignorancia de lo testearlo; pero: ¿cuenta o comprueba que estan en línea?

Me refiero:

0001110 -> Una fila
1010101 -> No hay fila.

¿Lo comprueba?

Otra cosa: para diagonales no funcionaría, ¿verdad?

Muchas gracias!!
  #6 (permalink)  
Antiguo 20/11/2013, 06:57
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Reto de programación

Coge un lápiz, un papel, y ejecútalo a mano. Y sí, bien programado sirve para todo.
PD. Dije que la diagonal inversa es incrementando la columna y restando la fila. Es al revés, incrementando la fila y restando a la columna.

Etiquetas: html, js, reto
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 01:55.