Programación I Práctica final: el juego del pinball (Septiembre) (ENTREGA OBLIGATORIA) El objetivo de esta práctica es implementar un juego de pinball con ciertas variantes respecto de la práctica de Diciembre. En esta nueva práctica, el escenario sigue siendo una matriz de 20x20. Sigue habiendo líneas y simulaciones que se deberán leer de unos ficheros que después se explican. Y también hay resultados y estadísticas que se escribirán en un fichero. Sin embargo, hay algunas diferencias que se resumen a continuación y se describen más adelante. Esta vez, en los ficheros de entrada, la posición de cada línea se indica mediante las coordenadas (fila y columna) de sus dos extremos. De esta manera, a partir de las coordenadas, podéis deducir si se trata de una línea vertical, horizontal, diagonal desde abajoizquierda hasta arriba-derecha o diagonal desde abajo-derecha hasta arriba-izquierda. Además se introducen puertas de tele-transportación en el escenario. Una puerta de teletransportación se compone de dos puntos (uno de entrada y otro de salida) en el espacio bidimensional del juego. Cuando la bola cae en el punto de entrada de una puerta, es teletransportada al punto de salida de la misma puerta. Nótese que debe tenerse en cuenta que el paso por una puerta conlleva únicamente dos pasos (uno para el punto de entrada y otro para el punto de salida), es decir, en el cómputo de pasos que hace la pelota, no se cuentan las casillas que separan los puntos de entrada y de salida de la puerta. Después de atravesar una puerta, la pelota conserva su movimiento inicial. Por ejemplo, si una pelota con movimiento hacia la izquierda cae en una puerta, seguirá teniendo un movimiento hacia la izquierda después de salir de la puerta de salida. También hay algunas diferencias en el cálculo de estadísticas. Finalmente también se explican algunas reglas que debéis seguir en el código. Todo ello se detalla en los siguientes apartados. Formato de los ficheros Para la ejecución de la práctica són necesarios dos ficheros: escenario.txt y simulaciones.txt. Fichero escenario.txt Este fichero contiene la información del escenario concreto del juego. En particular, incluye información sobre las líneas y puertas de tele-transportación. Comenzamos describiendo la forma en la que se especifican las líneas. Nótese que, mientras en la versión anterior la posición de las líneas se especificaba en un fichero matriz, ahora se especifica mediante las coordenadas de sus extremos. Cada una de las líneas se describe como sigue: - el carácter ‘L’, que la identifica como una línea - un nombre (una cadena de caracteres sin espacios en blanco con un máximo de 20 caracteres) - un valor (un número entero positivo) que será el que se utilizará para calcular el número de puntos de cada simulación o lanzamiento (cada vez que la pelota impacte con la línea se sumará este valor a la puntuación del lanzamiento) - cuatro valores (enteros no negativos) que representan los dos pares de coordenadas que corresponden a las posiciones de los dos extremos de la línea. Estos valores están separados por un espacio en blanco y el orden en que aparecen es: fila del primer extremo, columna del primer extremo, fila del segundo extremo, columna del segundo extremo. Aunque la representación de las líneas ha cambiado con respecto a la práctica de diciembre, aún se conservan los 4 tipos de líneas permitidos: horizontal, vertical y diagonales (45° y 45°). Las líneas diagonales son todavía los únicos obstáculos que pueden cambiar la dirección de movimiento (hacia izquierda o hacia derecha). La información de cada línea aparece en una línea diferente, y para cada línea, cada uno de sus elementos (carácter L, nombre, valor, y las coordenadas) estará separado por un espacio en blanco, e inmediatamente después de la última coordenada aparece el carácter salto de línea. Se mantienen las mismas reglas respecto de la disposición de las líneas: no pueden tocarse dos líneas y no habrá líneas ni en la primera (0) ni última (19) filas ni columnas. Por otro lado, cada una de las puertas de tele-transportación se describe en el fichero del siguiente modo: - - el carácter ‘P’ que la identifica como una puerta un nombre (una cadena de caracteres sin espacios en blanco con un máximo de 20 caracteres) un valor (un número entero positivo) que será el que se utilizará para calcular el número de puntos de cada simulación o lanzamiento (cada vez que la pelota atraviese la puerta se sumará este valor a la puntuación del lanzamiento) cuatro valores (enteros no negativos) que representan los dos pares de coordenadas que se corresponden con las posiciones de los dos puntos de la puerta. Estos valores están separados por un espacio en blanco y el orden en que aparecen es: fila del punto de entrada, columna del punto de entrada, fila del punto de salida, columna del punto de salida. La información de cada puerta aparece en una línea diferente, y para cada puerta, cada uno de sus elementos (carácter P, nombre, valor, y las coordenadas) estará separado por un espacio en blanco, e inmediatamente después de la última coordenada aparece el carácter salto de línea. No habrá puertas ni en la primera (0) ni última (19) fila. Tampoco habrá ninguna puerta superpuesta a una línea. Por ejemplo: L girona 24 1 1 1 3 P lleida 13 3 5 5 13 L tarragona 22 1 15 3 17 ... Fichero simulaciones.txt Cada una de las 10 simulaciones (lanzamientos de pelota) de que consta el juego se asocia a un jugador diferente. Este fichero contiene 10 líneas (una para cada uno de los 10 lanzamientos), y cada línea contiene el nombre del jugador (una cadena de caracteres sin espacios en blanco con un máximo de 20 caracteres), la columna inicial del lanzamiento (número entero de 0 a 19) y la dirección de impulso (‘i’ para izquierda o ‘d’ para derecha). Cada uno de estos tres elementos va separado por un espacio en blanco e inmediatamente después del carácter de la dirección de impulse aparece el carácter salto de línea. Por ejemplo: toni 3 i jesus 5 d amaury 18 d nir 16 d mar 12 i ... Generación del fichero de resultados Los resultados que se describen a continuación se guardarán en el fichero resultados.txt, en el orden y formato indicados. Recordad que debéis respetar tanto el formato de la visualización como el de los resultados. No respetarlo conlleva penalizaciones en la nota. 1- Visualización Se escribirá el contenido de la tabla, usando un espacio en blanco si la casilla esta vacía, el símbolo '*' si la casilla contiene un fragmento de una línea y el símbolo 'p' si contiene una puerta de tele-transportación (ya sea un punto de entrada o de salida). Después de imprimir la última línea, se pasará a la siguiente línea sin incluir más saltos de línea 2- Estadísticas acerca de tabla Se calcularán las estadísticas de obstáculos siguientes: z s0, s1, s2, s3: Número de líneas presentes de cada tipo (vertical, horizontal, diagonal desde abajo-izquierda hasta arriba-derecha, diagonal desde abajo-derecha hasta arribaizquierda) z s4, s5, s6, s7: Nombre y longitud (separados por un guión ‘-‘) de la línea más grande para cada tipo, en el mismo orden. Por ejemplo: mataro-6 manresa-5 vielha-2 reus-3 s4 z z z z s5 s6 s7 s8: Número total de líneas s9: Nombre y longitud (separados por un guión ‘-‘) de la línea más larga s10: Nombre y valor (separados por un guión ‘-‘) de la línea con un valor más alto s11: Número total de puertas s12: Nombre y longitud (separados por un guión ‘-‘) de la puerta con los puntos de entrada y salida más distantes entre sí. z Estas 11 estadísticas se escribirán en la misma línea separadas por un espacio en blanco: s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 y a continuación se saltará a la línea siguiente 3-Simulación de la caída de las pelotas z Se calcularán y se imprimirán por pantalla las estadísticas siguientes: c s13: índice de la columna en la cual la pelota haya tocado el suelo más veces y cuántas veces lo ha hecho (separados por un guión ‘-‘). En caso de empate se seleccionará el índice de columna más pequeño. Los índices van de 0 a 19. Por ejemplo: 5-7 (la pelota ha acabado 4 veces en la columna con índice 5) s14: nombre de la línea que más impactos ha recibido a lo largo de todas las simulaciones y número de impactos (separados por un guión ‘-‘). En caso de empate se seleccionará la menor alfabéticamente. c s15: nombre de la línea que más puntos ha producido a lo largo de todas las simulaciones y puntos que ha producido (separados por un guión ‘-‘). En caso de empate se seleccionará la menor alfabéticamente. c s16: nombre de la puerta que más veces ha sido atravesada a lo largo de todas las simulaciones y número de veces (separados por un guión ‘-‘). En caso de empate se seleccionará la menor alfabéticamente. c s17: nombre de la puerta que más puntos ha producido a lo largo de todas las simulaciones y puntos que ha producido (separados por un guión ‘-‘). En caso de empate se seleccionará la menor alfabéticamente. c Las estadísticas se imprimirán por pantalla de la manera siguiente: s13 s14 s15 s16 s17 Después de la imprimir la última línea, se saltará a la línea siguiente sin incluir más saltos de línea. 4-Matriz de ocupación Se imprimirá la matriz de ocupación después de haber realizado las 10 simulaciones y se saltara a la línea siguiente, se saltará a la línea siguiente sin incluir más saltos de línea. En caso de que alguna pelota entre y salga por una puerta, se sobrescribirá el símbolo 'p' de sus puntos de entrada y salida para dejar aparecer el contador de ocupación de las casillas. 5. Top-3 A continuación se incluirá la lista de las mejores tres simulaciones en función del número de puntos obtenidos, ordenadas de la primera a la tercera. Cada simulación estará en una línea diferente y contendrá, separados por espacios los siguientes elementos: nombre número puntos Donde nombre es el nombre de la simulación (por ejemplo “toni”), número es el número de simulación (de 0 a 9), puntos es el número total de puntos de esa simulación. En caso de empate a puntos, se seleccionará el nombre alfabéticamente menor. Normas adicionales El uso de variables globales está prohibido. Lógicamente sí pueden definirse tipos de datos de forma global. Documentación Además del correcto funcionamiento del programa, se valorará: - Estructuración en funciones (y facilidad para la reutilización) Documentación del código (y legibilidad) Así mismo, hay que entregar una memoria (documento en Word, OpenOffice o RTF) en la que se incluya una explicación sobre el funcionamiento general del código, y se justifiquen los tipos de datos y funciones utilizadas. Además, cada función debe ser descrita brevemente, especificando sus parámetros y valor retornado. Indicaciones para la entrega Esta práctica se realizará en parejas. Alternativamente puede realizarse individualmente, pero bajo ninguna circunstancia en grupos de más de dos alumnos. La entrega de esta práctica es obligatoria. La fecha límite de entrega es el 1 de septiembre a las 10:00 de la mañana. Depositad la carpeta con vuestro trabajo, incluyendo la memoria, (el nombre de la carpeta será vuestros nias, separados por un guión bajo, por ejemplo “31234_32345”) en la carpeta de vuestro grupo de práctica correspondiente (P11, P12, P13, P21 o P22), dentro de \\rec-c1au\PUBLIC\FOLDERS\3371-3372\12406\Alumnes\practica_septiembre Si una vez copiada tenéis algún problema o tenéis que hacer algún cambio, volvedlo a copiar desde una carpeta nueva añadiendo "_b" al nombre, por ejemplo "31234_32345_b" Para acceder desde fuera de la UPF debéis utilizar NetStorage. En http://www.upf.edu/bibtic/_pdf/C1AU-NETSTORAGE.pdf encontraréis una guía detallada sobre cómo hacerlo (para visualizarlo deberéis autenticaros con vuestro usuario del Campus Global) No se permite la entrega por correo electrónico ni mediante ningún otro mecanismo aparte de los anteriormente especificados. Recordad que el compilador a utilizar es gcc, en Linux o en Cygwin. Los ficheros que no puedan compilarse con gcc no se corregirán. El hecho de no cumplir cualquiera de los requerimientos (incluyendo el de dos personas por grupo, compilador válido, uso de variables globales, estructuras de datos requeridas y entrega de la memoria) supondrá un cero como nota de la práctica. Así mismo, es fundamental que los ficheros con los que trabajéis sigan los formatos y nombres que se detallan en este enunciado. Si los formatos y nombres de ficheros no son los correctos la parte de ejecución tendrá una nota de cero. Reiteramos que, para la evaluación, tanto o más importante que el que el programa funcione es que esté bien estructurado en funciones y que sea legible y esté bien documentado. Como es lógico, la copia está terminantemente prohibida, ya sea de todo o de parte del código o de la memoria. Además, os recordamos que la detección de una copia de trabajos ajenos conlleva el suspenso automático de la asignatura para todos los alumnos involucrados en la copia, además de la iniciación del consiguiente procedimiento disciplinario.