Anda di halaman 1dari 12

Noviembre 2018

Universidad Simón Bolívar


Departamento de Computación y Tecnología de la Información
CI-2126 Trimestre Septiembre – Diciembre 2018

Prof. Betzaida I Romero I


Prof. Masun Nabhan Homsi
Prep. Pedro Miguel Pérez González

Proyecto Evaluado (10 pts)

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:

1. Tablero y E/S por consola.


2. Personajes y mecánicas de juego.
3. Guardado y Carga de partidas, habilidades (E/S de archivos, apuntadores de funciones).

Se recomienda planificar previamente su diseño para la implementación del programa en


mutuo acuerdo con todos los integrantes del equipo, de forma que sea posible integrar
progresivamente los avances de cada uno.

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 “nombre” es simplemente una cadena de caracteres para identificar al personaje.

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

efecto void (*efecto) (Terreno*)

El campo “nombre” simplemente le asigna un nombre a la habilidad.

“costoEnergia” y “costoAcción” indican la cantidad de puntos que se debe pagar de ambos


contadores para poder usar la habilidad, si alguno de los dos no es suficiente para cubrir el
costo, entonces no se puede llevar a cabo la acción.

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:

1) Ben utiliza la habilidad “incendiar” que cuesta 2pE y 3pA.


2) El programa determina que Ben tiene 3pE y 3pA disponibles, por lo que se restan los
puntos necesarios y se lleva a cabo la acción. Ben ahora tiene 1pE y 0pA
3) Incendiar hace que la casilla objetivo pase a tener el efecto “INCENDIADO”, una idea de
implementación puede ser:
void incendiar (Terreno *t)
{
t->efecto = INCENDIADO;
}

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

Restaurar (5pE, 4pA) (2)


Cura el 30% de los puntos de salud del personaje que se
encuentre parado sobre el terreno objetivo.

Incediar (2pE, 7pA) (3)


Incendia la casilla objetivo y causa 30% de daño a los puntos
de salud ACTUALES del personaje parado sobre el terreno
objetivo.

Congelar (4pE, 4pA) (3)


Congela la casilla objetivo y reduce a cero los puntos de acción
que tenga el personaje parado sobre el terreno objetivo.

Electrocutar (10pE, 5pA) (4)


Electrifica la casilla objetivo y elimina el 50% de la cantidad de
puntos de energía TOTAL del personaje parado sobre el
terreno objetivo (Los puntos de energía no pueden bajar de 0).

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

efecto void (*efecto) (Terreno*)


El campo “nombre” identifica al item con una cadena de caracteres, por ejemplo “Espada”.

Costo ​es la cantidad puntos de acción necesarios para poder ser utilizado, ​rango ​representa el
máximo alcance del item.

El campo ​efecto ​funciona exactamente igual que en las habilidades.

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

Poción de salud Costo: 3pA


Rango: 0
Efecto: Restaura el 30% de los puntos de salud del objetivo.

Poción de energía Costo: 3pA


Rango: 0
Efecto: Restaura el 30% de los puntos de energía del objetivo.

Gradana nulificadora Costo: 5pA


Rango: 5
Efecto: Anula cualquier efecto que este sobre la casilla objetivo
y todas las que se encuentren inmediatamente a su alrededor.

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*

efecto Efecto (enum)


items Lista (Item)

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

NINGUNO No se lleva a cabo ninguna acción sobre el


personaje de turno posicionado en la casilla.

ELECTRIFICADO Al inicio de cada turno, el personaje que esté


posicionado encima de la casilla tiene un 25%
de posibilidad de ser electrificado, lo cuál
hará que pierda su turno y no reciba ningún
punto de acción.

INCENDIADO Al inicio de cada turno, el personaje que esté


posicionado encima de la casilla tiene un 40%
de posibilidad de quemarse, recibiendo 10
puntos de daño a su salud antes de iniciar su
turno.

CONGELADO Mientras dure el turno, el personaje que esté


posicionado encima de la casilla debe pagar
el doble de puntos para llevar a cabo
cualquier acción (Por ejemplo, para moverse
fuera de la casilla deberá pagar 2 puntos de
acción en vez de 1) mientras esté
posicionado sobre ella.

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.

Al inicio de cada turno se le asignan un total de 5 puntos de acción al personaje de turno, el


cual puede tomar las siguientes decisiones:
● Moverse
● Usar un item
● Atacar
● Usar una habilidad

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

Moverse en el campo 1 punto por cada cuadro.

Atacar 2 puntos de acción

Usar un ítem Costo determinado por el ítem

Usar una habilidad Costo determinado por la habilidad

Movimiento

Moverse en el tablero de juego consiste en indicarle al programa en cualquier momento del


turno, la coordenada de la casilla destino. El programa entonces debe calcular la cantidad
óptima de cuadros que se debe recorrer para llegar al destino y verificar que el personaje posee
suficientes puntos de acción para llevar a cabo el movimiento. Un personaje puede moverse a
cualquier casilla circundante del cuadro en que se encuentre, incluyendo las diagonales, siendo
1 el costo a pagar por cada cuadro al que se mueva. Cabe destacar que un personaje no puede
moverse a una casilla que ya esté siendo ocupada por otro.
En los siguientes tableros se ilustran ejemplos de los costos de moverse para Ben y Annie,
especificados en cada casilla:

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 cualquier momento de su turno un personaje puede decidir atacar a cualquier otro


personaje que se encuentre dentro de su rango de ataque. El rango y el daño están
determinados en los campos del personaje. Al realizar el ataque, si el mismo es exitoso, se le
restará al objetivo la cantidad de daño especificada, menos la cantidad de armadura que
especifique el objetivo.

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 1, el estado actual del tablero debe mostrarse en pantalla de la


siguiente manera:

ABCDEFGHIJKLMNOPQRST Cada casilla se imprime con los siguientes caracteres:


0░░░░░░░░░░░░░░░*░░░░ Ocupada por personaje -> Inicial del personaje en mayúscula
1░░F░░░░░░░░░░░░░░░░░ si es controlado por la computadora, minúscula si es
2░░░░░░░░░░▓▓▓▓░░░░░░ controlado por el jugador.
3░░░░░░░░░░░░░░░░░░░░ Ocupada por items -> Asterisco
4░░▓▓▓▓▓░░░░░░░B░░░░░ Estado normal -> ASCII 176 ​░
5░░░░░░░░░░░░░░░░░░░░ Bajo cualquier efecto -> ASCII 178 ​▓
6░░░*░░░░░░▓▓▓▓░░░░░░ Los caracteres están en orden de prioridad, es decir que si en
7░░░░░░░░░░░░░░░░░░░░ una casilla hay un personaje, y simultáneamente se está
8░░░░A░░░░░░░░░░░░*░░ incendiando, se debe mostrar únicamente la inicial del
9░░░░░░░░░░░░░░░░░░░░ personaje.

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).

Si el jugador selecciona la opción 3, 4, 5 o 6, se le pide una coordenada y si todos los


requerimientos se cumplen, se procede con la acción especificada, de lo contrario se muestra
un mensaje de error pertinente.

Si el jugador selecciona la opción 7, termina el turno y se procede con el siguiente personaje.

Al seleccionar la opción 8, se debe mostrar el siguiente menú:


1) Recoger item
2) Soltar item
3) Equipar item
4) Consultar tope
5) Volver

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.

La opción 4 muestra en pantalla el item que se encuentre en el tope del inventario.

La opción 5 vuelve al menú anterior.

La opción 9 despliega el siguiente menú:

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.

Si se selecciona la opción 2, se debe cargar en el programa un archivo binario que contenga


toda información del estado de un juego previo, de forma que el juego continúe exactamente
en el punto en que fue guardado.

La opción 3 lleva al usuario al menú anterior y la opción 4 termina inmediatamente el


programa.

Anda mungkin juga menyukai