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