Rompecabezas

download Rompecabezas

If you can't read please download the document

Transcript of Rompecabezas

Universidad Simn Bolvar Departamento de Computacin y T.I. CI2615 Algoritmos y Estructuras I Septiembre Diciembre 2001

Proyecto Rompecabezas1. Planteamiento del problema. El rompecabezas es una figura dividida en piezas que debe ensamblarse. Se trata de un tablero de MxN casillas y (MxN)-1 fichas que pueden deslizarse horizontal y verticalmente hacia el espacio vaco restante. Por ejemplo:

Donde el rectngulo en negro representa la casilla vaca. El mecanismo es el siguiente: dado un tablero desordenado, mover las fichas hasta encontrar un patrn prestablecido, con la restriccin de que el nico tipo de movimiento permitido es el desplazamiento hacia la casilla vaca de una de las fichas adyacentes a la misma, excluyendo las diagonales. Sin embargo, podrn realizarse simultneamente varios de estos movimientos, siempre que el grupo de fichas a desplazar pertenezca a la misma fila o (exclusivo) columna de la casilla vaca, por ejemplo:

El tamao del patrn puede ser menor que el del tablero, por lo que su ubicacin en el mismo puede variar. Dado el patrn (a), en los estados (b) y (c) ya se ha armado el rompecabezas:

1

a)

b)

c)

Se desea que usted disee e implemente un programa en JAVA que permita armar un rompecabezas. El programa debe tener la siguiente funcionalidad: 1. Al comenzar, debe preguntar el nombre del jugador y el patrn que desea armar (Puede tenerse un conjunto de patrones para armar y se leen del disco). 2. Debe permitir armar varios rompecabezas consecutivamente, con estados iniciales aleatorios. 3. El jugador puede decidir abandonar el juego en cualquier momento. 4. El tablero debe desplegarse en modo grfico. Las fichas estarn representadas por crculos de colores. 5. Cuando el patrn es encontrado, resaltarlo en el tablero y felicitar al jugador.

2. Solucin generalEl proyecto involucra dos componentes: uno de lgica y uno de interfaz. Comenzamos con el componente lgico. Lo primero que debemos hacer es tener una visin general de la solucin. Podemos aplicar anlisis descendente para obtener una primera versin: do se desea armar un nuevo rompecabezas obtener patrn y tablero inicial; do patrn no detectado y jugador no abandona obtener jugada, donde jugada es abandonar o dar un movimiento; if movimiento es vlido mover ficha(s) movimiento no es valido y jugador decidi no abandonar dar mensaje de error jugador decidi abandonar skip fi od if Patrn detectado felicitar y resaltar jugador decidi abandonar skip fi od 2

3. Estructuras de datosUn tablero podemos considerarlo como un arreglo de arreglos o arreglo bidimensional de colores. Cada casilla estar representada por un elemento del arreglo y contendr el color correspondiente a la ficha que la ocupa (El negro representa la casilla vaca). Al momento de especificar un procedimiento o funcin que reciba como parmetro un arreglo representando un tablero, se incluirn dos parmetros adicionales, que indicarn el nmero de filas y columnas del arreglo. Los patrones para armar estarn representados por arreglos bidimensionales tales que:

# Filas _ Patron # Filas _ Tablero # Columnas _ Patron # Columnas _ Tablero Un movimiento est representado por las coordenadas fila y columna de la ficha que se va a desplazar hacia la casilla vaca. En el caso de un movimiento mltiple se indican fila y columna de la ficha mas alejada a mover hacia la casilla vaca.

4. Sub-problema de verificar si un movimiento es vlido.Un sub-problema derivado del anlisis descendente es el de determinar si un movimiento suministrado por el usuario es vlido. La forma de la funcin de validacin es la siguientebooleano func esValido (entrada vaciaX, vaciaY, fila, columna : entero) { Pre: ...PreEsValido...} { Post: ...PostEsValido...}

donde vaciaX y vaciaY indican las coordenadas de la posicin actual de la ficha vaca y fila, columna las coordenadas de la ficha que indica la movida, como fue especificado en el aparte 3.

5. Sub-problema de verificar si se ha armado el patrn.Segn la descripcin del problema, el objetivo se logra cuando se ensambla el patrn dado en algn sitio del tablero. Para verificarlo, se deben examinar todas las submatrices del tablero que son de tamao igual al patrn buscado. El problema puede descomponerse de la siguiente manera: compararArea - una funcin booleana que devuelve verdadero si el rea examinada se corresponde con el patrn buscado y el procedimiento detectarPatron - que desplaza el chequeo por todo el tablero, donde rea es una submatriz del tablero del tamao del patrn. Ambas acciones deben trabajar conjuntamente, de tal manera que el procedimiento detectarPatron, indique si el patrn se encuentra en algn sitio del tablero actual y si ese es el caso, nos suministre las coordenadas del mismo. Este tiene la siguiente forma:

3

booleano proc detectarPatron (entrada tablero : arreglo de arreglos de colores; entrada M, N: entero; entrada patron: arreglo de arreglos de colores, entrada Q, R: entero, salida esta: booleano, salida posX, posY: entero) { Pre: ...PreDetectarP...} { Post: ...PostDetectarP...}

donde, esta es una variable que indica el estado de la deteccin y posX, posY las coordenadas de la esquina superior izquierda del patrn encontrado cuando la variable esta es verdadero. Se sugiere implementar este procedimiento como una funcin cuyo valor de retorno corresponda al parmetro esta y que posX y posY se implementen mediante un parmetro de entrada-salida de tipo arreglo de tamao 2. El procedimiento detectarPatron como fue descrito anteriormente es ineficiente. Si se analiza mejor el problema y se usan sus caractersticas particulares, podemos introducir optimizaciones que mejoren sustancialmente su eficiencia. Se sugiere que piense al respecto y trate de plantear sus propias mejoras. Posiblemente no siempre sea necesario recorrer todo el tablero para encontrar el patrn.

6. Sub-problema de mover una ficha.La solucin a este sub-problema, realizarMovimiento actualiza la estructura de datos del tablero. A su vez, realizarMovimiento se puede apoyar en los procedimientos: moverAbajo, moverArriba, moverDerecha, moverIzquierda segn se requiera desplazar la(s) ficha(s) indicadas por el usuario hacia abajo, arriba etc.proc realizarMovimiento (entrada-salida tablero : arreglo de arreglos de colores; entrada M, N: entero; entrada fila, columna, vaciaX, vaciaY: entero) { Pre: ...PreRealizarM...} { Post: ...PostRealizarM...} proc mover??? (entrada-salida tablero : arreglo de arreglos de colores; entrada M, N: entero; entrada fila, columna, vaciaX, vaciaY: entero) { Pre: ...PreMover?...} { Post: ...Post Mover?...}

7. El juegoCon los sub-problemas hasta ahora definidos, podemos completar el conjunto de instrucciones necesarias para realizar varias sesiones de juego :

4

[ var tablero : arreglo de arreglos de colores; M, N, fila, columna: entero; patron : arreglo de arreglos de colores; Q, R: entero; abandona: booleano; detectado: booleano; otro: booleano; otro := verdad; do otro tomar patron y tablero inicial; dibujar tablero inicial; detectado := detectarPatron(tablero, M, N, patron, Q, R, fila, columna, esta, posX, posY); abandona := falso; do detectado abandona solicitar al usuario su prxima jugada, donde jugada es abandonar o dar un movimiento y, de acuerdo con esto, dar valores a fila, columna y abandona; if esValido(vaciaX, vaciaY, fila, columna) realizarMovimiento(tablero, M, N, fila, columna, vaciaX, vaciaY) dibujar el movimiento; detectado := detectarPatron(tablero, M, N, patron, Q, R, fila, columna, esta, posX, posY); esValido(vaciaX, vaciaY, fila, columna) dar mensaje de error abandona skip fi odif detectado felicitar y resaltar abandona skip fi preguntar al usuario si quiere armar otro rompecabezas y almacenar respuesta en otro; od ] 8. La interfaz

Con las actividades anteriores hemos diseado un programa que captura la parte lgica o de clculo del problema del Rompecabezas. Necesitamos ahora instrucciones que manejen la parte de interfaz. En esta parte introduciremos los elementos de interfaz requeridos, para que el programa pueda ser utilizado efectivamente.

5

Para facilitar la programacin vamos a limitar las operaciones de entrada de informacin por teclado en modo texto. Para el despliegue de informacin utilizaremos dos modos de manera conjunta: modo texto y modo grfico. Repasando los requerimientos del programa, vemos que inicialmente el programa debe solicitar del jugador su nombre y el rompecabezas escogido. Esto lo podemos hacer usando instrucciones provistas por el lenguaje para tal fin y almacenar los nombres en dos variables NombreJugador y NombreRompecabezas de tipo secuencia de caracteres. Luego, cada vez que se requiera, se puede desplegar un mensaje como: Por favor , introduzca un movimiento: Anlogamente se puede hacer para el rompecabezas. Tambin podramos dar mensajes en caso de que una jugada no sea vlida. Al final de cada sesin, se puede utilizar el nombre del jugador para preguntar si se desea jugar de nuevo. Para la salida grfica del programa se utilizar la Maquina de Trazados, con la que es posible dibujar las diferentes figuras geomtricas requeridas por el programa. El primer procedimiento necesario es dibujarTablero , que dibuja un tablero vaco para colocar el rompecabezas. El tamao del tablero puede establecerse a conveniencia. Tiene la siguiente forma:proc dibujarTablero(entrada-salida mt: Maquina de trazados; entrada tablero : arreglo de arreglos de colores; entrada M, N: entero)

Requerimos adems obtener del usuario el movimiento que desea realizar, incluida la posibilidad de abandonar. El procedimiento correspondiente tendr la siguiente forma:proc obtenerMovimiento(salida abandona: booleano; salida fila, columna: entero)

Cada vez que se realice un movimiento, hay que actualizar el tablero. El procedimiento correspondiente es como sigue:proc dibujarMovimiento(entrada-salida mt: Maquina de trazados; entrada tablero : arreglo de arreglos de colores; entrada M, N, fila, columna, vaciaX, vaciaY: entero)

Finalmente, necesitamos preguntar al usuario si desea armar un nuevo rompecabezas, y si ese es el caso, preguntarle el nombre del patrn que desea armar. El procedimiento podemos declararlo de la siguiente manera:proc otraSesion(salida otro: booleano; salida nombrePatron: secuencia de caracteres)

6

Para implementar los procedimientos con varias variables de salida, se recomienda seguir la sugerencia indicada en el aparte 5 para detectarPatron. A continuacin la versin final de nuestra solucin incluyendo los procedimientos de interfaz: [ var tablero : arreglo de arreglos de colores; M, N, fila, columna: entero; patron : arreglo de arreglos de colores; Q, R: entero; mt: MaquinaTrazados; abandona: booleano; detectado: booleano; otro: booleano; otro := verdad; do otro tomar patron y tablero inicial; dibujarTablero(mt, tablero, M, N); detectado := detectarPatron(tablero, M, N, patron, Q, R, fila, columna, esta, posX, posY); abandona := falso; do detectado abandona obtenerMovimiento(abandona, fila, columna); if esValido(vaciaX, vaciaY, fila, columna) realizarMovimiento(tablero, M, N, fila, columna, vaciaX, vaciaY) dibujarMovimiento(mt, tablero, M, N, fila, columna, vaciaX, vaciaY); detectado := detectarPatron(tablero, M, N, patron, Q, R, fila, columna, esta, posX, posY) esValido(vaciaX, vaciaY, fila, columna) dar mensaje de error abandona skip fi odif detectado felicitar y resaltar abandona skip fi

otro := otraSesion(otro, nombrePatron); od ]

7

9. Material de apoyo

Se proveern dos clases: una para leer un patrn desde el disco y otra para generar un estado aleatorio inicial para el tablero. Estas estn disponibles en la pagina web del curso junto a su documentacin en Clases de soporte del proyecto y una gua de documentacin de programas en Documentacin en Java.10. Entregas Primera entrega

a) Traduccin a Java del programa de la seccin 8, utilizando procedimientos y funciones dummy o stubs, los cuales simplemente retornan un valor arbitrario del tipo correcto o un mensaje indicando la operacin que realizan, para probar el flujo de control de un programa principal. Este programa debe mostrar el tablero inicial. b) Especificacin formal (incluidos los invariantes), cuerpo del procedimiento y prueba de correctitud para uno de los procedimientos Mover???.Segunda entrega

a) Traduccin a Java de los procedimientos realizarMovimiento y dibujarMovimiento. b) Especificacin formal (incluidos los invariantes) y cuerpo del procedimiento para compararArea.Entrega final

Para el da de la revisin usted deber llevar una versin operativa del programa en JAVA que permita armar rompecabezas segn las especificaciones indicadas en el planteamiento del problema. Es importante que el equipo trabaje de manera integrada. Durante la revisin se verificar el funcionamiento del programa y se har un corto interrogatorio particular a ambos miembros del equipo. La versin operativa del programa deber ser entregada al profesor en un disquete debidamente identificado. Adems, deber entregar un informe que describa en detalle todo el proceso de diseo y desarrollo de la solucin. El informe no se debe limitar a reportar las actividades indicadas en este enunciado; las actividades deben servir de gua para elaborar el informe. En este sentido, se quiere que se entregue un informe que contenga las siguientes secciones:

Portada. Una hoja que contenga: o Arriba a la izquierda el nombre de la universidad, carrera y materia. o Centrado: nombre del proyecto. o Abajo a la izquierda: nombre del profesor de laboratorio. o Abajo a la derecha: nombre y carnet de los integrantes del equipo 8

Introduccin: o Breve descripcin del problema atacado en el proyecto. o Motivacin. o Objetivos planteados. o Alcance de la solucin. o Contenido del informe. Diseo: o Resultado del anlisis descendente del problema. o Especificacin y desarrollo de los programas, procedimientos y funciones. o Demostraciones de correctitud. o Optimizaciones. Detalles de implementacion. o Tipos de datos. o Estructuracin del cdigo. o Cualquier comentario adicional referente a la traduccin de los programas a JAVA. Estado actual. o Operatividad del programa: decir si funciona perfectamente o no. En caso negativo, describir las anomalas. o Manual de operacin: nombre del archivo a ejecutar y modo de operar el programa. Conclusiones. o Resultados obtenidos. o Experiencias adquiridas. o Dificultades presentadas. o Recomendaciones. Bibliografa. Libros, revistas o cualquier recurso bibliogrfico consultado. Una referencia bibliogrfica debe incluir la siguiente informacin: o Libro: autor(es), nombre, editorial y ao. o Artculo: autor(es), nombre, revista, volumen, nmero y ao. o Pgina Web: autor(es), nombre, url, fecha ltima visita. Los siguientes son ejemplos de referencias bibliogrficas:

Libro: Blair, D.: Language and Representation in Information Retrieval. Elsevier Science Publisher, 1990. Revista: Isaacson, M.: What is SMDI?, Electronic Musician 9(6). p.79-82 Pgina Web: Sun Microsystems: The Java Tutorial. http://java.sun.com. Noviembre 2000.

9

Al inicio de la clase de la semana 12, usted deber entregar en un sobre sellado y debidamente identificado (nombre y carnet de los integrantes del equipo y nombre del proyecto):

Un disquete debidamente identificado(nombre y carnet de los integrantes del equipo y nombre del proyecto) que contenga en el directorio raz los archivos .java de su proyecto (incluyendo la maquina de trazados y clase Console). El disquete debe estar libre de defectos fsicos y de virus. En caso de que el disquete no tenga la informacin requerida o presente algn tipo de defecto se asignar una nota de cero (0) a la revisin de la corrida. Un informe segn la estructura sugerida anteriormente. El listado del programa debidamente documentado.

Los sobres debern ser entregados a la 1:30pm en punto en el laboratorio de clases. No se recibirn proyectos despus de la 1:30pm.

10