public void Update(GameTime gameTime)
        {
            KeyboardState kbState = Keyboard.GetState();

            Keys[] pressedKeys = kbState.GetPressedKeys();
            foreach (Keys key in pressedKeys)
            {
                if (key == Keys.Escape)
                {
                    Screens.ScreenManager.GotoScreen("menu");
                    return;
                }
            }
            CardPile.Update(gameTime);
            foreach (Player player in Players)
            {
                player.Update(gameTime);
            }
            if (CurrentPlayState == PlayState.DEAL)
            {
                elapsedTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
                // Handle deal state
                if (elapsedTime > 0.3f)
                {
                    foreach (Player player in Players)
                    {
                        if (player.HandCardCount() < 3)
                        {
                            player.AddHandCards(Deck.DrawCard());
                        }
                        else if (player.TableFlippedCardCount() < 3)
                        {
                            player.AddTableFlippedCards(Deck.DrawCard());
                        }
                        else
                        {
                            player.AddTableCards(Deck.DrawCard());
                        }
                    }
                    if (Players.ElementAt(0).TableCardCount() == 3)
                    {
                        CurrentPlayState = PlayState.SWAP;
                        SwapState();
                    }
                    elapsedTime = 0f;
                }
            }
            else if (CurrentPlayState == PlayState.SWAP)
            {
                elapsedTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (elapsedTime > 15f)
                {
                    elapsedTime      = 0f;
                    CurrentPlayState = PlayState.PLAY;
                    AddPlayedCards(Deck.DrawCard());
                }
                else
                {
                    foreach (Player player in Players)
                    {
                        PlayerAction action = player.HandleInput(gameTime, this);
                        if (action != null && action.Type == PlayerActionType.SWAP_CARD && action.Cards.Count > 1)
                        {
                            Card handCard = action.Cards[0];
                            Card swapCard = action.Cards[1];
                            player.RemoveCard(handCard);
                            player.RemoveCard(swapCard);
                            player.AddHandCards(swapCard);
                            player.AddTableCards(handCard);
                        }
                    }
                }
            }
            else if (CurrentPlayState == PlayState.PLAY)
            {
                // Handle play state
                if (CurrentPlayer != null)
                {
                    if (CurrentPlayer.HasNoCardsLeft())
                    {
                        CurrentPlayState = PlayState.WON;
                        PlayerWinner();
                    }
                    else
                    {
                        PlayerAction action = CurrentPlayer.HandleInput(gameTime, this);
                        if (action != null)
                        {
                            if (action.Type == PlayerActionType.PLAY_CARD)
                            {
                                if (!PlayCards(action.Cards.ToArray()))
                                {
                                    if (CurrentPlayer.HandCardCount() == 0 || CurrentPlayer.HandCardCount() == 0 && CurrentPlayer.TableCardCount() == 0)
                                    {
                                        // Trying to play a flipped card
                                        foreach (Card card in action.Cards)
                                        {
                                            CurrentPlayer.RemoveCard(card);
                                            CurrentPlayer.AddHandCards(card);
                                        }
                                        PlayedCards(action.Cards.ToArray());
                                        List <Card> pickedUpCards = new List <Card>();
                                        while (CardPile.Pile.Count > 0)
                                        {
                                            Card pickedUpCard = CardPile.Pile.Pop();
                                            pickedUpCards.Add(pickedUpCard);
                                            CurrentPlayer.AddHandCards(pickedUpCard);
                                        }
                                        PickedUpCards(pickedUpCards.ToArray());
                                        NextPlayer();
                                    }
                                    foreach (Card card in action.Cards)
                                    {
                                        card.ResetPosition();
                                    }
                                }
                                else
                                {
                                    // Played a normal hand
                                    while (Deck.CanDrawCard() && CurrentPlayer.HandCardCount() < 3)
                                    {
                                        CurrentPlayer.AddHandCards(Deck.DrawCard());
                                    }
                                    PlayedCards(action.Cards.ToArray());
                                    if (!EvaluateCards(action.Cards.ElementAt(0)))
                                    {
                                        NextPlayer();
                                    }
                                }
                            }
                            else if (action.Type == PlayerActionType.PICK_UP_CARDS)
                            {
                                List <Card> pickedUpCards = new List <Card>();
                                while (CardPile.Pile.Count > 0)
                                {
                                    Card pickedUpCard = CardPile.Pile.Pop();
                                    pickedUpCards.Add(pickedUpCard);
                                    CurrentPlayer.AddHandCards(pickedUpCard);
                                }
                                PickedUpCards(pickedUpCards.ToArray());
                                NextPlayer();
                            }
                            else if (action.Type == PlayerActionType.TRY_CARD)
                            {
                                Card card = DrawCard();
                                if (card != null)
                                {
                                    CurrentPlayer.AddHandCards(card);
                                    TriedFromDeck();
                                }
                            }
                        }
                    }
                }
                else
                {
                    // Set random player as the current player
                    Random random = new Random();
                    CurrentPlayer = Players.ElementAt(random.Next(Players.Count - 1));
                    NewTurn();
                }
            }
            else if (CurrentPlayState == PlayState.WON)
            {
                elapsedTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (elapsedTime > 5f)
                {
                    foreach (Player player in Players)
                    {
                        player.ResetCards();
                    }
                    Deck = Deck.CreateFullDeck(Deck.Position.X, Deck.Position.Y);
                    Deck.Shuffle();
                    CardPile.Pile.Clear();
                    CurrentPlayState = PlayState.DEAL;
                    elapsedTime      = 0f;
                }
            }
        }
 public override PlayerAction HandleInput(GameTime gameTime, GameState state)
 {
     // Local input
     if (GameCursor.LeftMouseState(gameTime) == MouseAction.CLICK)
     {
         // Check if you can't play
         if (state.GetDeck().Contains(GameCursor.MousePosition()) && state.GetDeck().CanDrawCard() && GameCursor.SelectedCards.Count == 0)
         {
             return(new PlayerAction(PlayerActionType.TRY_CARD));
         }
         else if (state.GetPile().Contains(GameCursor.MousePosition()) && GameCursor.SelectedCards.Count == 0 && state.GetPile().Pile.Count > 0)
         {
             return(new PlayerAction(PlayerActionType.PICK_UP_CARDS));
         }
         else
         {
             Card card = SelectedCard(GameCursor.MousePosition());
             if (card != null && GameCursor.SelectedCards.Count == 0 && (selectedCards.Count == 0 || selectedCards.ElementAt(0).CompareTo(card) == 0))
             {
                 List <Card> tempCards = new List <Card>();
                 tempCards.AddRange(selectedCards);
                 if (!selectedCards.Contains(card))
                 {
                     tempCards.Add(card);
                 }
                 selectedCards.Clear();
                 GameCursor.SelectedCards.AddRange(tempCards);
             }
         }
     }
     else if (GameCursor.RightMouseState(gameTime) == MouseAction.CLICK)
     {
         Card card = SelectedCard(GameCursor.MousePosition());
         if (card != null && !GameCursor.SelectedCards.Contains(card))
         {
             if (selectedCards.Contains(card))
             {
                 selectedCards.Remove(card);
             }
             else if (selectedCards.Count == 0)
             {
                 selectedCards.Add(card);
             }
             else if (selectedCards.ElementAt(0).CompareTo(card) == 0)
             {
                 selectedCards.Add(card);
             }
         }
     }
     else if (GameCursor.LeftMouseState(gameTime) == MouseAction.RELEASE)
     {
         if (state.GetPile().Contains(GameCursor.MousePosition()) && GameCursor.SelectedCards.Count > 0)
         {
             Card[] cards = GameCursor.SelectedCards.ToArray();
             foreach (Card card in cards)
             {
                 card.ResetPosition();
             }
             GameCursor.SelectedCards.Clear();
             return(new PlayerAction(PlayerActionType.PLAY_CARD, cards));
         }
         else
         {
             PlayerAction action = null;
             foreach (Card tableCard in tableCards)
             {
                 if (tableCard.Contains(GameCursor.MousePosition()) && GameCursor.SelectedCards.Count > 0)
                 {
                     action = new PlayerAction(PlayerActionType.SWAP_CARD, GameCursor.SelectedCards[0], tableCard);
                 }
             }
             foreach (Card card in GameCursor.SelectedCards)
             {
                 card.ResetPosition();
             }
             GameCursor.SelectedCards.Clear();
             return(action);
         }
     }
     return(null);
 }