COMPARTE ESTE ARTÍCULO

Nombre:
DNI:


Ejercicio único (10 puntos)

En un videojuego de fantasía medieval, existen criaturas mágicas que habitan en distintas regiones del mapa. Los jugadores pueden invocarlas y hacer que se desplacen o realicen acciones. Desarrolla el siguiente sistema de clases, herencias y funciones globales en C#:


Parte A – Clases y comportamiento (5 puntos)

  1. Crea una clase Region con los atributos:
    • XMax, YMax → dimensiones máximas de la región.
  2. Crea la clase base CriaturaMagica:
    • Campos: x, y, energia, region.
    • Constructor que coloca la criatura en una posición aleatoria dentro de los límites de la región, con energía inicial de 100.
    • Método Mover() que modifica su posición aleatoriamente entre -2 y 2 pasos sin salirse del mapa y reduce la energía en 1.
    • Método virtual Accion() que devuelve cadena vacía "".
  3. Crea una subclase Hada:
    • Su método Accion() devuelve aleatoriamente una de estas frases:
      • "✨ Polvo de estrella"
      • "🌿 Bendición natural"
      • "🌈 Ilusión brillante"
      • Solo si su energía > 0.
  4. Crea una subclase Espectro que contiene una lista de cadenas (maldiciones):
    • "Oscuridad", "Frío eterno", "Silencio"
    • Su método Accion() elimina aleatoriamente una maldición y la devuelve como string. Si la lista está vacía, devuelve "".

Parte B – Métodos auxiliares (3 puntos)

  1. Crea un método ReducirEnergia(List<CriaturaMagica> lista, int x0, int y0, int d) que reduzca 15 puntos de energía a las criaturas cuya posición esté a distancia Manhattan ≤ d de (x0, y0).
    Elimina las criaturas cuya energía ≤ 0.
  2. Crea un método MensajesEspectros(CriaturaMagica[] array) que recorra el array y retorne una cadena concatenando los resultados de Accion() de todos los objetos de tipo Espectro.

Parte C – Selección (2 puntos)

  1. Implementa un método TopNCriaturasConMasEnergia(CriaturaMagica[] array, int n) que devuelva las n criaturas con mayor energía, ordenadas de mayor a menor.

✅ Solución en C#

using System;
using System.Collections.Generic;

public class Region
{
    public int XMax { get; }
    public int YMax { get; }

    public Region(int xMax, int yMax)
    {
        XMax = xMax;
        YMax = yMax;
    }
}

public class CriaturaMagica
{
    public int X { get; protected set; }
    public int Y { get; protected set; }
    public int Energia { get; protected set; }
    public Region Region { get; }

    private static Random rnd = new Random();

    public CriaturaMagica(Region region)
    {
        Region = region;
        X = rnd.Next(0, region.XMax + 1);
        Y = rnd.Next(0, region.YMax + 1);
        Energia = 100;
    }

    public void Mover()
    {
        X = Math.Clamp(X + rnd.Next(-2, 3), 0, Region.XMax);
        Y = Math.Clamp(Y + rnd.Next(-2, 3), 0, Region.YMax);
        Energia -= 1;
    }

    public virtual string Accion() => "";
}

public class Hada : CriaturaMagica
{
    public Hada(Region region) : base(region) { }

    public override string Accion()
    {
        if (Energia <= 0) return "";
        string[] frases = {
            "✨ Polvo de estrella",
            "🌿 Bendición natural",
            "🌈 Ilusión brillante"
        };
        return frases[new Random().Next(frases.Length)];
    }
}

public class Espectro : CriaturaMagica
{
    private List<string> maldiciones = new List<string> { "Oscuridad", "Frío eterno", "Silencio" };

    public Espectro(Region region) : base(region) { }

    public override string Accion()
    {
        if (maldiciones.Count == 0) return "";
        int i = new Random().Next(maldiciones.Count);
        string m = maldiciones[i];
        maldiciones.RemoveAt(i);
        return m;
    }
}

public static class Utilidades
{
    public static void ReducirEnergia(List<CriaturaMagica> lista, int x0, int y0, int d)
    {
        lista.RemoveAll(c =>
        {
            bool cerca = Math.Abs(c.X - x0) + Math.Abs(c.Y - y0) <= d;
            if (cerca) c.Energia -= 15;
            return c.Energia <= 0;
        });
    }

    public static string MensajesEspectros(CriaturaMagica[] array)
    {
        string resultado = "";
        foreach (var c in array)
        {
            if (c is Espectro e)
                resultado += e.Accion() + " ";
        }
        return resultado.Trim();
    }

    public static CriaturaMagica[] TopNCriaturasConMasEnergia(CriaturaMagica[] array, int n)
    {
        Array.Sort(array, (a, b) => b.Energia.CompareTo(a.Energia));
        int size = Math.Min(n, array.Length);
        CriaturaMagica[] top = new CriaturaMagica[size];
        Array.Copy(array, top, size);
        return top;
    }
}

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