Nombre:
DNI:
Ejercicio Único (10 puntos)
En un juego de rol, los jugadores interactúan con diferentes personajes mágicos en un bosque encantado. Implementa las siguientes clases y métodos siguiendo buenas prácticas de programación orientada a objetos en C#:
Parte A – Clases y Herencia (5 puntos)
- Crea una clase
Bosque
con las dimensiones máximasXMax
yYMax
(enteros positivos). - Crea una clase base
PersonajeMagico
con:- Coordenadas
x
,y
(posición dentro del bosque), - Nivel de magia (
int
), - Un objeto
Bosque
al que pertenece, - Un método virtual
Accion()
que devuelve""
, - Un método
Mover()
que desplaza aleatoriamente entre -2 y 2 en ambos ejes, sin salirse del bosque, y resta 1 punto de magia.
- Coordenadas
- Crea una clase
Hechicero
que herede dePersonajeMagico
y sobrescriba el métodoAccion()
para devolver una de estas frases aleatorias si su magia es mayor a 0:"¡Abracadabra!"
"¡Fuego!"
"¡Luz divina!"
- Crea una clase
Druida
que también herede dePersonajeMagico
, contenga una lista destring
con nombres de plantas curativas, y sobrescriba el métodoAccion()
para devolver y eliminar aleatoriamente una planta si tiene alguna; si no, devuelve""
.
Parte B – Métodos Externos (3 puntos)
- Implementa un método
AfectarZona(List<PersonajeMagico> lista, int x0, int y0, int n)
que reduzca enn
unidades el nivel de magia de cada personaje que esté a menos den
unidades de la posición(x0, y0)
. Elimina los personajes cuya magia quede negativa. - Implementa el método
FrasesDruidas(PersonajeMagico[] personajes)
que devuelva una única cadena con la concatenación de los resultados deAccion()
de todos los druidas.
Parte C – Estructura Dinámica (2 puntos)
- Implementa una pila llamada
PilaHechiceros
basada en nodos (NodoHechicero
), con métodosPush()
,Pop()
y una propiedadCount
. Cada nodo debe contener unHechicero
.
✅ Solución en C#
using System;
using System.Collections.Generic;
public class Bosque
{
public int XMax { get; }
public int YMax { get; }
public Bosque(int xmax, int ymax)
{
XMax = xmax;
YMax = ymax;
}
}
public class PersonajeMagico
{
public int X { get; protected set; }
public int Y { get; protected set; }
public int Magia { get; protected set; }
public Bosque Bosque { get; }
private static Random rnd = new Random();
public PersonajeMagico(Bosque bosque)
{
Bosque = bosque;
X = rnd.Next(0, bosque.XMax + 1);
Y = rnd.Next(0, bosque.YMax + 1);
Magia = 100;
}
public virtual string Accion() => "";
public void Mover()
{
X = Math.Clamp(X + rnd.Next(-2, 3), 0, Bosque.XMax);
Y = Math.Clamp(Y + rnd.Next(-2, 3), 0, Bosque.YMax);
Magia -= 1;
}
}
public class Hechicero : PersonajeMagico
{
public Hechicero(Bosque bosque) : base(bosque) { }
public override string Accion()
{
if (Magia <= 0) return "";
string[] frases = { "¡Abracadabra!", "¡Fuego!", "¡Luz divina!" };
return frases[new Random().Next(frases.Length)];
}
}
public class Druida : PersonajeMagico
{
private List<string> plantas = new List<string>();
public Druida(Bosque bosque) : base(bosque)
{
plantas.Add("Salvia");
plantas.Add("Ortiga");
plantas.Add("Romero");
}
public override string Accion()
{
if (plantas.Count == 0) return "";
int i = new Random().Next(plantas.Count);
string planta = plantas[i];
plantas.RemoveAt(i);
return planta;
}
}
public static class Utilidades
{
public static void AfectarZona(List<PersonajeMagico> lista, int x0, int y0, int n)
{
lista.RemoveAll(p =>
{
bool cerca = Math.Abs(p.X - x0) < n && Math.Abs(p.Y - y0) < n;
if (cerca) p.Magia -= n;
return p.Magia < 0;
});
}
public static string FrasesDruidas(PersonajeMagico[] personajes)
{
string resultado = "";
foreach (var p in personajes)
{
if (p is Druida d)
resultado += d.Accion() + " ";
}
return resultado.Trim();
}
}
public class NodoHechicero
{
public Hechicero H;
public NodoHechicero Anterior;
public NodoHechicero(Hechicero h)
{
H = h;
Anterior = null;
}
}
public class PilaHechiceros
{
private NodoHechicero tope;
private int count = 0;
public void Push(Hechicero h)
{
NodoHechicero nuevo = new NodoHechicero(h);
nuevo.Anterior = tope;
tope = nuevo;
count++;
}
public Hechicero Pop()
{
if (tope == null) return null;
Hechicero h = tope.H;
tope = tope.Anterior;
count--;
return h;
}
public int Count => count;
}
¿Te gustaría que prepare esto en formato PDF o como documento Word para poder entregarlo? ¿O prefieres que lo empaquete como proyecto de Visual Studio?
Contenido restringido
Comments are closed