public void RunGame()
        {
            // setup of base screen
            Score = 0;

            Console.WindowHeight = 50;

RespawnPoint:
            objlist = new List <GameObject>();
            SB      = new ScreenBuffer(Console.WindowWidth, Console.WindowHeight);

            Ship   Player1    = new Ship(SB);
            Random newrockpos = new Random();

            SB.FixedText.Add(new FixedText(new string('-', Console.WindowWidth), new ConsoleEngine.Coordinate(0, Console.WindowHeight - 4)));
            SB.FixedText.Add(new FixedText("Dodge the Asteroid by JakeTrans", new ConsoleEngine.Coordinate(0, Console.WindowHeight - 3)));
            SB.FixedText.Add(new FixedText("Cursors to move, Space to shoot '0' is a rock", new ConsoleEngine.Coordinate(0, Console.WindowHeight - 2)));

            Controls Play1con = CreateControls(Player1);

            SB.Draw("READY????", new ConsoleEngine.Coordinate((Console.WindowWidth / 2) - 10, Console.WindowHeight / 2));

            SB.UpdateScreen(objlist);
            Console.ReadKey();

            Play1con.Activate();

            objlist.Add(Player1);

//if in test mode drop one asteroid only (see TestMode Build)
#if test
            Rock Temprock = new Rock(37, 2, SB);
            objlist.Add(Temprock);
#endif

            // game loop
            do
            {
                //if in test mode drop one asteroid on each tick
#if !test
                Rock Temprock = new Rock(newrockpos.Next(1, Console.WindowWidth - 1), 2, SB);
                //int XToUse = newrockpos.Next(2, Console.WindowWidth - 2);

                //Rock Temprock = new Rock(XToUse, 2, SB, DirectionRandomiser(XToUse, SB));
                objlist.Add(Temprock);
#endif
                //Despawn
                for (int i = 0; i < objlist.Count; i++)
                {
                    if (objlist[i].Position.Y > SB.Height - 6 || objlist[i].Position.Y == 1 || objlist[i].Position.X <= 2 || objlist[i].Position.X >= Console.WindowWidth - 2 ||
                        (objlist[i].Hit == true && objlist[i].GetType() != typeof(Ship)))
                    {
                        objlist[i].DestroyObject();
                        objlist.RemoveAt(i);
                    }
                    else if (objlist[i].Hit == true)
                    {
                        objlist[i].DestroyObject();
                        objlist.RemoveAt(i);
                    }
                }

                Thread.Sleep(RefreshRate);
                CollisionDetection CD = new CollisionDetection(objlist);

                foreach (GameObject item in objlist.ToList <GameObject>())
                {
                    item.SelfMove();
                    CD.RunDetection(item);
                }

                Score = Score + 1; // add a point on each cycle

                //get Item that have been hit
                List <GameObject> Hitobjects = objlist.Where(o => o.Hit == true).ToList();

                foreach (GameObject item in Hitobjects)
                {
                    if (item.GetType() == typeof(Ship))
                    {
                        //Tuple<int, int> TopLeft = GeneralFunctions.FindTopLeft(GameAnimations.TwoTickExplode()[0], new Tuple<int, int>(item.X, item.Y));
                        Animation Anim2 = new Animation(GameAnimations.ShipExplode(), new Coordinate(item.Position.X, item.Position.Y));
                        Animation Anim  = new Animation(GameAnimations.TwoTickExplode(), new Coordinate(item.HitLocation.X - 2, item.HitLocation.Y - 2));

                        SB.AnimatationtoRUN.Add(Anim2);
                        SB.AnimatationtoRUN.Add(Anim);

                        SB.FixedText.Add(new FixedText("YOU HAVE BEEN HIT", new Coordinate(0, 0)));

                        SB.FixedText.Add(new FixedText("SCORE -- " + Score.ToString(), new Coordinate(0, 1)));

                        item.DestroyObject();

                        SB.UpdateScreen(objlist);

                        goto Endpoint;
                    }
                    else if (item.GetType() == typeof(Rock))
                    {
                        Animation Anim = new Animation(GameAnimations.TwoTickExplode(), new Coordinate(item.HitLocation.X - 2, item.HitLocation.Y - 2));
                        SB.AnimatationtoRUN.Add(Anim);
                    }
                }
                SB.UpdateScreen(objlist);
            } while (Player1.Hit == false);

Endpoint:
            Play1con.Deactivate();

            SB.FinishAnimations(RefreshRate, objlist);


            foreach (GameObject item in objlist)
            {
                item.DestroyObject();
            }
            SB.FixedText.Add(new FixedText("PRESS Y TO RESTART OR N TO EXIT", new Coordinate(0, 4)));
            SB.UpdateScreen(objlist);
RespawnQPoint:
            ConsoleKeyInfo CK = Console.ReadKey(true);



            if (CK.Key == ConsoleKey.Y)
            {
                Score = 0;
                goto RespawnPoint;
            }
            else if (CK.Key == ConsoleKey.N)
            {
                //end program
            }
            else
            {
                goto RespawnQPoint;
            }

            SB.Draw("EXITING", new Coordinate(0, 3));
            SB.UpdateScreen(objlist);
        }
 /// <summary>
 /// Called on Initialization
 /// </summary>
 private void Awake()
 {
     Instance = this;
 }