Objetivo General
El proyecto consiste en una versión simplificada del escenario de batalla de un juego de rol
(RPG). La finalidad del juego es que los personajes controlados por el jugador derroten a los
controlados por la computadora, a lo largo de una serie de turnos en los que deberán tomar
decisiones para alcanzar la victoria.
Se espera que se haga uso intensivo de las estructuras y algoritmos vistos en clases,
especialmente de los TAD Lista y Pila, apuntadores a funciones y variables, algoritmos de
ordenamiento, algoritmos de búsqueda y E/S de archivos.
El proyecto está diseñado para ser desarrollado por equipos de 3 personas. Y se recomienda
distribuir el trabajo entre los integrantes de la siguiente manera:
En caso de cualquier duda o necesidad de ayuda, los profesores y el preparador del curso
estarán disponibles para aclararlas y brindar apoyo.
Personajes
Deben ser implementado como una estructura de nombre Personaje que contenga los
siguientes campos:
Estructura “Personaje”
Variable Tipo
nombre char[16]
ptSalud int
ptEnergia int
inventario Pila*
habilidades Lista*
daño int
rango int
armadura int
evasion int
velocidad int
ptAccion int
El campo “ptSalud” funciona como un indicador de que tan herido se encuentra un personaje,
si durante cualquier turno el total de puntos de salud de cualquier participante llega a cero, el
mismo es removido de la partida permanentemente. Todos los objetos que haya tenido
equipados el personaje debe caer al suelo y pueden ser recogidos por cualquier otro.
Usar habilidades conlleva un costo que debe ser pagado con los puntos de energía del
personaje, dichos puntos estan guardados en el campo “ptEnergia”.
El campo inventario es una pila que contiene los distintos objetos que puede usar el personaje,
se explica más adelante.
El campo daño es la cantidad de puntos que se debe restar inicialmente a la salud del objetivo
cuando es atacado, rango es la distancia máxima a la que puede estar el objetivo para ser
atacado.
El campo armadura es un valor entre 0-100 que determina el porcentaje de daño que se recibe
en los puntos de salud cuando se recibe un ataque, evasión en un valor entre 0-100 que
determina si el daño de un ataque es recibido o no en los puntos de salud. Por ejemplo, Ben es
un personaje con 100 puntos de salud tiene 50 puntos de armadura y 33 puntos de evasión,
Annie lo ataca y tiene un daño de 30; por los puntos de evasión podemos determinar que de
cada 3 ataques que Ben reciba, solo 2 van a golpearlo (33%), y si el ataque de Annie es exitoso,
entonces se debe reducir el daño en un 50% y Ben solo recibiría a su salud 15 puntos de daño,
quedando con 85 restantes.
Velocidad determina el orden en que el personaje recibirá su turno. PtAccion son los puntos
que tiene disponibles un personaje en cualquier turno para tomar acciones.
Inventario
Desgraciadamente, nuestro protagonista tiene un bolso muy estrecho para guardar sus
pertenencias. Por lo que es necesario quitar las cosas que están en la parte superior para poder
alcanzar las cosas que están por debajo. Esta pila debe ser implementada con nodos enlazados
y debe contener en cada nodo un elemento del tipo “Item”. Si el objeto que se encuentra en el
tope de la pila, no es el que el personaje requiere, se debe proceder a retirar el tope y dejarlo
en el piso de la habitación para seguir revisando el inventario hasta conseguirlo.
Habilidades
La habilidades son acciones que cualquier personaje puede decidir tomar que tienen efectos
especiales sobre un objetivo determinado. Deben ser implementadas con una estructura que
contenga los siguientes campos:
Estructura “Habilidad”
Variable Tipo
nombre char[16]
costoEnergia int
costoAccion int
rango int
El “rango” determina la distancia maxima a la que el objetivo se puede encontrar para usar la
habilidad.
El efecto de cada habilidad está determinado por una función que recibe una coordenada.
Dentro de la función está programado que debe ocurrir en el terreno objetivo de la habilidad,
por ejemplo:
En la siguiente tabla se encuentran las habilidades mínimas que deben estar implementadas en
el proyecto (Si lo desea puede implementar otras ideadas por usted):
Habilidad Costo/Rango/Efecto
Items
Los items deben estar implementados con una estructura que contenga los siguientes campos:
Estructura “Item”
Variable Tipo
nombre char[32]
costo int
rango int
Costo es la cantidad puntos de acción necesarios para poder ser utilizado, rango representa el
máximo alcance del item.
La siguiente tabla especifica los items que deben ser implementados como mínimo en el
proyecto (si lo desea puede implementar más ideas propias):
Item Costo/Rango/Efecto
Tablero de juego
El tablero de juego consiste en una matriz 10x20 con las filas numeradas del 1 al 10 y las
columnas identificadas por las letras del alfabeto desde la A hasta la T (Ignorando la ñ). Cada
casilla de la matriz debe estar definida como una estructura Terreno que contiene los siguientes
campos:
Estructura “Terreno”
Variable Tipo
personaje Personaje*
El campo “personaje” representa un apuntador al personaje que esté posicionado sobre dicha
casilla. Al moverse, el personaje deja de ser apuntado por la casilla fuente y pasa a ser
apuntado por la casilla destino.
El campo “efecto” contiene un valor enumerado que determina qué clase de efecto está
manifestándose en dicha casilla.
Efecto Explicación
El campo “item” es una lista que inicia vacía, representa a los objetos que están tirados en el
piso en esa posición. Cuando un personaje deja caer un item, este debe ser transferido desde el
inventario del personaje a la lista de ítems de la casilla en la que se encuentra posicionado.
Mecánicas de Juego
Las batallas se realizan por turnos, al inicio del combate se comparan las velocidades de todos
los participantes y se ordenan en una lista enlazada de forma decreciente (En caso de que las
velocidades de dos o más participantes coincidan, se deben ordenar por nombre, de forma no
decreciente). Una vez ordenados los turnos, se procede a iniciar la batalla.
Cada acción que se tome, tiene un costo de puntos de acción que deben ser restados al total
que posea el personaje de turno. Si no hay suficientes puntos para poder llevarla a cabo,
entonces se ignora la orden asignada y se muestra un mensaje de error pertinente.
Por ejemplo:
1. Se ordena al Personaje de turno que utilice una poción de curación de su inventario.
2. El programa chequea el costo de utilizar dicha poción y determina que es 3.
3. El programa chequea cuantos puntos le restan al personaje y determina que son 4.
4. Como hay suficientes puntos, se procede a restar la cantidad necesaria (4 - 3) y se
ejecuta el efecto de la poción en el personaje.
5. Al personaje ahora le queda solamente 1 punto de acción.
En cualquier momento el personaje de turno puede elegir entre continuar usando sus punto de
acción y terminar el turno. Los puntos de acción restantes estarán disponibles para el siguiente
turno, sumados a los 5 que se obtienen al inicio de cada turno.
Por ejemplo:
1. Inicia el turno de un personaje y se le asignan sus primeros 5 puntos.
2. El personaje realiza un movimiento en el campo, gastando 3 puntos de acción.
3. A pesar de que puede realizar una acción más con sus 2 puntos restantes, decide
terminar su turno prematuramente.
4. Una vez vuelva a ser el turno del personaje, iniciará con 7 (5 + 2) puntos para gastar.
Los costos para llevar a cabo una acción, están reflejados en la siguiente tabla:
Acción Costo
Movimiento
A B C D A B C D
1 Ben 1 2 3 1 1 1 1 2
2 1 1 2 3 2 1 Annie 1 2
3 2 2 2 3 3 1 1 1 2
4 3 3 3 3 4 2 2 2 2
Ataque
En el siguiente tablero están distribuidos 4 personajes. Annie tiene rango 1, Emma tiene rango
2, Ben rango 3 y Diane rango 1.
A B C D E F G H I J
2 Annie
3 Emma Ben
5 Diane
Se puede observar que si es el turno de Annie y quiere atacar, el único objetivo válido que tiene
a su alcance es Emma. Por su parte, Emma también solo puede atacar a Annie. Ben puede
alcanzar a Emma y a Diane, y para su desgracia, Diane no tiene a nadie a su alcance, por lo que
no podrá atacar a menos que se mueva de su posición actual.
Control
Todos los personajes son controlados por el jugador (Si lo desea puede implementar una
pseudo inteligencia artificial para jugar contra la computadora, pero no es requerido).
Consola
Cada vez que sea turno del jugador humano se desplegará el siguiente menú de opciones:
1) Mostrar tablero
2) Consultar casilla
3) Atacar
4) Moverse
5) Usar habilidad
6) Usar item
7) Terminar turno
8) Inventario
9) Menú sistema
Si el jugador selecciona la opción 2, se le debe pedir una coordenada y listar en pantalla todos
los detalles de la casilla especificada (Personaje que la está ocupando y sus detalles, items en el
suelo, efecto y tiempo restante).
La opción 1 lista en orden todos los items del piso y los enumera en un menú, el jugador
procede entonces a especificar uno de ellos. El item sera removido del piso y agregado
al tope del inventario.
La opción 2 remueve el tope del inventario y lo agrega a los items que se encuentran en
la casilla donde está parado el personaje.
La opción 3 revisa el item que se encuentra al tope del inventario, si el item es un ARMA
o ARMADURA, lo equipa en el campo correspondiente y el item que se encontraba
previamete equipado pasa ahora al tope del inventario.
1) Guardar
2) Cargar
3) Volver
4) Salir
Si se selecciona la opción 1, el estado actual del juego (Turnos, ubicaciones, puntos restantes,
items restantes, etc) debe guardarse en un archivo externo con un nombre especificado por el
usuario, utilizando el modo de escritura binaria.