COMPARTE ESTE ARTÍCULO

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)

  1. Crea una clase Bosque con las dimensiones máximas XMax y YMax (enteros positivos).
  2. 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.
  3. Crea una clase Hechicero que herede de PersonajeMagico y sobrescriba el método Accion() para devolver una de estas frases aleatorias si su magia es mayor a 0:
    • "¡Abracadabra!"
    • "¡Fuego!"
    • "¡Luz divina!"
  4. Crea una clase Druida que también herede de PersonajeMagico, contenga una lista de string con nombres de plantas curativas, y sobrescriba el método Accion() para devolver y eliminar aleatoriamente una planta si tiene alguna; si no, devuelve "".

Parte B – Métodos Externos (3 puntos)

  1. Implementa un método AfectarZona(List<PersonajeMagico> lista, int x0, int y0, int n) que reduzca en n unidades el nivel de magia de cada personaje que esté a menos de n unidades de la posición (x0, y0). Elimina los personajes cuya magia quede negativa.
  2. Implementa el método FrasesDruidas(PersonajeMagico[] personajes) que devuelva una única cadena con la concatenación de los resultados de Accion() de todos los druidas.

Parte C – Estructura Dinámica (2 puntos)

  1. Implementa una pila llamada PilaHechiceros basada en nodos (NodoHechicero), con métodos Push(), Pop() y una propiedad Count. Cada nodo debe contener un Hechicero.

✅ 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

Acceso de usuarios existentes
   
Registro de un nuevo usuario
*Campo necesario

Categories:

Tags:

Comments are closed

Estado de acceso
ESTADO DE ACCESO
TRADUCTORES
COMPARTENOS
error: CONTENIDO PROTEGIDO