N-Puzzle

Hace unos días mandé a la lista de correos de PyAr una implementación inicial del juego N-Puzzle. n-puzzle-0.1.tgz.

Es muy sencilla. Toma una imagen, la parte en cuadraditos, quita uno de los cuadraditos y los mezcla. Luego uno puedo deslizar los cuadraditos adyasentes al espacio en blanco con las flechas de teclado. El objetivo del juego es recomponer la imagen original.

N Puzzle 0.01
Hoy estuve mejorando el código y agregándole una funcionalidad que permite que la computadora resuelva el problema (o nos ayude a hacerlo).La idea original para este programa es luego utilizarlo para probar los métodos de búsqueda que estamos estudiando en Inteligencia Artificial.

Ojo! Si bien en esta nueva versión apretando la tecla ‘S’ entramos y salimos del modo Auto Solve, no estoy usando IA para implementarlo. Siempre pueden mirar el código y ver como lo estoy haciendo :)

Actualmente el juego está planteado como una prueba de concepto más que como un programa totalmente usable. Esto implica que pueden ocurrir errores durante su ejecución y que algunas opciones que podrían ser configurables están clavadas en el código:

  • N es el número de fichas que participan del juego: 8 (en un tablero de 3 x 3), 15 (en uno de 4 x 4), 24 (en uno de 5 x 5). Por defecto es 8 pero puede cambiarse en el archivo run.py.
  • La imagen que se usará para generar las fichas se llama ejemplo.jpg y debe estar en el mismo directorio que los scripts (yo proveo una). Pueden pisarla con otra imagen o pueden cambiar la ruta a la misma en el archivo run.py. La imagen debe ser de 600 x 600 pixeles.
  • El desordenamiento original del tablero se efectua mediante un número X de movimientos. En el código fuente el valor usado es 20 pero puede cambiarse en el método __init__ de la clase Puzzle en el archivo puzzle.py (van a encontrarlo en la llamada al método _shuffle).

El puzzle resuelto se ve así:

N Puzzle solved
La última versión puede encontrarse en: files/python/n-puzzle-0.1-1.tgz.Y este es el CHANGELOG de mi primer intento a este segundo mejorado:

0.1-1:

mix(x,y) se realiza ahroa como x,y = y,x en lugar de usar
una variable temporal.

Cada Card tiene un cid (Card ID), un par i,j correspondiente
a su posición original en el tablero.

El desordenado del tablero se realiza mediante el movimiento
aleatorio de las piezas (usando los métodos up, down, right
y left) para evitar que el juego comience con una configuración
que no tiene solución (Para un ejemplo, Google: 14-15 Puzzle).

Apretando la tecla ‘S’ se entra y sale del modo ‘Auto Solve’ en
el cual la computadora nos ayuda a resolver el juego. Atención:
NO IA was used in this feature.

Requiere Python y PyGame. Si tienen problemas para instalarlos mandenme un mail y los ayudo.

About Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar. Como hobby escribí un libro de cuentos que se puede descargar gratuitamente.
This entry was posted in Aprendiendo Python, PyGame and tagged . Bookmark the permalink.
  • Juanjo

    De Inteligencia Artificial, un enfoque moderno (Russell y Norvig) en un capítulo sobre búsqueda:

    El 8-puzle pertenece a la familia de los puzles de piezas deslizantes,
    los cuales a menudo se usan como problemas test para los nuevos
    algoritmos de IA. Esta clase general se conoce por ser NP completa, así
    que no esperamos encontrar métodos perceptiblemente mejores (en el caso
    peor) que los algoritmos de búsqueda descritos en este capítulo y en el
    siguiente. EL 8-puzle tiene 9!/2 = 181440 estados alcanzables y se
    resuelve fácilmente. El 15-puzle (sobre un tablero de 4 * 4) tiene
    alrededor de 1.3 trillones de estados, configuraciones aleatorias pueden
    resolverse óptimamente en pocos milisegundos por los mejores algoritmos
    de búsqueda. 24-puzle (sobre un tablero de 5 x 5) tiene al rededor de
    10^25 estados, y configuraciones aleatorias siguen siendo absolutamente
    difíciles de resolver de manera óptima con las computadoras y algoritmos
    actuales.

  • un inutil

    cumpa, tuve problemas. me larga un error en la linea 22 de run.py, what’s wrong?

    tin@morocha:~/juegos/n-puzzle$ ./run.py
    from: can’t read /var/mail/pygame.locals
    from: can’t read /var/mail/puzzle
    ./run.py: line 22: error de sintaxis cerca de token no esperado `(‘
    ./run.py: line 22: `def main():’

  • un inutil

    uy, perdon. con $python run.py arrancó bien.

  • Juanjo

    SI! Fijate que el script run.py no indica en su primer línea con que programa debe ser interpretado, entonces cuando hiciste ./run.py tu interprete de comandos (casi seguro bash) intentó interpretarlo él mismo. Obtuviste un error de sintaxis por que la sintaxis de python es diferente a la de bash.

  • Ricardo_M

    Juanjo, en primer lugar te saludo, mi nombre es ricardo y soy de chile, te escribo por lo siguiente, debo realizar un trabajo de investigacion para la universidad el cual consiste en investigar algun algortimo propuesto para solucionar el problema del 15 puzzle, te agradeceria de antemano si pudireas enviarme algun link o info sobre algun algoritmo para proponer, agradeciendo tu pronta respuesta me despido

  • Juanjo

    Ricardo, podés usar un algoritmo de búsqueda como los descriptos en el libro Inteligencia Artificial, un enfoque moderno, de Russell y Norvig.

    En el libro se usa el problema como ejemplo e incluso se plantean 2 heurísticas para utilizar con algoritmos de búsqueda informados como Avara o A*.

  • NecroimiX

    ya descargue el archivo adjunto, pero no se como compilarlos. Una ayuda por favor, que me recomendarías..?

  • NecroimiX

    ya descargue el archivo adjunto, pero no se como compilarlos. Una ayuda por favor, que me recomendarías..?

  • NecroimiX

    ya descargue el archivo adjunto, pero no se como compilarlos. Una ayuda por favor, que me recomendarías..?