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(); } } }