Ejercicio Extra de Repaso

Introducción

La idea de este ejercicio extra es aprender a trabajar con archivos externos y a la vez repasar conceptos que debiesen tener claros a esta altura del semestre, en particular, los objetivos son:

El puzzle de las N-piezas

Para explicar este juego, explicaremos un caso particular, donde N es igual 15 (Hay 15 piezas). El juego de las 15 piezas consiste en un tablero con 15 piezas cuadradas numeradas del 1 al 15 y un espacio libre. La idea es ir moviendo las piezas para dejarlas ordenadas de forma ascendente, como se muestra en la siguiente figura:

Para mover las piezas, estas deben deslizarse hacia el espacio libre. La figura anterior, muestra una configuración del puzzle donde el juego ha terminado (configuración objetivo), sin embargo, debe notarse que por ejemplo, las piezas 12 y 15 pueden moverse hacia abajoo o hacia la derecha respectivamente.

La configuración inicial del puzzle puede ser variada, pero para este problema, asumiremos que el puzzle inicialmente se encuentra con las piezas ordenadas en forma descendente, desde el valor máximo hasta el mínimo, y el espacio vacío se encuentra al fondo a la derecha. Sin embargo, si las dimensiones del tablero son un número par (por ejemplo tablero de 4x4) las posiciones de las piezas 1 y 2 deben ser intercambiadas, como se muestra en la siguiente figura (Esto es debido a que el puzzle puede ser resuelto en este tipo de configuración).

Descargue ahora el siguiente proyecto codeblocks haciendo click aquí

En el proyecto que ud. descargó, vienen 3 ficheros, utils.h, utils.c, y main.c. Ud. no deberá tocar nada de utils.h ni utils.c, pero revisar el código puede ser buena idea. Básicamente están implementadas funciones para recibir inputs de usuarios (enteros, strings, floats), evitando los problemas que tiene utilizar la función scanf (Por ejemplo se maneja el error de ingresar un caracter, cuando se pide leer un entero). El código que ud. tendrá que completar, se encuentra en main.c. Éste código contiene básicamente un esqueleto del puzzle de las N piezas, el cual no está completamente funcional, por lo que no se puede jugar; ¡Ahí es donde entra ud. a programar lo que falta! jeje.

Mini-Cuestionario

Antes de ponerse a programar, examine el código e intente responder las siguientes preguntas

  1. Comentamos que se puede jugar un puzzle de 4x4. Aparte de estas dimensiones, qué otras dimensiones permite el programa como está?
  2. ¿En qué tipo de estructura de datos está representado el tablero?
  3. ¿Qué función se llama cuando se saluda al usuario al iniciar el juego?
  4. ¿Cuáles son las funciones que ud. debe implementar?

Algunos consejos

Intente hacer todo paso a paso. Se sugiere implementar las funciones en el siguiente orden: init, draw, move, won. Cualquier otra decisión de diseño (por ejemplo cómo mostrar el tablero) queda a su criterio. Por ejemplo, ud. podría escoger mostrar el tablero de la siguiente forma:



O si es de 4x4:

Notar como el 1 y el 2 están cambiados de orden en la configuración inicial dependiendo de si el n, de nxn es para o impar.

Finalmente, cuando tenga su implementación funcional, puede testear con puzzles de 3x3 y 4x4 utilizando piping y los archivos en la carpeta debug:

n_puzzle 3 < 3x3.txt

n_puzzle 4 < 4x4.txt

Ejecutando mediante comando de linea lo anterior, ud. debería ver cómo el puzzle se resuelve hasta llegar a la configuración que gana el juego. Cualquier duda o pregunta, me pueden contactar a dipalma@udec.cl. ¡Suerte!