Example #1
0
        /// <summary>
        /// Returns true if the bidding is over, and performs some tasks
        /// related to the winning bid.
        /// </summary>
        /// <returns></returns>
        private bool isBiddingOver()
        {
            // Check if 3 players have passed, meaning 1 player has won the bid.
            int count = 0;

            foreach (Player p in players)
            {
                if (p.HasBidded == 0)
                {
                    count++;
                }
                else if (p.HasBidded == -1)
                {
                    count = 0;
                }
            }
            Debug.WriteLine(string.Format("Bid Count: {0}", count));
            if (count == 3)
            {
                // Find the player with the winning bid
                foreach (Player p in players)
                {
                    if (p.HasBidded == 1)
                    {
                        trumpSuit  = p.BiddedSuit;
                        trumpValue = (int)p.BiddedValue;

                        currentCallBlock.Text       = string.Format("{0}: {1} {2}", p.Name, trumpValue, trumpSuit);
                        currentCallBlock.Visibility = Visibility.Visible;

                        // If the winning bid is from the human player, do the kitty phase.
                        if (p.Name.Equals("South"))
                        {
                            showKittyCards();
                        }
                        else
                        {
                            // Otherwise have the AI process the kitty.
                            PlayerAI ai = (PlayerAI)p;
                            ai.pickKittyCards(this.kitty);
                        }

                        return(true);
                    }
                }
            } // If all 4 players pass, start again.
            else if (count == 4)
            {
                resetBiddingPhase();
                count = 0;
            }
            return(false);
        }
Example #2
0
        private void createPlayers()
        {
            players[0] = new PlayerAI("North");
            players[1] = new PlayerAI("East");
            players[2] = new Player("South");
            players[3] = new PlayerAI("West");

            players[0].Partner = players[2];
            players[1].Partner = players[3];
            players[2].Partner = players[0];
            players[3].Partner = players[1];
        }
Example #3
0
        private void addCardKnowledge()
        {
            PlayerAI ai1 = (PlayerAI)players[0];
            PlayerAI ai2 = (PlayerAI)players[1];
            PlayerAI ai3 = (PlayerAI)players[3];

            foreach (Card c in cardsInPlay)
            {
                ai1.CardsPlayedSoFar.Add(c);
                ai2.CardsPlayedSoFar.Add(c);
                ai3.CardsPlayedSoFar.Add(c);
            }
        }
Example #4
0
        private void setAITrickCard(PlayerAI ai, Card c)
        {
            switch (ai.Name)
            {
            case "North":
                trickCardNorth.Source = c.ImgSource;
                break;

            case "East":
                trickCardEast.Source = c.ImgSource;
                break;

            case "West":
                trickCardWest.Source = c.ImgSource;
                break;
            }
        }
Example #5
0
        private void playNewRound()
        {
            northBid.Visibility           = Visibility.Collapsed;
            northBid.Text                 = "";
            eastBid.Visibility            = Visibility.Collapsed;
            eastBid.Text                  = "";
            southBid.Visibility           = Visibility.Collapsed;
            southBid.Text                 = "";
            westBid.Visibility            = Visibility.Collapsed;
            westBid.Text                  = "";
            currentCallBlock.Visibility   = Visibility.Collapsed;
            bidSuitOptions.SelectedIndex  = 0;
            bidValueOptions.SelectedIndex = 0;
            team1TricksBlock.Text         = "Team 1 tricks: 0";
            team2TricksBlock.Text         = "Team 2 tricks: 0";
            foreach (Player p in players)
            {
                p.resetHand();
                p.HasBidded     = -1;
                p.TricksWon     = 0;
                p.HasLeadTrumps = false;
                if (p.Name.Equals("North") || p.Name.Equals("East") || p.Name.Equals("West"))
                {
                    PlayerAI ai = (PlayerAI)p;
                    ai.CardsPlayedSoFar.Clear();
                }
            }
            makeDeck();
            dealHands();
            showPlayerHand();
            foreach (Image c in playerHandImages)
            {
                c.Visibility = Visibility.Visible;
            }
            setupKitty();

            determineDealer();
            currentDealerBlock.Text = ("Current dealer: " + currentDealer.Name);

            currentlySelectedCard       = null;
            currentlySelectedImage      = null;
            currentlySelectedKittyCard  = null;
            currentlySelectedKittyImage = null;

            biddingPhase();
        }
Example #6
0
        /// <summary>
        /// Logic for playing each trick in the game.
        /// </summary>
        private async void startGame()
        {
            if (isKittyShown)
            {
                while (isKittyShown)
                {
                    await Task.WhenAny(whenClicked(acceptKittyCardsButton));
                }
            }
            else
            {
                isKittyShown = false;

                kittyGrid.Visibility = Visibility.Collapsed;
                acceptKittyCardsButton.Visibility = Visibility.Collapsed;
            }
            nextTrickButton.Content = "Next Trick";

            // Need to define the player order based on who won the bid. We can use 'currentHighestBidder'
            // for this as once this method is called, it will contain a reference to the winning player.
            Player[] playerOrder = definePlayerOrder(currentHighestBidder.Name);
            redefineForTrumps();
            showPlayerHand();
            setTrickAreaVisibility(Visibility.Visible);

            for (int thisTrick = 1; thisTrick < 11; thisTrick++)
            {
                foreach (Player p in playerOrder)
                {
                    if (p.Name.Equals("South"))
                    {
                        // Do player turn
                        isPlayersTurn = true;

                        // Wait for the player to click a valid card.
                        while (isPlayersTurn)
                        {
                            await Task.WhenAny(whenImageClicked(card1), whenImageClicked(card2), whenImageClicked(card3), whenImageClicked(card4), whenImageClicked(card5),
                                               whenImageClicked(card6), whenImageClicked(card7), whenImageClicked(card8), whenImageClicked(card9), whenImageClicked(card10));
                        }

                        this.trickCardSouth.Source = currentlySelectedCard.ImgSource;
                    }
                    else
                    {
                        // Do AI turn.
                        PlayerAI ai = (PlayerAI)p;
                        Card     c  = ai.processTurn(this.cardsInPlay, currentHighestBidder, winningCurrentTrick, trumpSuit, currentHighestCard);
                        if (isCurrentHighestCard(c))
                        {
                            winningCurrentTrick = ai;
                            currentHighestCard  = c;
                        }
                        this.cardsInPlay.Add(c);
                        setAITrickCard(ai, c);
                    }
                    if (cardsInPlay.Count < 4)
                    {
                        await Task.Delay(500);
                    }
                }
                playerOrder           = definePlayerOrder(determineTrickWinner().Name);
                team1TricksBlock.Text = ("Team 1 tricks: " + (players[0].TricksWon + players[2].TricksWon).ToString());
                team2TricksBlock.Text = ("Team 2 tricks: " + (players[1].TricksWon + players[3].TricksWon).ToString());
                if (thisTrick == 10)
                {
                    nextTrickButton.Content = "Finish Round";
                }
                nextTrickButton.Visibility = Visibility.Visible;
                addCardKnowledge();
                this.cardsInPlay.Clear();
                this.winningCurrentTrick = null;
                this.currentHighestCard  = null;
                await Task.WhenAny(whenClicked(nextTrickButton));
            }
            currentCallBlock.Visibility = Visibility.Collapsed;

            if (!addWinningPoints())
            {
                playNewRound();
            }
            else
            {
                finishGame();
                await Task.WhenAny(whenClicked(newGameButton), whenClicked(quitButton));

                setGameVisibility(Visibility.Visible);
                newGame();
            }
        }
Example #7
0
        /// <summary>
        /// Logic for the bidding phase.
        /// </summary>
        private async void biddingPhase()
        {
            currentHighestBidder = null;
            Player[] playerOrder = definePlayerOrder(findBidder());
            while (!isBiddingOver())
            {
                foreach (Player p in playerOrder)
                {
                    if (p.Name.Equals("South"))
                    {
                        if (p.HasBidded != 0)
                        {
                            if (currentHighestBidder != players[2])
                            {
                                Debug.WriteLine("Player bid");
                                minimumNextBid();

                                bidButton.Visibility  = Visibility.Visible;
                                passButton.Visibility = Visibility.Visible;

                                isInvalidBid = true;
                                while (isInvalidBid)
                                {
                                    await Task.WhenAny(whenClicked(passButton), whenClicked(acceptBidButton));
                                }
                            }
                        }
                    }
                    else
                    {
                        PlayerAI ai = (PlayerAI)p;
                        if (ai.HasBidded == 0)
                        {
                        }
                        else if (ai.doBid(currentHighestBidder))
                        {
                            currentHighestBidder = ai;
                            string s;

                            if (ai.BiddedSuit == Suit.Joker)
                            {
                                s = "No Trumps";
                                setBidText(string.Format("Current Bid {0} {1}", (int)ai.BiddedValue, s), ai);
                            }
                            else
                            {
                                setBidText(string.Format("Current Bid {0} {1}", (int)ai.BiddedValue, ai.BiddedSuit), ai);
                            }
                        }
                        else
                        {
                            setBidText("Pass", ai);
                            ai.HasBidded = 0;
                        }
                    }
                    if (!p.Name.Equals("East") || p.HasBidded != 0)
                    {
                        await Task.Delay(500);
                    }
                } // End of foreach loop.
            }     // End of While loop.

            startGame();
        }