El fondo
A mi hijo Leonhard (4 años) le encantan los laberintos. No sé de dónde conoce los laberintos, pero los pinta y sabe muy bien cómo funcionan:
Recientemente, comenzó a hacer un juego con sus pinturas. Estas son sus reglas:
- un cuadrado negro denota el punto de partida.
- un gancho denota la salida del laberinto (ahí es donde te sacan).
- Puedes recoger coronas.
- puedes recoger pepitas de oro (las cosas redondas).
- puedes ir y venir, pero no más que eso.
- Las flechas pueden guiarlo hacia la salida. (Si él pinta un laberinto para que yo lo resuelva, a menudo son engañosos).
Versión anotada:
- azul: punto de partida
- naranja: coronas
- amarillo: área con pepitas de oro
- verde: gancho (salida)
- rosa: flechas (en su mayoría engañosas)
La tarea
Tal vez usted sepa, a la edad de 4 años, los niños comienzan a decir pasteles de puerco ya veces no sigue sus propias reglas, especialmente si descubre que ya no puede llegar al final del laberinto.
Ahí es donde entras en juego: dado que estoy buscando juegos para niños de todos modos, conviertes su idea en un juego donde no es posible hacer trampa.
Bueno, necesitamos algunas definiciones más, diría:
- el campo de juego es un
n
*m
rectángulo de cuadrados de igual tamaño. - un cuadrado puede tener de 0 a 4 paredes, una a cada lado.
- una corona vale 50 puntos.
- una pepita de oro vale 20 puntos.
- caminar en una plaza que ya se ha recorrido resta 1 punto.
- los cuadrados se marcan de manera que se identifique con qué frecuencia el jugador caminó sobre él (0, 1 o 2 veces)
- El jugador puede caminar en 4 direcciones, excepto si hay una pared.
- El dispositivo de entrada puede ser cualquier cosa. Por favor, considere la compatibilidad con el teclado.
- El laberinto debe ser solucionable. Es decir, debe ser posible alcanzar el anzuelo desde el punto de partida y debe ser posible recolectar todos los objetos de valor (incluso si eso no resulta en el puntaje más alto posible).
- Si el jugador se atasca, el juego termina.
- El jugador no debe morir al caerse del tablero. Puedes poner una pared alrededor del laberinto completo o envolver los bordes, lo que quieras.
- el programa toma un argumento de palabra (0-65535) como entrada. Esta es la semilla del generador de números aleatorios. Llamar al programa con la misma semilla nuevamente da como resultado el mismo laberinto.
Prima:
- calcule los puntos máximos que se pueden acumular. Considere que debido a -1 puntos, podría ser mejor no recolectar todos los artículos.
- Mostrar la mejor solución (la forma más corta de obtener el máximo de puntos)
Las normas
Este es un concurso de popularidad, ya que quiero poder leer y comprender el código y quizás adaptarme a las nuevas ideas de mi hijo. Lo sentimos, codifiquen a los golfistas, tal vez quieran crear una copia de esta pregunta con reglas más adecuadas para el golf, por ejemplo, una versión de consola con todos los caracteres definidos.
El juego más popular el 3 de mayo se convertirá en la respuesta aceptada. Y, oye, ¿por qué no publicarlo en una tienda de aplicaciones?
fuente
Respuestas:
JavaScript
Trabajo en progreso. Desafortunadamente, el laberinto no siempre es solucionable: el límite en retroceso es el verdadero obstáculo.
Edit 1 Cosmetic
Edit 2 Mejor jugabilidad, pero el gran problema sigue ahí
fuente
Java
Nunca me quejé de GolfScript o CJam, pero de todos modos aquí hay una respuesta de Java para usted. Este fue un desafío realmente agradable. ;)
El proceso de creación del laberinto real utiliza el algoritmo de búsqueda de profundidad primero , pero con un enfoque iterativo. Así es como funciona.
Comenzamos con una matriz 2D de
int
valores, cada elemento es un -1. Se elige un elemento aleatorio con índices pares, y su valor se convierte en 0:Luego, el programa entra en un bucle, buscando celdas disponibles hasta que alcanza un estado en el que no hay celdas disponibles. Esto puede suceder varias veces y es cuando comienza a retroceder. En este momento, todos los 0 que se encuentran se convierten en 1. También durante este tiempo es cuando determina si se debe colocar una salida en esa ubicación. Entonces, al final de todo, la matriz podría verse así:
Cuando hay un número predeterminado de 1s o 0s en ciertos puntos de la matriz, el ciclo sale. Luego, usando la matriz, se dibuja el laberinto resultante:
Es fácil ver que los -1 en la matriz representan paredes, y los 0 y 1 son corredores. Los artículos se distribuyen al azar en todo el laberinto. La elipse roja es el "jugador" que controlas.
El laberinto está envuelto en un panel de desplazamiento para mayor comodidad, de modo que si el tamaño excede el tamaño máximo del marco, puede desplazarse para ver el resto del laberinto.
Yo diría que el único problema con esto es cómo se lleva a cabo el final del juego. Pensé en varias maneras de hacerlo, pero terminé recurriendo a codificarlo todo. Estoy abierto a sugerencias sobre cómo se puede hacer.
fuente
MazeMaker.java:168: error: cannot find symbol printArray(); ^ symbol: method printArray() location: class MazeMaker
printArray
que usé para generar la matriz, pero lo eliminé y olvidé eliminar la llamada al método.Pitón
Me doy cuenta de que llego tarde a la fiesta, pero aquí está mi opinión sobre este desafío. Fui basado en mensajes de texto, ya que todavía no he podido aprender Pygame. Es Python 3. Cambie la entrada a raw_input y también debería funcionar en python2.
El gancho (salida) está representado por "J". "W" es coronas (50). "G" son pepitas de oro (20). El jugador es "O". Experimenté con el uso de "P" para el jugador, pero encontré que "O" es más fácil de identificar.
Utilicé la primera generación de laberintos de profundidad estándar, luego agregué el oro, las coronas, el gancho y la posición actual del jugador. No implementé el criterio de que se pueda obtener todo el tesoro.
fuente