{}
run-icon
Main.cs
using System; using System.Collections.Generic; public class Program { public static List<HeroAnimal> roster = new() { new Penguin(), new Shark(), new Goat(), new Gorilla()}; public static List<string> team = new(); public static void Main() { Console.WriteLine("\nOur Hero Animal roster:"); roster.ForEach(animal => Console.WriteLine($"{animal.GetType().Name}!")); Mission mission = new Mission("Find Dr Evil's Forest Island Castle", Biome.Sea, Biome.Forest, new Castle()); Console.WriteLine($"\nMission: {mission.Description}"); try { team.Add(FindHeroForBiome(mission.FirstBiome)); team.Add(FindHeroForBiome(mission.SecondBiome)); team.Add(FindHeroForLair(mission)); Console.WriteLine("\nOur Hero team for mission:"); team.ForEach(animal => Console.WriteLine(animal)); } catch(Exception ex) { Console.WriteLine("\n"+ex.Message); Console.WriteLine("Misison declined! Get more heros!"); } } public static string FindHeroForBiome(Biome biome) { HeroAnimal hero = roster.Find(animal => animal.Home == biome); if (hero == null) throw new Exception($"No hero for {biome}"); return $"{hero.GetType().Name} through {biome}"; } public static string FindHeroForLair(Mission mission) { HeroAnimal hero = roster.Find(animal => mission.CanHeroBreakIntoLair(animal)); if (hero == null) throw new Exception($"No hero for {mission.EvilLair}"); return $"{hero.GetType().Name} breaks into {mission.EvilLair} lair"; } } public class Mission { public string Description; public Biome FirstBiome {get; private set;} public Biome SecondBiome {get; private set;} public Lair EvilLair {get; private set;} public Mission(string desc, Biome first, Biome second, Lair lair) { Description = desc; FirstBiome = first; SecondBiome = second; EvilLair = lair; } public bool CanHeroBreakIntoLair(HeroAnimal hero) { return EvilLair.CanHeroBreakIn(hero); } } public enum Biome { Forest, Ice, Plains, Swamp, Sea } public interface Lair { bool CanHeroBreakIn(HeroAnimal hero); } public struct Castle : Lair { public bool CanHeroBreakIn(HeroAnimal hero) { return hero.canFly() || hero.canClimb(); } } public struct Underground : Lair { public bool CanHeroBreakIn(HeroAnimal hero) { return hero.canCrawl(); } } public struct Underwater : Lair { public bool CanHeroBreakIn(HeroAnimal hero) { return hero.canSwim(); } } public abstract class HeroAnimal { public abstract bool canFly(); public abstract bool canSwim(); public abstract bool canClimb(); public abstract bool canCrawl(); public Biome Home {get; protected set;} } public abstract class Bird : HeroAnimal { public override bool canFly(){ return true; } public override bool canSwim() => false; public override bool canClimb() => false; public override bool canCrawl() => false; } public abstract class Fish : HeroAnimal { public override bool canFly() => false; public override bool canSwim() => true; public override bool canClimb() => false; public override bool canCrawl() => false; public Fish() { Home = Biome.Sea; } } public abstract class Reptile : HeroAnimal { public override bool canFly() => false; public override bool canSwim() => true; public override bool canClimb() => false; public override bool canCrawl() => true; public Reptile() { Home = Biome.Swamp; } } public abstract class Mammal : HeroAnimal { public override bool canFly() => false; public override bool canSwim() => true; public override bool canClimb() => false; public override bool canCrawl() => true; public Mammal() { Home = Biome.Plains; } } public class Penguin : Bird { public override bool canFly() => false; public override bool canSwim() => true; public Penguin() { Home = Biome.Ice; } } public class Shark : Fish { } public class Goat: Mammal { public override bool canClimb() => true; } public class Gorilla: Mammal { public Gorilla() { Home = Biome.Forest; } }
Output