public void Run()
        {
            while (true)
            {
                int distance = 0;
                helicopter = new Helicopter(3, Console.BufferHeight / 2);
                cave = new Cave();

                Display(buffer);
                buffer.WriteCenter("Ready");
                buffer.Display();

                Utility.WaitForKey(ConsoleKey.Spacebar);

                while (!cave.Hit(helicopter))
                {
                    DateTime timestamp = DateTime.Now;
                    helicopter.Fly(Utility.IsKeyDown(ConsoleKey.Spacebar));

                    if (Utility.IsKeyDown(ConsoleKey.Enter))
                    {
                        buffer.WriteCenter("Paused");
                        buffer.Display();
                        Utility.WaitForKey(ConsoleKey.Spacebar);
                    }

                    distance++;
                    cave.Generate();
                    Display(buffer);
                    Thread.Sleep(Math.Max(0, (timestamp + TimeSpan.FromMilliseconds(1000 / Settings.Default.FPS) - DateTime.Now).Milliseconds));
                }

                buffer.WriteCenter("Hello, wall...", "Distance: " + distance);
                buffer.Display();
                Utility.WaitForKey(ConsoleKey.Enter);
            }
        }
 public bool Hit(Helicopter helicopter)
 {
     return Slices
         .Select((slice, index) => new { Slice = slice, Index = index })
         .Any(indexedSlice => indexedSlice.Slice.Hit(helicopter, indexedSlice.Index));
 }
 public bool Hit(Helicopter helicopter, int x)
 {
     return helicopter.Parts.Any(part => part.ContainsX(x) && (part.Y <= Ceiling || part.Y >= Floor));
 }
 public Part(Helicopter owner)
 {
     Owner = owner;
 }
 public TailRotor(Helicopter owner)
     : base(owner)
 {
 }
 public MainRotor(Helicopter owner)
     : base(owner)
 {
 }
 public Body(Helicopter owner)
     : base(owner)
 {
 }