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)
- Crea una clase
Region
con los atributos:XMax
,YMax
→ dimensiones máximas de la región.
- 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""
.
- Campos:
- 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.
- Su método
- 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)
- 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. - Crea un método
MensajesEspectros(CriaturaMagica[] array)
que recorra el array y retorne una cadena concatenando los resultados deAccion()
de todos los objetos de tipoEspectro
.
Parte C – Selección (2 puntos)
- Implementa un método
TopNCriaturasConMasEnergia(CriaturaMagica[] array, int n)
que devuelva lasn
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
Comments are closed