HOla necesito ayuda con un programa en c. Os dejo el enunciado. SI es posible escribid el código en notepad++.
El juego del Pinball
El objetivo de esta práctica es implementar un juego de pinball simplificado. Como
sabréis el juego consiste en controlar los desplazamientos de una pelota en un
entorno que contiene obstáculos. En esta práctica vamos a implementar la
disposición y la gestión de los obstáculos en la tabla así como la gestión de la caída
de la pelota.
Con el fin de simplificar el problema, consideraremos que los obstáculos de la tabla
se representan usando líneas (verticales, horizontales, y diagonales). En ningún
caso las líneas se pueden cruzar ni tocar, y tienen una longitud de al menos 2
casillas. La representación de estas líneas se hace mediante una matriz de tipo int
de 50*50 casillas. En esta matriz, se usarán dos números, 0 para indicar que no
hay obstáculo, y 1 para indicar que hay un obstáculo. Vamos a considerar que se
suelta la pelota desde una casilla de la primera fila y que se cae en una casilla de la
última fila, donde toca el 'suelo'.
NOTA: En todo el enunciado usaremos una matriz de 10*10 casillas para ilustrar el
enunciado, pero recordad que se tiene que trabajar con una matriz de 50*50
casillas. En cualquier caso, si utilizáis una constante para el tamaño de la matriz os
será fácil probarlo primero con matrices pequeñas de 10x10 y luego cambiarlo a la
matriz de 50x50.
Por ejemplo, la matriz:
int tabla[10][10]{
{0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0,0,0},
{0,0,1,0,0,0,1,0,0,0},
{0,0,0,1,0,0,1,0,0,0},
{0,1,0,0,0,0,0,0,0,1},
{0,1,0,1,1,1,0,0,1,0},
{0,1,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,1,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
Corresponde a la disposición de obstáculos siguiente (los puntos representan
espacios vacíos y las estrellas los obstáculos):
. . . . . . . . . .
. * . . . . * . . .
. . * . . . * . . .
. . . * . . * . . .
. * . . . . . . . *
. * . * * * . . * .
. * . . . . . * . .
. . . . . . . . . .
. . * * . * * . . .
. . . . . . . . . .
Podéis ver que esta matriz es válida ya que:
.
Sólo hay líneas horizontales, verticales , o diagonales
.
Ninguna línea está en contacto con otra
.
La primera fila (arriba) está vacía. La reservamos para soltar la pelota en las
simulaciones
A partir de esta matriz de obstáculos, vamos a simular la caída de 1 pelota o una
secuencia de 10 pelotas. Cada una de esas pelotas es soltada desde cualquier
casilla de la primera fila e irá "bajando" hasta una casilla de la ultima fila. Las
condiciones iniciales para el caso de los 10 lanzamientos se proporcionarán al
programa mediante dos arrays:
.
int disparos_pos[10]: array que contiene el índice de la columna en que la
pelota será soltada
ejemplo:
int disparos_pos[10] = {1, 5, 14, 22, 37, 48, 43, 40, 28, 19};
.
char disparos_dir[10]: array que contiene la dirección del impulso con el
cual la pelota es lanzada (es decir, hacia qué lado va girando la pelota
inicialmente). La dirección puede ser o bien izquierda ('i'), o bien derecha
('d').
ejemplo:
char disparos_dir[10]= {'i','i','d','i','d','d','i','d','d','i'};
Nota: reiteramos que la matriz es de 50x50, pero que el número de lanzamientos
es 10.
Las reglas de movimiento de las pelotas son las siguientes:
.
para cada paso la pelota se mueve una casilla
.
si debajo de la pelota no hay un obstáculo, la pelota cae una casilla
.
si en cambio sí hay un obstáculo, la pelota sigue su movimiento direccional
(izquierda o derecha) indicado inicialmente en disparos_dir, excepto cuando
el obstáculo es una línea diagonal que baja en dirección contraria. En este
caso la pelota adquiere la dirección de movimiento contraria (y cambia su
dirección de impulso). Por ejemplo, si la pelota tiene como dirección de
disparo derecha, y tanto en la casilla de abajo como en la casilla de la
derecha hay un obstáculo (lo que representa una línea diagonal arribaderecha
a abajo-izquierda), la bola tendrá que cambiar su movimiento a
izquierda a partir de ahora, mientras no encuentre otra línea diagonal de
arriba-izquierda a abajo-derecha que le vuelva a hacer cambiar de dirección.
Ejemplo 1: En la figura siguiente, damos un ejemplo de movimiento de la pelota.
Cada número indica la posición de la pelota para cada paso. Aquí la pelota es
soltada en la columna de índice 2 y tiene dirección de impulso hacia la derecha.
. . 0 . . . . . . .
. * 1 2 . . * . . .
. . * 3 4 . * . . .
. . . * 5 . * . . .
. * . . 6 7 8 . . *
. * . * * * 9 . * .
. * . . . . 10 * . .
. . . . . . 11 12 . .
. . * * . * * 13 . .
. . . . . . . 14 . .
Fijaos que la pelota ha impactado contra diferentes obstáculos en los pasos 1, 3, 6,
7 y 11. La pelota toca el suelo en la columna de índice 7 después de 15 pasos.
Ejemplo 2: Aquí la pelota está soltada en la columna de índice 6 y tiene dirección
de impulso hacia la derecha.
. . . . . . 0 1 . .
. * . . . . * 2 . .
. . * . . . * 3 . .
. . . * . . * 4 . .
. * . . . . . 5 . *
. * . * * * 7 6 * .
. * . . . . 8 * . .
. . . . 11 10 9 . . .
. . * * 12 * * . . .
. . . . 13 . . . . .
Fijaos que la pelota ha impactado diferentes obstáculos en los pasos 0, 6, 9 y 10.
La pelota toca el suelo en la columna de índice 4 después de 14 pasos. Fijaos
también que en el paso 6 la pelota ha cambiado de dirección de movimiento.
A partir de varias simulaciones, se puede definir una matriz de ocupación de las
casillas, que contiene el número de veces en que cada casilla ha sido visitada por
la pelota durante todas esas simulaciones.
En el caso de haber simulado los ejemplos 1 y 2, la matriz de ocupación sería:
0 0 1 0 0 0 1 1 0 0
0 * 1 1 0 0 * 1 0 0
0 0 * 1 1 0 * 1 0 0
0 0 0 * 1 0 * 1 0 0
0 * 0 0 1 1 1 1 0 *
0 * 0 * * * 2 1 * 0
0 * 0 0 0 0 2 * 0 0
0 0 0 0 1 1 2 1 0 0
0 0 * * 1 * * 1 0 0
0 0 0 0 1 0 0 1 0 0
Os proporcionamos la definición de la tabla, la posición de los disparos y la
dirección de los disparos mediante el fichero definiciones.txt que está en el
espacio Moodle de la asignatura, junto a este enunciado. Este fichero contiene 3
definiciones de variables, con sus respectivas inicializaciones, que deberéis copiar
en vuestro fichero de código:
.
int tabla[50][50]
.
int disparos_pos[10]
.
char disparos_dir[10]
Nota: Tened en cuenta que el fichero que os proporcionamos es un ejemplo y que
podemos comprobar vuestros programas con otro fichero. Os aconsejamos copiar y
modificar este fichero para tener más juegos de prueba.
Menú
El programa deberá incluir un menú que permita hacer las siguientes acciones:
1) Visualizar el contenido de la tabla de obstáculos por pantalla.
2) Visualizar estadísticas acerca de la tabla (se especifican más abajo).
3) Simular la caída de una pelota. En este caso el programa deberá pedir al
usuario una posición (entre el 0 y el 49) que represente la columna por la
que deberá caer la pelota y la dirección de disparo ('i' o 'd'). Al final se
deberá visualizar la tabla de simulación de la caída, con un número
incremental indicando el orden de paso por las casillas (como las tablas
mostradas anteriormente en los ejemplos 1 y 2.
4) Simular la caída de 10 pelotas. En este caso se deberán utilizar los arrays
predefinidos int disparos_pos[10] y char disparos_dir[10].
5) Salir/acabar del programa.
Nota: el menú debe seguir imprimiéndose por pantalla después de cada acción
(1,2, 3 y 4) hasta que el usuario especifique explícitamente que se acabe el
programa (acción 5).
Especificación de la salida de la práctica
En este apartado se indica la salida que ha de generar vuestro programa para las
opciones 1, 2, 3 y 4.
1. Visualización
Se imprimirá por pantalla el contenido de la tabla, usando un espacio en blanco si
la casilla esta vacía, y el símbolo '*' si la casilla esta llena.
2. Estadísticas acerca de la tabla
Se calcularán las estadísticas de obstáculos siguientes:
.
s0, s1, s2, s3: Numero de líneas presentes de cada tipo (vertical, horizontal,
diagonal desde abajo-izquierda hasta arriba-derecha, diagonal desde abajoderecha
hasta arriba-izquierda)
.
s4, s5, s6, s7: Longitud de la línea más grande, para cada tipo, en el mismo
orden
.
s8: Numero total de líneas
.
s9: Longitud de la línea más grande
Las estadísticas se imprimirán por pantalla de la manera siguiente:
s0 s1 s2 s3 s4 s5 s6 s7 s8 s9
3. Simulación de la caída de 1 pelota
Para el caso de la simulación de una pelota, se imprimirá por pantalla la matriz
original de puntos y asteriscos pero cambiando las casillas por las que pasa la
pelota con el número de paso.
4. Simulación de la caída de una secuencia de 10 pelotas
Para el caso de la simulación de 10 pelotas, se imprimirá la matriz de ocupación
después de haber realizado las 10 simulaciones
Nota: Cómo pasar arrays como parámetros a funciones
La forma de declarar parámetros de funciones como arrays es similar al caso de
tipos básicos. Por ejemplo, si la función f, que devuelve un entero, tiene como
parámetro un array de 100 enteros, lo podéis declarar así:
int f(int A[100]) { ... }
Y posteriormente, si tenemos un array B de 100 enteros la llamada sería (donde x
es un entero):
x = f(B);
Igualmente, si el parámetro es una matriz de 10x10 enteros, la declaración sería:
int f(int A[10][10]) { ... }
Y la llamada (donde B es una matriz de 10x10 enteros y x un entero):
x = f(B);
Pero, en estos casos sí hay una importante diferencia con respecto a los tipos
básicos: si una función tiene un array A como parámetro, y los valores de éste se
modifican en la función, al hacer la llamada y pasarle el array B, los valores de B sí
se verán modificados al acabar la función. Por ejemplo:
void f(int A[2])
{
A[0]=1;
A[1]=2;
}
main()
{
int B[2];
B[0]=0;
B[1]=1;
f(B);
//aquí B[0] vale 1 y B[1] vale 2
}
La razón de que esto sea así se estudiará en el tema 7.
Indicaciones sobre la entrega y la evaluación
Esta práctica se realizará en parejas. Alternativamente puede realizarse
individualmente, pero bajo ninguna circunstancia en grupos de más de dos
alumnos.
El plazo de entrega de esta práctica expira el lunes 25-02-2013 (a las 9:00 am)
Para depositar vuestro trabajo:
- Cread una carpeta y ponedle como nombre vuestros "NIAs", separados por
un guión bajo seguido por la palabra Windows o Linux, según el sistema
operativo que hayáis utilizado. Por ejemplo, "31234_32345Windows".
- Copiad en la carpeta vuestros ficheros de código fuente (.c), NO los
ejecutables
- Comprimid vuestra carpeta y haced un fichero .zip con el mismo nombre de
la carpeta (vuestros "NIAs" separados por un guión:
"31234_32345Windows.zip").
- Acceded al aula Moodle de la asignatura (MTC.2012-21406 Fonaments de la
Programació). Buscad el apartado "Entrega de prácticas" y seleccionad la
opción "Entrega de la primera práctica evaluable".
- Una vez en la sección de la entrega de la práctica, encontraréis un botón de
examinar a través del cual podéis buscar el fichero .zip que debéis subir.
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 formato PDF, junto
con el documento editable en Word o RTF) de un máximo de 3 páginas en la que se
incluya una explicación del funcionamiento general del código, y se justifiquen las
estructuras de datos y las funciones utilizadas. Además, cada función debe ser
descrita brevemente. La memoria debe ir acompañada de una portada con el
nombre y NIA de los miembros del grupo, fecha de entrega y profesor de prácticas.
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.
También os recordamos que está prohibido el uso de variables globales (no
puede haber variables declaradas fuera de las funciones).
El hecho de no cumplir cualquiera de los requerimientos (incluyendo el de
dos personas por grupo, compilador válido, uso de variables globales, y
entrega de la memoria) supondrá un cero como nota de la práctica.
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.
Criterios de evaluación
Al evaluar la práctica se tendrán en cuenta los 5 aspectos que se listan a
continuación:
- Memoria (15%)
- Estilo/claridad del código (15%)
- Estructuras de datos (10%)
- Descomposición funcional (20%)
- Ejecución (40%)
Para cada aspecto se indica, entre paréntesis, su peso en la nota.
La matriz que se tiene que usar es esta:
int tabla[50][50]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};
El juego del Pinball
El objetivo de esta práctica es implementar un juego de pinball simplificado. Como
sabréis el juego consiste en controlar los desplazamientos de una pelota en un
entorno que contiene obstáculos. En esta práctica vamos a implementar la
disposición y la gestión de los obstáculos en la tabla así como la gestión de la caída
de la pelota.
Con el fin de simplificar el problema, consideraremos que los obstáculos de la tabla
se representan usando líneas (verticales, horizontales, y diagonales). En ningún
caso las líneas se pueden cruzar ni tocar, y tienen una longitud de al menos 2
casillas. La representación de estas líneas se hace mediante una matriz de tipo int
de 50*50 casillas. En esta matriz, se usarán dos números, 0 para indicar que no
hay obstáculo, y 1 para indicar que hay un obstáculo. Vamos a considerar que se
suelta la pelota desde una casilla de la primera fila y que se cae en una casilla de la
última fila, donde toca el 'suelo'.
NOTA: En todo el enunciado usaremos una matriz de 10*10 casillas para ilustrar el
enunciado, pero recordad que se tiene que trabajar con una matriz de 50*50
casillas. En cualquier caso, si utilizáis una constante para el tamaño de la matriz os
será fácil probarlo primero con matrices pequeñas de 10x10 y luego cambiarlo a la
matriz de 50x50.
Por ejemplo, la matriz:
int tabla[10][10]{
{0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0,0,0},
{0,0,1,0,0,0,1,0,0,0},
{0,0,0,1,0,0,1,0,0,0},
{0,1,0,0,0,0,0,0,0,1},
{0,1,0,1,1,1,0,0,1,0},
{0,1,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,1,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
Corresponde a la disposición de obstáculos siguiente (los puntos representan
espacios vacíos y las estrellas los obstáculos):
. . . . . . . . . .
. * . . . . * . . .
. . * . . . * . . .
. . . * . . * . . .
. * . . . . . . . *
. * . * * * . . * .
. * . . . . . * . .
. . . . . . . . . .
. . * * . * * . . .
. . . . . . . . . .
Podéis ver que esta matriz es válida ya que:
.
Sólo hay líneas horizontales, verticales , o diagonales
.
Ninguna línea está en contacto con otra
.
La primera fila (arriba) está vacía. La reservamos para soltar la pelota en las
simulaciones
A partir de esta matriz de obstáculos, vamos a simular la caída de 1 pelota o una
secuencia de 10 pelotas. Cada una de esas pelotas es soltada desde cualquier
casilla de la primera fila e irá "bajando" hasta una casilla de la ultima fila. Las
condiciones iniciales para el caso de los 10 lanzamientos se proporcionarán al
programa mediante dos arrays:
.
int disparos_pos[10]: array que contiene el índice de la columna en que la
pelota será soltada
ejemplo:
int disparos_pos[10] = {1, 5, 14, 22, 37, 48, 43, 40, 28, 19};
.
char disparos_dir[10]: array que contiene la dirección del impulso con el
cual la pelota es lanzada (es decir, hacia qué lado va girando la pelota
inicialmente). La dirección puede ser o bien izquierda ('i'), o bien derecha
('d').
ejemplo:
char disparos_dir[10]= {'i','i','d','i','d','d','i','d','d','i'};
Nota: reiteramos que la matriz es de 50x50, pero que el número de lanzamientos
es 10.
Las reglas de movimiento de las pelotas son las siguientes:
.
para cada paso la pelota se mueve una casilla
.
si debajo de la pelota no hay un obstáculo, la pelota cae una casilla
.
si en cambio sí hay un obstáculo, la pelota sigue su movimiento direccional
(izquierda o derecha) indicado inicialmente en disparos_dir, excepto cuando
el obstáculo es una línea diagonal que baja en dirección contraria. En este
caso la pelota adquiere la dirección de movimiento contraria (y cambia su
dirección de impulso). Por ejemplo, si la pelota tiene como dirección de
disparo derecha, y tanto en la casilla de abajo como en la casilla de la
derecha hay un obstáculo (lo que representa una línea diagonal arribaderecha
a abajo-izquierda), la bola tendrá que cambiar su movimiento a
izquierda a partir de ahora, mientras no encuentre otra línea diagonal de
arriba-izquierda a abajo-derecha que le vuelva a hacer cambiar de dirección.
Ejemplo 1: En la figura siguiente, damos un ejemplo de movimiento de la pelota.
Cada número indica la posición de la pelota para cada paso. Aquí la pelota es
soltada en la columna de índice 2 y tiene dirección de impulso hacia la derecha.
. . 0 . . . . . . .
. * 1 2 . . * . . .
. . * 3 4 . * . . .
. . . * 5 . * . . .
. * . . 6 7 8 . . *
. * . * * * 9 . * .
. * . . . . 10 * . .
. . . . . . 11 12 . .
. . * * . * * 13 . .
. . . . . . . 14 . .
Fijaos que la pelota ha impactado contra diferentes obstáculos en los pasos 1, 3, 6,
7 y 11. La pelota toca el suelo en la columna de índice 7 después de 15 pasos.
Ejemplo 2: Aquí la pelota está soltada en la columna de índice 6 y tiene dirección
de impulso hacia la derecha.
. . . . . . 0 1 . .
. * . . . . * 2 . .
. . * . . . * 3 . .
. . . * . . * 4 . .
. * . . . . . 5 . *
. * . * * * 7 6 * .
. * . . . . 8 * . .
. . . . 11 10 9 . . .
. . * * 12 * * . . .
. . . . 13 . . . . .
Fijaos que la pelota ha impactado diferentes obstáculos en los pasos 0, 6, 9 y 10.
La pelota toca el suelo en la columna de índice 4 después de 14 pasos. Fijaos
también que en el paso 6 la pelota ha cambiado de dirección de movimiento.
A partir de varias simulaciones, se puede definir una matriz de ocupación de las
casillas, que contiene el número de veces en que cada casilla ha sido visitada por
la pelota durante todas esas simulaciones.
En el caso de haber simulado los ejemplos 1 y 2, la matriz de ocupación sería:
0 0 1 0 0 0 1 1 0 0
0 * 1 1 0 0 * 1 0 0
0 0 * 1 1 0 * 1 0 0
0 0 0 * 1 0 * 1 0 0
0 * 0 0 1 1 1 1 0 *
0 * 0 * * * 2 1 * 0
0 * 0 0 0 0 2 * 0 0
0 0 0 0 1 1 2 1 0 0
0 0 * * 1 * * 1 0 0
0 0 0 0 1 0 0 1 0 0
Os proporcionamos la definición de la tabla, la posición de los disparos y la
dirección de los disparos mediante el fichero definiciones.txt que está en el
espacio Moodle de la asignatura, junto a este enunciado. Este fichero contiene 3
definiciones de variables, con sus respectivas inicializaciones, que deberéis copiar
en vuestro fichero de código:
.
int tabla[50][50]
.
int disparos_pos[10]
.
char disparos_dir[10]
Nota: Tened en cuenta que el fichero que os proporcionamos es un ejemplo y que
podemos comprobar vuestros programas con otro fichero. Os aconsejamos copiar y
modificar este fichero para tener más juegos de prueba.
Menú
El programa deberá incluir un menú que permita hacer las siguientes acciones:
1) Visualizar el contenido de la tabla de obstáculos por pantalla.
2) Visualizar estadísticas acerca de la tabla (se especifican más abajo).
3) Simular la caída de una pelota. En este caso el programa deberá pedir al
usuario una posición (entre el 0 y el 49) que represente la columna por la
que deberá caer la pelota y la dirección de disparo ('i' o 'd'). Al final se
deberá visualizar la tabla de simulación de la caída, con un número
incremental indicando el orden de paso por las casillas (como las tablas
mostradas anteriormente en los ejemplos 1 y 2.
4) Simular la caída de 10 pelotas. En este caso se deberán utilizar los arrays
predefinidos int disparos_pos[10] y char disparos_dir[10].
5) Salir/acabar del programa.
Nota: el menú debe seguir imprimiéndose por pantalla después de cada acción
(1,2, 3 y 4) hasta que el usuario especifique explícitamente que se acabe el
programa (acción 5).
Especificación de la salida de la práctica
En este apartado se indica la salida que ha de generar vuestro programa para las
opciones 1, 2, 3 y 4.
1. Visualización
Se imprimirá por pantalla el contenido de la tabla, usando un espacio en blanco si
la casilla esta vacía, y el símbolo '*' si la casilla esta llena.
2. Estadísticas acerca de la tabla
Se calcularán las estadísticas de obstáculos siguientes:
.
s0, s1, s2, s3: Numero de líneas presentes de cada tipo (vertical, horizontal,
diagonal desde abajo-izquierda hasta arriba-derecha, diagonal desde abajoderecha
hasta arriba-izquierda)
.
s4, s5, s6, s7: Longitud de la línea más grande, para cada tipo, en el mismo
orden
.
s8: Numero total de líneas
.
s9: Longitud de la línea más grande
Las estadísticas se imprimirán por pantalla de la manera siguiente:
s0 s1 s2 s3 s4 s5 s6 s7 s8 s9
3. Simulación de la caída de 1 pelota
Para el caso de la simulación de una pelota, se imprimirá por pantalla la matriz
original de puntos y asteriscos pero cambiando las casillas por las que pasa la
pelota con el número de paso.
4. Simulación de la caída de una secuencia de 10 pelotas
Para el caso de la simulación de 10 pelotas, se imprimirá la matriz de ocupación
después de haber realizado las 10 simulaciones
Nota: Cómo pasar arrays como parámetros a funciones
La forma de declarar parámetros de funciones como arrays es similar al caso de
tipos básicos. Por ejemplo, si la función f, que devuelve un entero, tiene como
parámetro un array de 100 enteros, lo podéis declarar así:
int f(int A[100]) { ... }
Y posteriormente, si tenemos un array B de 100 enteros la llamada sería (donde x
es un entero):
x = f(B);
Igualmente, si el parámetro es una matriz de 10x10 enteros, la declaración sería:
int f(int A[10][10]) { ... }
Y la llamada (donde B es una matriz de 10x10 enteros y x un entero):
x = f(B);
Pero, en estos casos sí hay una importante diferencia con respecto a los tipos
básicos: si una función tiene un array A como parámetro, y los valores de éste se
modifican en la función, al hacer la llamada y pasarle el array B, los valores de B sí
se verán modificados al acabar la función. Por ejemplo:
void f(int A[2])
{
A[0]=1;
A[1]=2;
}
main()
{
int B[2];
B[0]=0;
B[1]=1;
f(B);
//aquí B[0] vale 1 y B[1] vale 2
}
La razón de que esto sea así se estudiará en el tema 7.
Indicaciones sobre la entrega y la evaluación
Esta práctica se realizará en parejas. Alternativamente puede realizarse
individualmente, pero bajo ninguna circunstancia en grupos de más de dos
alumnos.
El plazo de entrega de esta práctica expira el lunes 25-02-2013 (a las 9:00 am)
Para depositar vuestro trabajo:
- Cread una carpeta y ponedle como nombre vuestros "NIAs", separados por
un guión bajo seguido por la palabra Windows o Linux, según el sistema
operativo que hayáis utilizado. Por ejemplo, "31234_32345Windows".
- Copiad en la carpeta vuestros ficheros de código fuente (.c), NO los
ejecutables
- Comprimid vuestra carpeta y haced un fichero .zip con el mismo nombre de
la carpeta (vuestros "NIAs" separados por un guión:
"31234_32345Windows.zip").
- Acceded al aula Moodle de la asignatura (MTC.2012-21406 Fonaments de la
Programació). Buscad el apartado "Entrega de prácticas" y seleccionad la
opción "Entrega de la primera práctica evaluable".
- Una vez en la sección de la entrega de la práctica, encontraréis un botón de
examinar a través del cual podéis buscar el fichero .zip que debéis subir.
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 formato PDF, junto
con el documento editable en Word o RTF) de un máximo de 3 páginas en la que se
incluya una explicación del funcionamiento general del código, y se justifiquen las
estructuras de datos y las funciones utilizadas. Además, cada función debe ser
descrita brevemente. La memoria debe ir acompañada de una portada con el
nombre y NIA de los miembros del grupo, fecha de entrega y profesor de prácticas.
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.
También os recordamos que está prohibido el uso de variables globales (no
puede haber variables declaradas fuera de las funciones).
El hecho de no cumplir cualquiera de los requerimientos (incluyendo el de
dos personas por grupo, compilador válido, uso de variables globales, y
entrega de la memoria) supondrá un cero como nota de la práctica.
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.
Criterios de evaluación
Al evaluar la práctica se tendrán en cuenta los 5 aspectos que se listan a
continuación:
- Memoria (15%)
- Estilo/claridad del código (15%)
- Estructuras de datos (10%)
- Descomposición funcional (20%)
- Ejecución (40%)
Para cada aspecto se indica, entre paréntesis, su peso en la nota.
La matriz que se tiene que usar es esta:
int tabla[50][50]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};