Пример #1
0
 public void Update()
 {
     if (CurrentPlayState == PlayState.NONE && Players.Count == 4)
     {
         StartGame();
     }
     foreach (Player player in Players.ToList())
     {
         if (player is NetworkPlayer)
         {
             NetworkPlayer networkPlayer = (NetworkPlayer)player;
             if (!networkPlayer.IsConnected())
             {
                 Broadcast(MessageParser.PlayerRemovedToString(player.Name));
                 Players.Remove(player);
                 Console.WriteLine("Player {0} left", player.Name);
                 if (CurrentPlayer == player)
                 {
                     NextPlayer();
                 }
             }
         }
     }
     if (CurrentPlayState == PlayState.DEAL)
     {
         if (stopWatch.ElapsedMilliseconds > 300)
         {
             foreach (Player player in Players)
             {
                 if (player.HandCardCount() < 3)
                 {
                     Card card = Deck.DrawCard();
                     player.AddHandCards(card);
                     Console.WriteLine("{0} received {1}", player.Name, card.ToString());
                     Broadcast(MessageParser.PlayerReceivedToString(player, card));
                 }
                 else if (player.TableFlippedCardCount() < 3)
                 {
                     Card card = Deck.DrawCard();
                     player.AddTableFlippedCards(card);
                     Console.WriteLine("{0} received {1}", player.Name, card.ToString());
                     Broadcast(MessageParser.PlayerReceivedToString(player, card));
                 }
                 else
                 {
                     Card card = Deck.DrawCard();
                     player.AddTableCards(card);
                     Console.WriteLine("{0} received {1}", player.Name, card.ToString());
                     Broadcast(MessageParser.PlayerReceivedToString(player, card));
                 }
             }
             if (Players.ElementAt(0).TableCardCount() == 3)
             {
                 CurrentPlayState = PlayState.SWAP;
                 Console.WriteLine("Changed STATE to SWAP!");
                 Broadcast(MessageParser.PlayStateToString(CurrentPlayState));
             }
             stopWatch.Restart();
         }
     }
     else if (CurrentPlayState == PlayState.SWAP)
     {
         if (stopWatch.ElapsedMilliseconds > 15000)
         {
             CurrentPlayState = PlayState.PLAY;
             Card drawCard = Deck.DrawCard();
             AddPlayedCards(drawCard);
             Console.WriteLine("Changed STATE to PLAY!");
             Broadcast(MessageParser.FirstCardToString(drawCard));
             Console.WriteLine("First card is {0}", drawCard.ToString());
             Broadcast(MessageParser.PlayStateToString(CurrentPlayState));
             stopWatch.Stop();
         }
         else
         {
             foreach (Player player in Players)
             {
                 PlayerAction action = player.HandleInput(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);
                     Console.WriteLine("{0} swapped {1} with {2}", player.Name, handCard.ToString(), swapCard.ToString());
                     Broadcast(MessageParser.SwapCardToString(player, handCard, swapCard));
                 }
             }
         }
     }
     else if (CurrentPlayState == PlayState.PLAY)
     {
         // Handle play state
         if (CurrentPlayer != null)
         {
             if (CurrentPlayer.HasNoCardsLeft())
             {
                 CurrentPlayState = PlayState.WON;
                 Console.WriteLine("Changed STATE to WON!");
                 stopWatch.Start();
                 Broadcast(MessageParser.PlayerWonToString(CurrentPlayer));
             }
             else
             {
                 PlayerAction action = CurrentPlayer.HandleInput(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);
                                 }
                                 Console.WriteLine("{0} tried {1}", CurrentPlayer.Name, action.Cards[0].ToString());
                                 Broadcast(MessageParser.PlayerTriedCards(action.Cards));
                                 List <Card> pickedUpCards = new List <Card>();
                                 while (Pile.Count > 0)
                                 {
                                     Card pickedUpCard = Pile.Pop();
                                     pickedUpCards.Add(pickedUpCard);
                                     CurrentPlayer.AddHandCards(pickedUpCard);
                                 }
                                 Console.WriteLine("{0} picked up cards", CurrentPlayer.Name);
                                 Broadcast(MessageParser.PlayerPickupCardsToString(CurrentPlayer, pickedUpCards.ToArray()));
                                 NextPlayer();
                             }
                         }
                         else
                         {
                             // Played a normal hand
                             while (Deck.CanDrawCard() && CurrentPlayer.HandCardCount() < 3)
                             {
                                 Card card = Deck.DrawCard();
                                 CurrentPlayer.AddHandCards(card);
                                 Broadcast(MessageParser.PlayerDeckCardToString(card));
                             }
                             Console.WriteLine("{0} played {1}", CurrentPlayer.Name, action.Cards[0].ToString());
                             Broadcast(MessageParser.CardsPlayedToString(CurrentPlayer, 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 (Pile.Count > 0)
                         {
                             Card pickedUpCard = Pile.Pop();
                             pickedUpCards.Add(pickedUpCard);
                             CurrentPlayer.AddHandCards(pickedUpCard);
                         }
                         Console.WriteLine("{0} picked up cards", CurrentPlayer.Name);
                         Broadcast(MessageParser.PlayerPickupCardsToString(CurrentPlayer, pickedUpCards.ToArray()));
                         NextPlayer();
                     }
                     else if (action.Type == PlayerActionType.TRY_CARD)
                     {
                         Card card = DrawCard();
                         if (card != null)
                         {
                             CurrentPlayer.AddHandCards(card);
                             Console.WriteLine("{0} tried {1}", CurrentPlayer.Name, card.ToString());
                             Broadcast(MessageParser.PlayerTriedFromDeckToString(card));
                         }
                     }
                 }
             }
         }
         else
         {
             // Set random player as the current player
             Random random = new Random();
             CurrentPlayer = Players.ElementAt(random.Next(Players.Count - 1));
             Broadcast(MessageParser.ToPlayerTurn(CurrentPlayer));
         }
     }
     else if (CurrentPlayState == PlayState.WON)
     {
         if (stopWatch.ElapsedMilliseconds > 5000)
         {
             foreach (Player player in Players)
             {
                 player.ResetCards();
             }
             Deck = Deck.CreateFullDeck();
             Deck.Shuffle();
             Pile.Clear();
             CurrentPlayState = PlayState.DEAL;
             stopWatch.Restart();
         }
     }
 }
        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 void Update(GameTime gameTime)
        {
            CardPile.Update(gameTime);
            foreach (Player player in Players)
            {
                player.Update(gameTime);
            }
            String response = networkThread.GetLatestMessage();

            if (response != null)
            {
                if (response.StartsWith("NEW_PLAYER"))
                {
                    AddPlayer(MessageParser.ToPlayerUsername(response));
                    PlayerJoined(Players.ElementAt(Players.Count - 1));
                }
                else if (response.StartsWith("REMOVE_PLAYER"))
                {
                    String username = MessageParser.ToReceivedPlayer(response);
                    Player player   = GetPlayerFromName(username);
                    Players.Remove(player);
                }
                else if (response.StartsWith("PLAYER_WON"))
                {
                    PlayerWinner();
                }
                else if (response.StartsWith("PLAYER_RECEIVE_CARD"))
                {
                    String username = MessageParser.ToReceivedPlayer(response);
                    Card   card     = MessageParser.ToPlayerReceivedCard(response);
                    Deck.DrawCard();
                    card.SetOriginPosition(Deck.Position.X, Deck.Position.Y, false);
                    Player player = GetPlayerFromName(username);
                    if (player != null)
                    {
                        if (CurrentPlayState == PlayState.DEAL)
                        {
                            if (player.HandCardCount() < 3)
                            {
                                player.AddHandCards(card);
                            }
                            else if (player.TableFlippedCardCount() < 3)
                            {
                                player.AddTableFlippedCards(card);
                            }
                            else
                            {
                                player.AddTableCards(card);
                            }
                        }
                        else
                        {
                            player.AddHandCards(card);
                        }
                    }
                }
                else if (response.StartsWith("PLAY_STATE"))
                {
                    CurrentPlayState = MessageParser.ToPlayState(response);
                    if (CurrentPlayState == PlayState.SWAP)
                    {
                        SwapState();
                    }
                }
                else if (response.StartsWith("PLAYER_SWAP_CARD"))
                {
                    String username = MessageParser.ToReceivedPlayer(response);
                    Player player   = GetPlayerFromName(username);
                    if (player != null)
                    {
                        Card handCard  = player.GetCard(MessageParser.ToPlayerSwappedHandCard(response));
                        Card tableCard = player.GetCard(MessageParser.ToPlayerSwappedTableCard(response));
                        player.RemoveCard(handCard);
                        player.RemoveCard(tableCard);
                        player.AddHandCards(tableCard);
                        player.AddTableCards(handCard);
                    }
                }
                else if (response.StartsWith("PLAYER_TURN"))
                {
                    String username = MessageParser.ToReceivedPlayer(response);
                    CurrentPlayer = GetPlayerFromName(username);
                    NewTurn();
                }
                else if (response.StartsWith("FIRST_CARD"))
                {
                    Deck.DrawCard();
                    Card card = MessageParser.ToFirstCard(response);
                    card.SetOriginPosition(Deck.Position.X, Deck.Position.Y, false);
                    CardPile.AddCard(card);
                }
                else if (response.StartsWith("FLIPPED_PILE"))
                {
                    CardPile.FlipPile();
                    FlippedPile();
                }
                else if (response.StartsWith("CARDS_PLAYED"))
                {
                    Player      player   = GetPlayerFromName(MessageParser.ToReceivedPlayer(response));
                    Card[]      cards    = MessageParser.ToCardsPlayed(response);
                    List <Card> newCards = new List <Card>();
                    foreach (Card card in cards)
                    {
                        Card newCard = player.GetCard(card);
                        newCards.Add(newCard);
                    }
                    AddPlayedCards(player, newCards.ToArray());
                }
                else if (response.StartsWith("TRIED_FROM_DECK"))
                {
                    Deck.DrawCard();
                    Card card = MessageParser.ToFirstCard(response);
                    card.SetOriginPosition(Deck.Position.X, Deck.Position.Y, false);
                    CurrentPlayer.AddHandCards(card);
                }
                else if (response.StartsWith("PICKUP_CARDS"))
                {
                    Card[]      cards    = MessageParser.ToCardsPlayed(response);
                    List <Card> newCards = new List <Card>();
                    foreach (Card card in cards)
                    {
                        card.SetOriginPosition(CardPile.Position.X, CardPile.Position.Y, false);
                    }
                    CurrentPlayer.AddHandCards(cards);
                    CardPile.Pile.Clear();
                }
                else if (response.StartsWith("RECEIVE_CARD_DECK"))
                {
                    Deck.DrawCard();
                    Card card = MessageParser.ToFirstCard(response);
                    card.SetOriginPosition(Deck.Position.X, Deck.Position.Y, false);
                    CurrentPlayer.AddHandCards(card);
                }
                else if (response.StartsWith("TRIED_CARD"))
                {
                    Deck.DrawCard();
                    Card card    = MessageParser.ToFirstCard(response);
                    Card newCard = CurrentPlayer.GetCard(card);
                    CurrentPlayer.RemoveCard(newCard);
                    CurrentPlayer.AddHandCards(newCard);
                    PlayedCards(new Card[] { newCard });
                }
            }
            if (CurrentPlayState == PlayState.SWAP)
            {
                foreach (Player player in Players)
                {
                    if (player is LocalPlayer)
                    {
                        PlayerAction action = player.HandleInput(gameTime, this);
                        if (action != null)
                        {
                            networkThread.SendMessage(MessageParser.PlayerActionToString(action));
                        }
                    }
                }
            }
            else if (CurrentPlayState == PlayState.PLAY)
            {
                bool isLocalPlayer = false;
                if (CurrentPlayer is LocalPlayer)
                {
                    isLocalPlayer = true;
                    PlayerAction action = CurrentPlayer.HandleInput(gameTime, this);
                    if (action != null)
                    {
                        networkThread.SendMessage(MessageParser.PlayerActionToString(action));
                    }
                }
                if (!isLocalPlayer)
                {
                    foreach (Card card in GameCursor.SelectedCards)
                    {
                        card.ResetPosition();
                    }
                    GameCursor.SelectedCards.Clear();
                }
            }
        }