public void Start(Config config) { var game = new Game { id = Guid.NewGuid(), dealer = 1, leader = 2, team1_score = 0, team1_bags = 0, team2_score = 0, team2_bags = 0 }; var client = new AjaxClient(config); while (game.team1_score < config.limit && game.team2_score < config.limit) { Round(client, game); } Clients.Caller.gameComplete(game); }
private void Round(AjaxClient client, Game game) { Clients.Caller.roundStart(); var hands = Deal(); var round = new Round(); #region BIDDING for (var i = game.leader; i < (game.leader + 4); i++) { var p = (i > 4) ? (i - 4) : i; int bid; try { if (client.Blind(p, round, game)) { bid = -1; client.Deal(p, hands[p], round, game); } else { bid = client.Deal(p, hands[p], round, game); if (bid < 0 || bid > 13) { Clients.Caller.log("WARNING: Player " + p + " has made an illegal bid."); } } switch (p) { case 1: round.player1_bid = bid; break; case 2: round.player2_bid = bid; break; case 3: round.player3_bid = bid; break; case 4: round.player4_bid = bid; break; } } catch (Exception ex) { Misplay(p, "endpoint threw an exception", game); Clients.Caller.log(ex.ToString()); return; } Clients.Caller.bid(p, bid); Thread.Sleep(1000); } for (var i = 1; i <= 4; i++) { try { client.Bid(i, round, game); } catch (Exception ex) { Misplay(i, "endpoint threw an exception", game); Clients.Caller.log(ex.ToString()); return; } } #endregion #region PLAYING var books = new List <Book>(); var leader = game.leader; var spadesBroken = false; for (var i = 0; i < 13; i++) { var book = new Book { leader = leader }; var leadSuit = String.Empty; for (var j = leader; j < (leader + 4); j++) { var p = (j > 4) ? (j - 4) : j; Card card; try { card = new Card(client.Play(p, book, round, game)); } catch (Exception ex) { Misplay(i, "endpoint threw an exception", game); Clients.Caller.log(ex.ToString()); return; } // Ensure card played is an actual card (by suit). if (card.Suit != "s" && card.Suit != "h" && card.Suit != "c" && card.Suit != "d") { Misplay(p, "played a suit that does not exist.", game); return; } // Ensure card played is an actual card (by rank). if (card.Rank < 2 || card.Rank > 14) { Misplay(p, "played a rank that does not exist.", game); return; } // Ensure card played is in the player's hand. if (hands[p].All(x => x != card.ToString())) { Misplay(p, "played a card they did not possess.", game); return; } if (p == leader) { // Ensure spades can be broken by leader (all remaining cards in hand are spades). leadSuit = card.Suit; if (card.Suit == "s" && !spadesBroken) { if (hands[p].Any(x => new Card(x).Suit != "s")) { Misplay(p, "prematurely broken spades", game); return; } spadesBroken = true; } } else { // Ensure that player is following suit (if able). if (hands[p].Any(x => new Card(x).Suit == leadSuit) && card.Suit != leadSuit) { Misplay(p, "did not follow suit when able", game); return; } if (card.Suit == "s") { spadesBroken = true; } } if (p == 1) { book.player1_card = card.ToString(); } if (p == 2) { book.player2_card = card.ToString(); } if (p == 3) { book.player3_card = card.ToString(); } if (p == 4) { book.player4_card = card.ToString(); } hands[p].Remove(card.ToString()); Clients.Caller.play(p, card.ToString()); Thread.Sleep(300); } ScoreBook(book); switch (book.winner) { case 1: round.player1_taken += 1; break; case 2: round.player2_taken += 1; break; case 3: round.player3_taken += 1; break; case 4: round.player4_taken += 1; break; } for (var p = 1; p <= 4; p++) { try { client.Book(p, book, game); } catch (Exception ex) { Misplay(i, "endpoint threw an exception", game); Clients.Caller.log(ex.ToString()); return; } } leader = book.winner; books.Add(book); Clients.Caller.bookComplete(book, round, game); Thread.Sleep(3000); } #endregion #region SCORING if (round.player1_bid.HasValue && round.player2_bid.HasValue && round.player3_bid.HasValue && round.player4_bid.HasValue) { var t1 = ScoreRound( round.player1_bid.Value, round.player1_taken, round.player3_bid.Value, round.player3_taken); var t2 = ScoreRound( round.player2_bid.Value, round.player2_taken, round.player4_bid.Value, round.player4_taken); game.team1_score += t1.Score; Bag(1, t1.Bags, game); game.team2_score += t2.Score; Bag(2, t2.Bags, game); } else { Clients.Caller.log("WARNING: One or more player bids were lost."); } #endregion game.dealer = (game.dealer == 4) ? 1 : (game.dealer + 1); game.leader = (game.leader == 4) ? 1 : (game.leader + 1); Clients.Caller.roundComplete(round, game); Thread.Sleep(2000); }