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;
}
}