PrInf18: Juego: doble o nada

De MateWiki
Revisión del 21:41 9 ago 2013 de Herraiz (Discusión | contribuciones) (Funciones útiles para el juego)

Saltar a: navegación, buscar
Práctica de Informática
Juego: doble o nada
Práctica anterior Siguiente práctica
Este artículo es un guión de prácticas de Informática


Warning.png Este artículo está en versión beta. El autor de este artículo no lo ha terminado todavía, por favor no lo edites hasta que elimine este mensaje.

En esta práctica vamos a implementar un juego, reutilizando las funciones que hemos escrito en la práctica anterior. En este juego, tenemos un polígono y pedimos al usuario un punto, al igual que en los programas anteriores. El ordenador coloca un imán en el punto que indica el usuario. En el vértice más cercano hay otro imán que repele a nuestro imán, y lo lanza al doble de distancia. Si el imán continúa dentro del polígono tras ser lanzado, el jugador pierde. Por el contrario, si el imán logra escapar del polígono, el jugador gana.

1 Requisitos previos

Antes de realizar esta práctica, es imprescindible haber realizado antes la práctica anterior:

2 Contenido de la práctica

2.1 Descripción del juego

Ejemplo de jugada ganadora. El imán está inicialmente en el punto azul, y sale despedido hasta la posición del punto rosa. El jugador gana porque el imán logra salir del polígono.
Ejemplo de jugada perdedora. El imán está inicialmente en el punto azul, y sale despedido hasta la posición del punto rosa. El jugador pierde porque el imán continúa dentro del polígono tras ser repelido por el vértice más cercano.

Antes de empezar a programar, vamos a ver dos ejemplos de una jugada ganadora y otra perdedora, teniendo como polígono un triángulo. En la primera imagen tenemos un ejemplo de jugada ganadora. El usuario introduce el punto en la posición azul. El programa busca el vértice más cercano, calcula la distancia hasta ese vértice, y lanza el imán hasta el doble de distancia. La nueva posición es la del punto morado, que al caer fuera del polígono, hace que la jugada sea ganadora.

En la segunda imagen, el usuario introduce un punto diferente. El vértice más cercano resulta ser el mismo. Esta vez, el punto morado, resultado de repeler el imán hasta el doble de distancia al vértice, continúa dentro del polígono, por lo que el jugador pierde.

En resumen, nuestro programa tiene que realizar las siguientes tareas:

  • Pedir un punto al usuario
  • Buscar el vértice más cercano al punto
  • Calcular un nuevo punto al doble de distancia del vértice que el punto introducido por el usuario
  • Comprobar si el nuevo punto está dentro o fuera del polígono

La salida de datos del programa debe constar de un mensaje que diga alguno de los dos mensajes siguientes (las tildes se han quitado a propósito para evitar problemas en la corrección del programa). Si el jugador gana:

El iman ha salido del poligono. Has ganado!

Si el jugador pierde:

El iman continua dentro del poligono. Has perdido :(

Puedes copiar y pegar este texto dentro de tu programa, para asegurarte que sea exactamente igual. Es importante que sea exactamente igual para usar el corrector automático para comprobar tu programa. Es muy importante usar disp para mostrar estos mensajes, de lo contrario el corrector automático no funcionará.

El programa debe generar también una imagen como las de la derecha, aunque no es necesario que incluya ninguna etiqueta de texto en los ejes.

2.2 Código para dibujar el triángulo y los puntos

Para generar las imágenes con el polígono y los puntos, podemos usar el siguiente código:

clf;
fill(x, y, 'g');
hold on;
plot(xp,yp,'x','LineWidth',8,'MarkerSize',14);
plot(xc,yc,'or','LineWidth',8, 'MarkerSize', 14);
plot(xn,yn,'om','LineWidth',8, 'MarkerSize', 14);
set(gca,'fontsize',14);
set(gca,'fontweight','bold');
set(gca,'linewidth',4);
grid on;
hold off;

En este código, se supone que el polígono y los puntos están en las siguientes variables:

  • x e y son los vectores con las coordenadas de los vértices del polígono
  • xp e yp son las coordenadas del punto introducido por el usuario, que aparece con una cruz azul
  • xc e yc son las coordenadas del vértice más cercano al punto, que aparece con un círculo rojo
  • xn e yn son las coordenadas del punto donde aterriza el imán tras ser repelido, y se representa por un círculo en color violeta

2.3 Funciones útiles para el juego

Además de las funciones distancia y encuentraVerticeMasCercano, programadas en la práctica anterior, para este juego necesitamos otra función, que calcule la posición del punto donde aterriza el imán. Para este cálculo, tenemos el punto que introduce el usuario [math](x_p, y_p)[/math], y el punto del vértice más cercano [math](x_v, y_v)[/math]. Independientemente de la posición relativa de [math]p[/math] y [math]v[/math], la posición del punto donde aterriza el imán tras ser repelido [math](x_n, y_n)[/math] vendrá dada por

[math]\displaystyle \begin{eqnarray*} x_n &= x_p + (x_p - x_v) \\ y_n &= y_p + (y_p - y_v) \end{eqnarray*}[/math]

Para implementar el juego, sería útil tener una función de nombre doblaDistancia, que devuelva dos argumentos, xn e yn, y que acepte cuatro argumentos de entrada, xp, yp, xv e yv. La cabecera de la función sería

function [xn, yn] = doblaDistancia(xp, yp, xv, yv)
Lapiz.png Tarea: Termina la función doblaDistancia, para poder usarla dentro del programa.


Lapiz.png Tarea: Cuando hayas terminado la función, escribe el programa del juego en un fichero de nombre dobleNada.m


3 Ejercicio post-práctica