public MapGenerator GetMapGenerator(string type, params Object[] additionalParams)
        {
            var rm = new MapRandomGenerator();

            additionalParams[0] = rm.CurrentRandomMap;
            switch (type)
            {
            case "empty":
                if (!(additionalParams[0] is int))
                {
                    throw new ArgumentException(string.Format("Additional parameters must be of type int for map generator type {0}", type));
                }
                if (!(additionalParams[1] is int))
                {
                    throw new ArgumentException(string.Format("Additional parameters must be of type int for map generator type {0}", type));
                }
                int rows = (int)additionalParams[0];
                int cols = (int)additionalParams[1];
                if (rows < 0 || cols < 0 || rows > MapGenerator.MAX_ROWS || cols > MapGenerator.MAX_COLS)
                {
                    throw new ArgumentException(string.Format("Rows must be between {0} and {1} and columns must be between {2} and {3}", 0, MapGenerator.MAX_ROWS, 0, MapGenerator.MAX_COLS));
                }
                return(new MapGenerateEmpty(rows, cols));

            case "file":
                if (!(additionalParams[0] is string))
                {
                    throw new ArgumentException(string.Format("Argument must contain filename"));
                }
                return(new MapGeneratorFromFile((string)additionalParams[0]));

            default:
                throw new ArgumentException(string.Format("Unrecognized map generator type {0}", type));
            }
        }
        static void Main()
        {
            List <PlayerInput> playerInputs = new List <PlayerInput>();
            PlayerInputFactory pif          = new PlayerInputFactory();

            playerInputs.Add(pif.GetPlayerInput(playerInputs.Count, "local", ConsoleKey.W, ConsoleKey.D, ConsoleKey.S, ConsoleKey.A));
            playerInputs.Add(pif.GetPlayerInput(playerInputs.Count, "local", ConsoleKey.UpArrow, ConsoleKey.RightArrow, ConsoleKey.DownArrow, ConsoleKey.LeftArrow));
            playerInputs.Add(pif.GetPlayerInput(playerInputs.Count, "local", ConsoleKey.I, ConsoleKey.L, ConsoleKey.K, ConsoleKey.J));

            //Generating map
            MapGeneratorFactory mgf = new MapGeneratorFactory();
            //MapGenerator mg = mgf.GetMapGenerator("empty", 25, 100);

            var          rm = new MapRandomGenerator();//hacked
            MapGenerator mg = mgf.GetMapGenerator("file", rm.CurrentRandomMap);

            VisualizerFactory vf = new VisualizerFactory();

            GameEngine engine = new GameEngine();

            CommandDispatcher cd = new CommandDispatcher();

            foreach (PlayerInput pi in playerInputs)
            {
                cd.AddCommandGenerator(pi);
            }

            cd.AddCommandReciever(engine);

            Visualizer vis = vf.GetVisualizer("console", engine);

            for (int i = 0; i < playerInputs.Count; i++)
            {
                engine.AddPlayer(i);
            }
            engine.LoadMap(mg);
            engine.StartGame();

            DateTime lastAdvanceTime = DateTime.UtcNow;

            while (true)
            {
                TimeSpan timeDiff        = DateTime.UtcNow - lastAdvanceTime;
                int      millisecondDiff = (int)timeDiff.TotalMilliseconds;
                if (millisecondDiff >= GAME_TICK_LENGTH_MS)
                {
                    cd.DispatchCommands();
                    engine.AdvanceOneTick();
                    vis.VisualizeNow();
                    lastAdvanceTime = lastAdvanceTime.AddMilliseconds(GAME_TICK_LENGTH_MS);
                    if (!engine.IsGameRunning)
                    {
                        break;
                    }
                }
                else
                {
                    Thread.Sleep(GAME_TICK_LENGTH_MS - millisecondDiff);
                }
            }
            if (engine.IsGameDraw)
            {
                vis.DisplayMessage("The game ended in a draw!");
            }
            else
            {
                vis.DisplayMessage(string.Format("Player {0} won the game!", engine.WinningPlayerId));
            }
            ConsoleKeyInfo key;

            do
            {
                key = Console.ReadKey(true);
            } while (key.Key != ConsoleKey.Escape);
        }