Tag: juego

El reto de la rana

Kaeru Jump, del japonés kaeru (蛙, rana), es un pequeño juego en flash de inteligencia (o también de probar, probar y probar). El objetivo del juego es que la rana protagonista llegue a cada una de las piedras del escenario. A cada salto, la piedra anterior se hunde en el agua. Los saltos son sólo en ángulos rectos y no se puede saltar hacia atrás.

El reto son diez niveles generados aleatoriamente, a cada cual más difícil. Os reto a ver cuánto tiempo tardáis en acabarlos todos, sin hacer trampas claro.

Solución

Si no consiguieseis acabar todos los niveles, no os desesperéis ni lancéis el teclado por la ventana. Existe un método para resolver este tipo de problemas. En programación se le llama backtracking. Aunque por el nombre parezca algo guapo, no es más que ir probando combinaciones hasta encontrar las que resuelvan el problema (en nuestro caso paramos al encontrar la primera que lo resuelva). Son muchas combinaciones, pero mientras las haga el ordenador a nosotros nos da igual, ¿no?

Para hacerlo funcionar, sólo tenéis que decir la posición inicial, la dirección a la que mira la rana y marcar los checkbox del mapa del nivel, si está marcado es que en el mapa hay una piedra en esa posición. ¡Si leéis desde el lector RSS es probable que no veáis nada!

Fila inicial: Columna inicial: Dirección inicial:

El código

Os pongo la función para calcular la solución en javascript. Se puede comprimir más el código, pero así se entiende mejor. Para llamarla, necesitáis la fila y la columna inicial(f y c), una matriz de booleanos para el tablero donde un true indica que hay una piedra en esa posición, un Array vacío para guardar el camino en la recursividad y un string direccion para la dirección inicial, que puede ser “arriba”, “derecha”, “abajo” o “izquierda”. El resultado es un Array con dos posiciones: la primera indica si hay solución y la segunda indica el camino.

function resolver(f, c, tablero, restantes, camino, direccion) {
    if(restantes == 1) return new Array(true, camino);
    var resuelto = false;
   
    // Miro todas las direcciones desde la posición actual
    // Arriba
    if(direccion != "abajo") {
        var hay = false;
        for(fila = f - 1; !hay && fila >= 0; --fila) {
            if(tablero[fila][c]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Arriba");
                resultado = resolver(fila, c, tablero, restantes, camino, "arriba");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
   
    // Derecha
    if(direccion != "izquierda") {
        var hay = false;
        for(columna= c + 1; !hay && columna < columnas; ++columna) {
            if(tablero[f][columna]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Derecha");
                resultado = resolver(f, columna, tablero, restantes, camino, "derecha");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
   
    // Abajo
    if(direccion != "arriba") {
        var hay = false;;
        for(fila = f + 1; !hay && fila < filas; ++fila) {
            if(tablero[fila][c]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Abajo");
                resultado = resolver(fila, c, tablero, restantes, camino, "abajo");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
   
    // Izquierda
    if(direccion != "derecha") {
        var hay = false;;
        for(columna= c - 1; !hay && columna >= 0; --columna) {
            if(tablero[f][columna]) {
                hay = true;
                tablero[f][c] = false;
                --restantes;
                camino.push("Izquierda");
                resultado = resolver(f, columna, tablero, restantes, camino, "izquierda");
                if(resultado[0]) return new Array(true, camino);
                else {
                    ++restantes;
                    tablero[f][c] = true;
                    camino.pop();
                }
            }
        }
    }
    return new Array(false);
}

También te puede interesar...

Tags , , , ,

El problema de la balsa

RiverIQGame es un juego de lógica en flash en el que hay que conseguir que una familia, un policía y un ladrona crucen a la otra orilla de un río utilizando una balsa. Parece ser que se utiliza como test laboral en Japón. Vamos con las normas.

  • Sólo pueden manejar la barca el padre, la madre y el policía (con dos hijos la balsa no se mueve).
  • Máximo de dos personas en la balsa.
  • La ladrona no puede estar con nadie de la familia si no está el policía
  • El padre no puede estar con alguna de sus hijas si no está la madre
  • La madre no puede estar con alguno de sus hijos si no está el padre

Nota: Para empezar el juego tenéis que hacer clic en el círculo azul, abajo a la derecha.

A mí me costó un rato pasarlo, me quedaba atrapado con 4 personas en la otra orilla y 3 en la primera.

8/2/09: Se me olvidaba decir que para que se suban a la balsa hay pulsar encima de la persona, y para que la balsa vaya de un lado al otro del río hay que hacer clic en la palanca roja.

Esto es lo que sale cuando acabasEl juego del río

Para los desesperados, mandarme un correo a kamugo@okashini.com y os responderé encantados.

Enlaces relacionados:

También te puede interesar...

Tags , ,

Powder, el simulador de partículas

Powder es un simulador de partículas donde podemos elegir materiales (partículas) que interactuarán entre sí, como puede ser agua y hielo, donde el agua se irá congelando, o fuego y nitroglicerina. Uno de los factores especiales de este simulador, que lo distingue de otros similares, es la presión atmosférica y las corrientes de aire.

Para jugar sólo se necesita tener instalado Java y un navegador web. En la web del creador se pueden encontrar otros juegos o simuladores interesantes como Earth Editor, que simula la gravedad de la tierra, Liquid webtoy, que simula el comportamiento de líquidos o Planet simulator con el que podrás jugar con el comportamiento de planetas y asteroides.

También te puede interesar...

Tags , , , , , ,