static void Game()
        {
            List <Player> Players = new List <Player>();

            Players.Add(new Player(1, true));
            Players.Add(new Player(2, false));
            Players[0].Leading = true; //Set Player One to lead trick
            List <Card> deck = Deal.CreateDeck();

            Decision.SetTrumps(deck, 3); //Set Spades as Trump
            Deal.DealToPlayers(Players, deck);
            Decision.DecideBids(Players);
            //Record Player 1 Hand
            HandRecord handRecord = Record.RecordHandInit(Players.FirstOrDefault(x => x.ID == 1));

            //Write out bids
            foreach (Player player in Players)
            {
                Console.WriteLine("Player: " + player.ID + " Bid: " + player.Bid);
            }
            //Write out Hands
            foreach (Player player in Players)
            {
                Console.WriteLine("Player " + player.ID + " Hand:");
                List <Card> OrderedHand = player.Hand.OrderBy(x => x.Value).OrderBy(x => x.suit.ID).ToList();
                foreach (Card card in OrderedHand)
                {
                    Console.WriteLine("Card ID: " + card.ID + " Card Value: " + card.ValueName + " of " + card.suit.SuitName);
                }
                Console.WriteLine("");
            }
            for (int i = 1; i < 11; i++)
            {
                Console.WriteLine("Game " + i);
                Decision.DecideCardToPlay(Players);
                Decision.PlayCard(Players);
            }
            //Work out wins
            foreach (Player player in Players)
            {
                Console.WriteLine("Player Wins: " + player.Wins + " Bid: " + player.Bid);
            }
            //Record if PlayerOne was successful
            if (Players.FirstOrDefault(x => x.ID == 1).Wins == Players.FirstOrDefault(x => x.ID == 1).Bid)
            {
                handRecord.GameWon = 1;
            }
            CSVWriter.WriteHandResult(handRecord);
        }
        int Game()
        {
            List <Player> Players = new List <Player>();

            Players.Add(new Player(1, true));
            Players.Add(new Player(2, false));
            Players[0].Leading = true; //Set Player One to lead trick
            List <Card> deck = Deal.CreateDeck();

            Decision.SetTrumps(deck, 3); //Set Spades as Trump
            Deal.DealToPlayers(Players, deck);
            Decision.DecideBids(Players);
            //Record Player 1 Hand
            HandRecord handRecord = Record.RecordHandInit(Players.FirstOrDefault(x => x.ID == 1));

            //Write out bids
            WriteBids(Players);
            //Write out Hands
            WriteHands(Players);
            for (int i = 1; i < 11; i++)
            {
                Console.WriteLine("Game " + i);
                Decision.DecideCardToPlay(Players);
                Decision.PlayCard(Players, true);
            }
            //Work out wins
            foreach (Player player in Players)
            {
                Console.WriteLine("Player Wins: " + player.Wins + " Bid: " + player.Bid);
            }
            //Record if PlayerOne was successful
            if (Players.FirstOrDefault(x => x.ID == 1).Wins == Players.FirstOrDefault(x => x.ID == 1).Bid)
            {
                handRecord.GameWon = 1;
            }
            CSVWriter.WriteHandResult(handRecord);
            return(handRecord.GameWon);
        }
        void Parser()
        {
            Console.WriteLine("Command:");
            String input = Console.ReadLine();

            if (input.ToLower() == "neural network init") // Neural Network
            {
                Console.WriteLine("Certain:");
                input = Console.ReadLine();

                if (input.ToLower() == "yes") // Neural Network
                {
                    //New Neural Network
                    List <int> NNLayers = new List <int>();
                    NNLayers.Add(52);
                    NNLayers.Add(52);
                    NNLayers.Add(52);
                    NeuralNetwork NewNeuralNetwork = new NeuralNetwork(NNLayers.ToArray());
                    NewNeuralNetwork.Save(NewNeuralNetwork);
                }
            }
            else if (input.ToLower() == "test random") // Neural Network
            {
                TotalWins  = 0;
                TotalGames = 0;
                int NumberOfRuns = 20;
                //Existing Neural Network Test
                NeuralNetwork neuralNetwork = new NeuralNetwork();
                neuralNetwork = neuralNetwork.Load();
                Program prog = new Program();
                for (int i = 0; i < NumberOfRuns; i++)
                {
                    List <Card> deck = Deal.CreateDeck();
                    TotalWins  += prog.GameNNTrainToWin(neuralNetwork, deck);
                    TotalGames += 10;
                }
                ;
                Console.WriteLine("");
                Console.WriteLine("Total Wins: " + TotalWins + " Total Games: " + TotalGames);
                neuralNetwork.fitness = (float)(TotalWins / TotalGames);
            }
            else if (input.ToLower() == "test neural network" || input.ToLower() == "test nn") // Neural Network
            {
                TotalWins  = 0;
                TotalGames = 0;
                int NumberOfRuns = 20;
                //Random Neural Network Test
                List <int> NNLayers = new List <int>();
                NNLayers.Add(52);
                NeuralNetwork NewNeuralNetwork = new NeuralNetwork(NNLayers.ToArray());
                Program       prog             = new Program();
                for (int i = 0; i < NumberOfRuns; i++)
                {
                    List <Card> deck = Deal.CreateDeck();
                    TotalWins  += prog.GameNNTrainToWin(NewNeuralNetwork, deck);
                    TotalGames += 10;
                }
                ;
                Console.WriteLine("");
                Console.WriteLine("Total Wins: " + TotalWins + " Total Games: " + TotalGames);
            }
            else if (input.ToLower() == "neural network engage" || input.ToLower() == "run nn") // Neural Network
            {
                Console.WriteLine("Number of Generations");
                input = Console.ReadLine();
                int NumberOfGenerations = 0;
                Console.WriteLine("Number of Runs");
                string inputTwo     = Console.ReadLine();
                int    NumberOfRuns = 0;
                if (int.TryParse(input, out NumberOfGenerations) && int.TryParse(inputTwo, out NumberOfRuns))
                {
                    for (int j = 0; j < NumberOfGenerations; j++)
                    {
                        List <List <Card> > decks    = new List <List <Card> >();
                        List <List <Card> > decksTwo = new List <List <Card> >();
                        //Create Deck List for NN to compete with
                        for (int i = 0; i < NumberOfRuns; i++)
                        {
                            List <Card> deck = Deal.CreateDeckNN();
                            decks.Add(deck);
                            List <Card> deckCopy = new List <Card>();
                            foreach (Card card in deck)
                            {
                                deckCopy.Add(card.Clone());
                            }
                            decksTwo.Add(deckCopy);
                        }
                        TotalWins  = 0;
                        TotalGames = 0;
                        //New Neural Network
                        List <int> NNLayers = new List <int>();
                        NNLayers.Add(52);
                        NNLayers.Add(52);
                        NNLayers.Add(52);
                        NNLayers.Add(52);
                        NeuralNetwork NewNeuralNetwork = new NeuralNetwork(NNLayers.ToArray());
                        //Existing Neural Network Test
                        NeuralNetwork neuralNetwork = new NeuralNetwork();
                        neuralNetwork = neuralNetwork.Load();
                        CompareNN(neuralNetwork, NewNeuralNetwork, NumberOfRuns, decks, decksTwo);
                        if (NewNeuralNetwork.fitness > neuralNetwork.fitness)
                        {
                            Console.WriteLine("Old Fitness: " + neuralNetwork.fitness + " New Fitness: " + NewNeuralNetwork.fitness);
                            Console.WriteLine("Comparing");
                            NewNeuralNetwork.Save(NewNeuralNetwork);
                            Console.WriteLine("OVERWRITE");
                        }
                    }
                }
            }
            if (input.ToLower() == "run")
            {
                TotalWins  = 0;
                TotalGames = 0;
                Console.WriteLine("How many runs:");
                input = Console.ReadLine();
                int NumberOfRuns = 0;
                if (int.TryParse(input, out NumberOfRuns))
                {
                    for (int i = 0; i < NumberOfRuns; i++)
                    {
                        Program prog = new Program();
                        TotalWins += prog.Game();
                        TotalGames++;
                    }
                }
                else
                {
                    Console.WriteLine("Invalid input");
                }

                Console.WriteLine("");
                Console.WriteLine("Win Rate:" + Math.Round(((TotalWins / TotalGames) * 100), 2).ToString() + "%");
            }
            else if (input.ToLower() == "exit" || input.ToLower() == "quit")
            {
                System.Environment.Exit(1);
            }

            Parser();
        }