TRIPLETRIAL Por: Bernabé Kantar, Joaquín. Tripletrial aparece en ...
TRIPLETRIAL Por: Bernabé Kantar, Joaquín. Tripletrial aparece en ...
TRIPLETRIAL Por: Bernabé Kantar, Joaquín. Tripletrial aparece en ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>TRIPLETRIAL</strong><br />
<strong>Por</strong>: <strong>Bernabé</strong> <strong>Kantar</strong>, <strong>Joaquín</strong>.<br />
<strong>Tripletrial</strong> <strong>aparece</strong> <strong>en</strong> el clásico Final Fantasy VIII como un minijuego de cartas, <strong>en</strong> el cual el<br />
objetivo es ganar las cartas del rival.<br />
Para ello cada jugador escoge 5 cartas proced<strong>en</strong>tes de su colección<br />
(previam<strong>en</strong>te conseguidas <strong>en</strong> el juego a través de misiones o <strong>en</strong>contradas <strong>en</strong><br />
los esc<strong>en</strong>arios), cada carta dispone de 4 atributos o fuerzas<br />
situadas cada una <strong>en</strong> uno de sus laterales.<br />
El sistema de juego es simple,<br />
por turnos los jugadores juegan una única carta de su<br />
mano sobre un tablero con capacidad para 9 cartas <strong>en</strong><br />
un sistema de 3x3 (imag<strong>en</strong> de la izquierda).<br />
Cuando se juega una carta, se ha de comprobar si<br />
alguno de sus laterales está <strong>en</strong> contacto con alguna<br />
carta rival, <strong>en</strong> caso de estarlo se comparan las fuerzas<br />
situadas <strong>en</strong> los laterales <strong>en</strong> contacto y si la carta jugada<br />
ti<strong>en</strong>e un mayor valor de fuerza que la que ya estaba,<br />
esta última pasa a ser del bando del contrario.<br />
Este procedimi<strong>en</strong>to se ha de realizar para todas las cartas rivales que estén <strong>en</strong> contacto con la recién<br />
llegada.<br />
Los jugadores alternan turnos <strong>en</strong> los cuales es obligatorio jugar una y sólo una carta, hasta que las<br />
9 posiciones del tablero estén ocupadas. En este mom<strong>en</strong>to se dará por v<strong>en</strong>cedor al jugador con más<br />
cartas <strong>en</strong> su bando, si<strong>en</strong>do posible un empate.
¿CÓMO SE JUEGA?<br />
Una vez iniciada la partida, los dos jugadores (<strong>en</strong> adelante Azul y Rojo) alternarán turnos tras jugar<br />
sus cartas.<br />
La secu<strong>en</strong>cia del turno es la sigui<strong>en</strong>te:<br />
-Escoger una carta <strong>en</strong> mano.<br />
-Elegir una posición libre del tablero.<br />
-Jugar la carta.<br />
-Comprobar las interacciones con las cartas rivales.<br />
-Resolver las posibles interacciones.<br />
-Fin del turno.<br />
<strong>Por</strong> lo tanto durante el turno del jugador, este debe escoger una y sólo una de sus cartas<br />
desplazándose con las flechas de dirección sobre las cartas de su mano y cuando esté sobre la que<br />
desee pulsando “<strong>en</strong>ter”. Ahora podrá desplazarse por el tablero y colocarla <strong>en</strong> una posición del<br />
tablero que no estuviese previam<strong>en</strong>te ocupada, <strong>en</strong> caso de arrep<strong>en</strong>tirse de la carta que escogió<br />
simplem<strong>en</strong>te debe pulsar espacio para volver a su mano.<br />
Una vez seleccionada la posición, la carta será llevada de la mano a la posición del tablero,<br />
mom<strong>en</strong>to <strong>en</strong> el cual se comprobará si hay o no cartas rivales <strong>en</strong> contacto con la misma. De ser así<br />
comparando sus valores de fuerzas <strong>en</strong> contacto podremos saber si las derrotaremos o no. Para<br />
derrotar una carta rival y que ésta se una a nuestro bando, nuestra fuerza a comparar debe t<strong>en</strong>er un<br />
valor superior. En caso de derrotarla pasará a nuestro bando.<br />
Ahora es el turno del rival.<br />
Repiti<strong>en</strong>do este proceso hasta que las 9 posiciones estén ocupadas, <strong>en</strong>tonces se cu<strong>en</strong>ta las cartas de<br />
cada bando, ¡el jugador que posea más cartas será el v<strong>en</strong>cedor!<br />
OBJETIVOS<br />
El juego una vez desarrollado debe permitirnos jugar una partida para dos jugadores a partir de unas<br />
manos g<strong>en</strong>eradas aleatoriam<strong>en</strong>te como <strong>en</strong> otros juegos de cartas coleccionables.<br />
En este caso quizás el formato Abierto sea el más interesante, <strong>en</strong> el cual ambos jugadores se v<strong>en</strong> las<br />
manos, unido a que las cartas nos son desconocidas hasta el inicio de la misma la complejidad del<br />
juego es mayor pues requerirá p<strong>en</strong>sar por los dos, usar estrategias para <strong>en</strong>gañar al opon<strong>en</strong>te y<br />
sacrificar alguna de nuestras cartas para hacer una jugada mejor.<br />
A su vez <strong>en</strong> el trascurso de la partida, el programa debe impedir jugadas ilegales tales como no<br />
jugar carta o jugar una carta <strong>en</strong> una posición ocupada.<br />
En cuanto a gráficos, mediante ncurses usaremos las funciones de imprimir <strong>en</strong> pantalla con colores<br />
para mostrar los bandos de las cartas, usando una paleta reducida (blanco, negro, amarillo, rojo y<br />
azul) con la que el usuario fácilm<strong>en</strong>te difer<strong>en</strong>ciará y sabrá con exactitud lo que ocurre, tanto fase del<br />
juego como las interacciones <strong>en</strong>tre cartas.
IMPLEMENTACIÓN<br />
Para convertir la teoría <strong>en</strong> una realidad se han implem<strong>en</strong>tado tres clases:<br />
-CMano, <strong>en</strong> la cual creamos y gestionamos la mano del jugador, t<strong>en</strong>dremos dos .<br />
-CTablero, la cual recibirá las cartas jugadas y <strong>en</strong> la que podremos ver el resultado del juego así<br />
como la interacción <strong>en</strong>tre las cartas jugadas.<br />
-CCursor, el cursor es el intermediario <strong>en</strong>tre los deseos del usuario y la realización de su jugada, nos<br />
asiste señalizando la carta que deseemos jugar desde la mano del usuario y una vez seleccionada<br />
nos permitirá colocarla <strong>en</strong> la posición escogida del tablero.<br />
Cuando iniciamos el juego se nos pres<strong>en</strong>ta <strong>en</strong> pantalla el tablero y las manos de ambos jugadores<br />
con sus cartas iniciales y sus colores respectivos. El cursor (amarillo) nos mostrará sobre qué carta<br />
estamos posicionados y nos permitirá seleccionar únicam<strong>en</strong>te las cartas de nuestra mano y<br />
colocarlas <strong>en</strong> las posiciones vacías del tablero.<br />
Durante la sucesión de los turnos veremos como al derrotar las cartas rivales, éstas pasan a nuestro<br />
color y viceversa.<br />
ESTRUCTURA<br />
Como ya se ha m<strong>en</strong>cionada previam<strong>en</strong>te, todas las gestiones relativas a la selección de carta o<br />
posición para la misma se realiza a través de la clase CCursor que recibirá <strong>en</strong> su construcción una<br />
refer<strong>en</strong>cia al tablero para poder posteriorm<strong>en</strong>te <strong>en</strong>viar la carta seleccionada hasta el tablero.<br />
Igualm<strong>en</strong>te cada turno recibe la refer<strong>en</strong>cia del jugador que es poseedor del mismo. Lo cual le<br />
permite interactuar con el usuario que con las flechas de dirección podrá posicionar el cursor sobre<br />
la carta de su mano que desee jugar. Una vez el usuario selecciona la carta, ésta es guardada <strong>en</strong> una<br />
variable temporal hasta que el jugador (mediante el cursor) seleccione la posición del tablero <strong>en</strong> la<br />
que quiere ponerla.<br />
Si esta posición es válida, la carta seleccionada es pasada como parámetro al tablero junto con las<br />
coord<strong>en</strong>adas de la posición <strong>en</strong> la que debe ser colocada. La carta original es borrada de la mano.<br />
Una vez <strong>en</strong> el tablero, es el propio tablero el que comprueba las posibles interacciones con las cartas<br />
que ya estaban él.<br />
<strong>Por</strong> tanto vemos como claram<strong>en</strong>te es la class CCursor la que interactúa con los usuarios, la cual se<br />
asegura de que tanto las class CMano y CTablero le confirm<strong>en</strong> si una jugada o un desplazami<strong>en</strong>to es<br />
válido.<br />
Si<strong>en</strong>do CCursor el que da las órd<strong>en</strong>es a las demás y es la que recibe las órd<strong>en</strong>es directam<strong>en</strong>te del<br />
usuario.<br />
A continuación procederemos a dar una breve descripción de cada método público de las clases<br />
implem<strong>en</strong>tadas.
CMANO, sus métodos públicos:<br />
CMano(CTablero *tablero, TColor color); Constructor al cual le pasamos la refer<strong>en</strong>cia al tablero y<br />
el color que desde el principal le hemos asignado al jugador (Rojo/Azul).<br />
~CMano(); Destructor.<br />
TCarta DevuelveCarta(int p); Devolverá una copia de la carta <strong>en</strong> la posición p.<br />
void BorraCarta(int p); Elimina la carta <strong>en</strong> la posición p.<br />
int EnMano(); Devuelve el número de cartas que quedan <strong>en</strong> la mano.<br />
void Pintate(); Imprime <strong>en</strong> pantalla la mano del jugador.<br />
TColor ColorJugador(); Devuelve el color que asignamos al jugador <strong>en</strong> el constructor.<br />
CTABLERO, sus métodos públicos:<br />
CTablero(); Constructor, iniciamos todas las posiciones del tablero como vacías, iniciamos ncurses<br />
y habilitamos la opción de movernos mediante el uso de los cursores.<br />
~CTablero(); Destructor, cerramos ncurses y la v<strong>en</strong>tana.<br />
void RecibeManos(CMano *JugadorAzul, CMano *JugadorRojo); Una vez creados los<br />
jugadores, le pasamos al tablero las direcciones de los mismos.<br />
void JuegaCarta(TCarta carta, int x, int y); Recibe una carta y la posición del tablero donde debe<br />
ponerla, una vez colocada gestiona las posibles capturas y <strong>en</strong> caso de ser necesario actualiza el<br />
propietario de las cartas que están <strong>en</strong> el tablero.<br />
TCarta DevuelveCarta(int x, int y); Devuelve una copia de la carta <strong>en</strong> la posición escogida.<br />
void PintaEstado(); Imprime <strong>en</strong> pantalla las manos de los jugadores que le pasamos <strong>en</strong><br />
RecibeManos utilizando el método CMano::Pintate(), además de pintar el tablero con el estado<br />
actual.<br />
TColor Ganador(); Una vez finalizada la partida, calcula el resultado y devuelve el color v<strong>en</strong>cedor.<br />
CCURSOR, sus métodos públicos:<br />
CCursor(CTablero *mesa); Constructor al que le pasamos la dirección del tablero.<br />
~CCursor(); Destructor.<br />
void DesplazateEnMano(CMano *jugador); Cada turno le pasamos la dirección del jugador cuyo<br />
turno se va a desarrollar, nos desplazamos por la mano para seleccionar la carta que jugaremos y se<br />
la pasamos al la función privada bool DesplazateEnTablero(TCarta, int, int) la cual nos permite<br />
desplazarnos por el tablero y nos devolverá false si nos arrep<strong>en</strong>timos de la carta que cogimos y true<br />
cuando juguemos la carta <strong>en</strong> una de las posiciones válidas del tablero, llamando <strong>en</strong>tonces a<br />
Ctablero::JuegaCarta(TCarta, int, int) con la carta elegida y su nueva posición como<br />
parámetros.
principal.cpp<br />
Alternación de turnos <strong>en</strong>tre jugador<br />
Rojo y Azul.<br />
class CCursor<br />
Métodos públicos llamados:<br />
void DesplazateEnMano(CMano *jugador);<br />
class CTablero<br />
Métodos públicos llamados:<br />
class CMano<br />
Métodos públicos llamados:<br />
TCarta DevuelveCarta(int p);<br />
void BorraCarta(int p);<br />
void JuegaCarta(TCarta carta, int x, int y);<br />
void PintaEstado();<br />
Estado actual del tablero tras jugar la carta<br />
Ley<strong>en</strong>da:<br />
Llamadas<br />
Fin del proceso, vuelta al inicio