public void DealCards(Deck deck, CardStack playerOne, CardStack playerTwo)
        {
            deck.GetAllCards();

            ShuffleStrategyFactory shuffleStrategyFactory = new ShuffleStrategyFactory();

            deck.Shuffle(shuffleStrategyFactory.Create(ShuffleAlgorithm.Knuth));

            var jokers = deck.DrawAll(Rank.Joker, Suit.None);

            playerOne.Add(jokers);
            playerTwo.Add(deck.DrawCards(jokers.Count));

            //TODO duplicate of RandomHandoutStrategy - could use that strategy for the rest of the deck.
            var cardCount = 0;

            while (deck.TryDrawCard(out Card c))
            {
                cardCount++;
                if (cardCount % 2 == 0)
                {
                    playerOne.Add(c);
                }
                else
                {
                    playerTwo.Add(c);
                }
            }
        }
Пример #2
0
 public void Next()
 {
     if (NextPlayer == currentTurn.StartingPlayer && Stack.Count != 0)
     {
         if (tricksUpdated)
         {
             tricksUpdated = false;
             Stack         = new CardStack();
             currentTurn   = log.Turns[TurnIndex++];
             NextPlayer    = currentTurn.StartingPlayer;
         }
         else
         {
             Players[currentTurn.WinningPlayer].Tricks[currentTurn.Trick] += (currentTurn.Trick == Color.Black) ? +1 : -1;
             tricksUpdated = true;
         }
     }
     else
     {
         Card card = currentTurn.Cards[NextPlayer];
         Stack.Add(card);
         Players[NextPlayer].Hand.Remove(card);
         NextPlayer = (NextPlayer + 1) % log.PlayerCount;
     }
 }
        public void GIVEN_a_card_stack_WHEN_add_called_with_null_THEN_exception_is_thrown()
        {
            // Arrange
            var cardStack = new CardStack();

            // Act
            cardStack.Add(null);
        }
        public void GIVEN_a_card_stack_with_two_cards_WHEN_top_card_is_called_THEN_last_card_added_is_returned()
        {
            // Arrange
            var fakeCard1 = new FakeCard(1, null);
            var fakeCard2 = new FakeCard(2, null);
            var cardStack = new CardStack();

            cardStack.Add(fakeCard1);
            cardStack.Add(fakeCard2);

            // Act

            var result = cardStack.TopCard();

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Fake2", result.Name);
        }
        public void GIVEN_a_card_stack_WHEN_add_called_with_a_card_THEN_card_is_added()
        {
            // Arrange
            var fakeCard  = new FakeCard(1, null);
            var cardStack = new CardStack();

            // Act
            cardStack.Add(fakeCard);
            var result = cardStack.HasCards();

            // Assert
            Assert.IsTrue(result);
        }
Пример #6
0
        // Should only be called on one of the 7 columns and when FaceUpStack is empty but FaceDownStack has cards.
        public void FlipCardUp(int stackIndex)
        {
            if (stackIndex < 1 || stackIndex > columns.Count)
            {
                throw new IndexOutOfRangeException();
            }

            CardStack faceDownStack = columns[stackIndex - 1].FaceDownStack;
            CardStack faceUpStack   = columns[stackIndex - 1].FaceUpStack;

            Card selectedCard = faceDownStack.DrawCard();

            faceUpStack.Add(selectedCard);
        }
        public void GIVEN_a_card_stack_with_one_card_WHEN_top_card_is_called_THEN_card_is_returned()
        {
            // Arrange
            var fakeCard  = new FakeCard(1, null);
            var cardStack = new CardStack();

            cardStack.Add(fakeCard);

            // Act

            var result = cardStack.TopCard();

            // Assert
            Assert.IsNotNull(result);
        }
        public void GIVEN_a_card_stack_that_has_a_card_WHEN_get_cards_is_called_THEN_a_card_is_returned()
        {
            // Arrange
            var fakeCard  = new FakeCard(1, null);
            var cardStack = new CardStack();

            cardStack.Add(fakeCard);

            // Act
            var result = cardStack.GetCards().ToList();

            // Assert
            Assert.AreEqual(1, result.Count);
            Assert.AreEqual("Fake1", result.First().Name);
        }
Пример #9
0
    void PlayCard()
    {
        // for bot only
        if (transform.parent.ToString().Contains("Player"))
        {
            CardStack dealer = GameObject.Find("Dealer").GetComponent <CardStack>();
            Player    player = transform.parent.GetComponent <Player>();

            if (player.isPlayerTurn &&
                !player.isHuman &&
                !player.playerStack.isGameStack)
            {
                //dealer.Add(player.playerStack.Remove(card));
                dealer.Add(player.playerStack.TransferCard(card, dealer));
            }
        }
    }
Пример #10
0
        // TODO: Abstract a lot of this out into a new SolitaireGameBuilder class.
        public SolitaireGame()
        {
            StatusMessages = new List <string>();

            deck = new DeckBuilder().BuildDeck(true);

            drawStack = new CardStack(true);
            drawer    = new SolitaireDrawer();

            columns = new List <StackColumn>();

            // Create 7 stacks of face down cards.
            for (int i = 0; i < 7; i++)
            {
                CardStack   stack  = new CardStack(false);
                StackColumn column = new StackColumn();
                column.FaceDownStack = stack;
                columns.Add(column);
            }

            // Distribute the cards across the stacks.
            for (int i = 0; i < 7; i++)
            {
                for (int ii = i; ii < 7; ii++)
                {
                    CardStack stack     = columns[ii].FaceDownStack;
                    Card      drawnCard = deck.DrawCard();
                    stack.Add(drawnCard);
                }
            }

            // Transfer top cards to their own stacks.
            for (int i = 0; i < columns.Count; i++)
            {
                StackColumn column        = columns[i];
                CardStack   faceDownStack = column.FaceDownStack;
                CardStack   faceUpStack   = new CardStack(true);
                Card        topCard       = faceDownStack.DrawCard();
                faceUpStack.Add(topCard);
                column.FaceUpStack = faceUpStack;
            }

            TransferCardToDrawStack();
        }
Пример #11
0
        public void DealCards(Deck deck, CardStack playerOne, CardStack playerTwo)
        {
            ShuffleStrategyFactory shuffleStrategyFactory = new ShuffleStrategyFactory();

            deck.Shuffle(shuffleStrategyFactory.Create(ShuffleAlgorithm.Knuth));

            var cardCount = 0;

            while (deck.TryDrawCard(out Card c))
            {
                cardCount++;
                if (cardCount % 2 == 0)
                {
                    playerOne.Add(c);
                }
                else
                {
                    playerTwo.Add(c);
                }
            }
        }
Пример #12
0
    void OnMouseUp()
    {
        if (mousePosition != Input.mousePosition)
        {
            return;
        }
        //Debug.Log("Id: " + card.id);
        //Debug.Log("Rank: " + card.rank);
        //Debug.Log("Suit: " + card.suit);

        if (transform.parent.ToString().Contains("Player"))
        {
            CardStack dealer = GameObject.Find("Dealer").GetComponent <CardStack>();
            Player    player = transform.parent.GetComponent <Player>();

            if (player.isPlayerTurn &&
                player.localPlayer &&
                !player.playerStack.isGameStack)
            {
                //dealer.Add(player.playerStack.Remove(card));
                dealer.Add(player.playerStack.TransferCard(card, dealer));
            }
        }
    }
Пример #13
0
        private void TransferCardToDrawStack()
        {
            Card drawnCard = deck.DrawCard();

            drawStack.Add(drawnCard);
        }
Пример #14
0
        // Function: bkw_DoWork
        // Runs the BlackJack game
        private void bkw_DoWork(object sender, DoWorkEventArgs e)
        {
            // create a shoe of cards containing 7 decks
            shoe = new CardStack(7);

            // shuffle the shoe
            shoe.Shuffle();

            // create dealer's hand
            CardStack dealerCards = new CardStack();

            // loop until cancelled
            while (!bkw.CancellationPending)
            {
                // if shoe contains 52 cards or less, then reset the shoe to 7 decks
                if (shoe.Count() <= 52)
                {
                    // reset (refill with cards)
                    shoe.Reset();
                    // shuffle cards
                    shoe.Shuffle();
                }

                // update server GUI
                UpdateCardsLeft(shoe.Count());

                // create copy of current player list so that it doesn't change during the round
                List <Player> thisRoundPlayers = new List <Player>(playerList);

                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    if (!serverPlayer.isPlaying)
                    {
                        playerList.Remove(serverPlayer);
                    }
                }

                // if no players, then stop the game
                if (playerList.Count == 0)
                {
                    return;
                }

                // create copy of current player list so that it doesn't change during the round
                thisRoundPlayers = new List <Player>(playerList);

                // get each player's bet
                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    if (serverPlayer.GetMoney() <= 0)
                    {
                        serverPlayer.OutOfMoney();
                        DisconnectPlayer(serverPlayer);
                        continue;
                    }

                    // ask for player's bet
                    serverPlayer.AskForBet();

                    string[] playerMessage;

                    try
                    {
                        // split the message to parse it
                        playerMessage = serverPlayer.Read().Split(":".ToCharArray());
                    }
                    catch
                    {
                        // remove them from the lists
                        if (playerList.Contains(serverPlayer))
                        {
                            playerList.Remove(serverPlayer);
                        }

                        // mark player as not playing
                        serverPlayer.isPlaying = false;

                        // update status to disconnected
                        SetPlayerStatus(serverPlayer.GetPlayerNum(), "Disconnected");

                        // go to next player
                        continue;
                    }

                    // if disconnected
                    if (playerMessage[0] == "disconnect")
                    {
                        // disconnected them
                        DisconnectPlayer(serverPlayer);

                        // go to next player
                        continue;
                    }

                    // get bet from the player
                    if (playerMessage[0] != "bet")
                    {
                        throw new Exception("expected a bet.");
                    }

                    int bet;

                    // parse the second part of message for bet amount
                    if (!int.TryParse(playerMessage[1], out bet))
                    {
                        throw new Exception("expected a number for the bet.");
                    }

                    // clear their hand
                    serverPlayer.ClearCards();

                    try
                    {
                        // place the bet
                        PlayerBet(serverPlayer, bet);
                    }
                    catch
                    {
                        // disconnect them
                        DisconnectPlayer(serverPlayer);

                        // go to next player
                        continue;
                    }
                }

                // give each player first card
                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    // give them the card
                    GivePlayerCard(serverPlayer, shoe.DrawCard());

                    // update server GUI
                    UpdateCardsLeft(shoe.Count());
                }

                // give each player 2nd card and, if they hit, other cards
                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    string playerMessage = "";

                    do
                    {
                        // give them a card
                        GivePlayerCard(serverPlayer, shoe.DrawCard());

                        // update cards left server GUI
                        UpdateCardsLeft(shoe.Count());

                        // stop if busted
                        if (serverPlayer.GetPoints() >= 21)
                        {
                            break;
                        }

                        // ask for hit or stand
                        serverPlayer.AskHitOrStand();

                        try
                        {
                            // get their response
                            playerMessage = serverPlayer.Read();
                        }
                        catch
                        {
                            // disconnected player
                            DisconnectPlayer(serverPlayer);
                            // go to next player
                            continue;
                        }

                        // while they hit, haven't busted, and have less than 5 cards: keep dealing them cards
                    } while (playerMessage == "hit" && serverPlayer.GetPoints() <= 21 && serverPlayer.GetCards().Count() < 5);

                    // check if they busted
                    if (serverPlayer.GetPoints() > 21)
                    {
                        serverPlayer.Bust();
                    }

                    // if disconnect message
                    else if (playerMessage == "disconnect")
                    {
                        // disconnect them
                        DisconnectPlayer(serverPlayer);
                    }

                    // check if they gave a bad response
                    else if (playerMessage != "stand" && playerMessage != "hit" && playerMessage != "" && playerMessage != null)
                    {
                        throw new Exception("expected hit, stand, or disconnect response");
                    }
                }

                // check if all players busted
                bool allBusted = true;

                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    allBusted = allBusted && serverPlayer.IsBusted();
                }

                // If all players busted, the hand ends automatically without the dealer having to play their hand
                if (allBusted)
                {
                    foreach (Player serverPlayer in thisRoundPlayers)
                    {
                        theServer.SendAll(serverPlayer.GetPlayerNum() + ":lost");
                    }

                    // clear each player's hand
                    foreach (Player serverPlayer in thisRoundPlayers)
                    {
                        serverPlayer.Clear();
                        ClearCardList(serverPlayer.GetPlayerNum());
                    }

                    // clear dealer's hand
                    dealerCards.Clear();
                    ClearCardList(-100);

                    // end this round
                    theServer.SendAll("roundover");
                    continue;
                }

                // if not all players busted:

                // give dealer first card
                Card drawnCard = shoe.DrawCard();
                dealerCards.Add(drawnCard);
                // update cards left label
                UpdateCardsLeft(shoe.Count());

                // send card to clients
                theServer.SendAll("dealer:card:" + drawnCard.GetSymbol() + ":" + drawnCard.GetSuit());

                // give dealer second card, and hit while points < 17
                do
                {
                    // draw card from the shoe
                    drawnCard = shoe.DrawCard();

                    // add the card to dealer's hand
                    dealerCards.Add(drawnCard);

                    // send the card to clients
                    theServer.SendAll("dealer:card:" + drawnCard.GetSymbol() + ":" + drawnCard.GetSuit());

                    // update server GUI
                    AddCardToList(listBox_Dealer, drawnCard);
                    UpdateCardsLeft(shoe.Count());
                } while (dealerCards.GetPoints() < 17);

                // check if dealer busted
                bool dealerBusted = !(dealerCards.GetPoints() <= 21);

                // check for winners
                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    // if player got blackjack and dealer did not, then 3 to 2 bet return
                    if ((serverPlayer.GetCards().Count == 2) && (serverPlayer.GetPoints() == 21) && ((dealerCards.GetPoints() != 21) || dealerBusted))
                    {
                        // calculate new amount of money
                        int newMoney = serverPlayer.GetMoney() + serverPlayer.GetBet() + (3 / 2) * serverPlayer.GetBet();

                        // set player's bet to 0
                        PlayerBet(serverPlayer, 0);

                        // update gui and send money to clients
                        UpdatePlayerMoney(serverPlayer, newMoney);

                        // send clients message that this player won with a "blackjack"
                        theServer.SendAll(serverPlayer.GetPlayerNum() + ":blackjack");
                    }
                    // if dealer busted and player did not, or neither busted but player got more points, then 1 to 1 bet return
                    else if ((dealerBusted || (serverPlayer.GetPoints() > dealerCards.GetPoints())) && !serverPlayer.IsBusted())
                    {
                        // calculate new amount of money
                        int newMoney = serverPlayer.GetMoney() + 2 * serverPlayer.GetBet();

                        // set player's bet to 0
                        PlayerBet(serverPlayer, 0);

                        // update gui and send money to clients
                        UpdatePlayerMoney(serverPlayer, newMoney);

                        // send clients message that this player won
                        theServer.SendAll(serverPlayer.GetPlayerNum() + ":won");
                    }
                    // if tied (push), then just return bet
                    else if ((dealerCards.GetPoints() <= 21) && (serverPlayer.GetPoints() == dealerCards.GetPoints()))
                    {
                        // calculate new amount of money
                        int newMoney = serverPlayer.GetMoney() + serverPlayer.GetBet();

                        // set player's bet to 0
                        PlayerBet(serverPlayer, 0);

                        // update gui and send money to clients
                        UpdatePlayerMoney(serverPlayer, newMoney);

                        // send clients message that this player pushed
                        theServer.SendAll(serverPlayer.GetPlayerNum() + ":push");
                    }
                    // otherwise, player lost their bet
                    else
                    {
                        // set player's bet to 0
                        PlayerBet(serverPlayer, 0);

                        // send clients message that this player lost
                        theServer.SendAll(serverPlayer.GetPlayerNum() + ":lost");
                    }
                }

                // clear each player's hand
                foreach (Player serverPlayer in thisRoundPlayers)
                {
                    serverPlayer.Clear();
                    ClearCardList(serverPlayer.GetPlayerNum());
                }

                // clear dealer's hand
                dealerCards.Clear();
                ClearCardList(-100);

                // send round over message
                theServer.SendAll("roundover");
            }
        }
Пример #15
0
 public void Deal(Card aCard)
 {
     playerCardStack.Add(aCard);
 }