private Contract Bidding()
{
var currentPlayer = this.game.GetFirstPlayerForTheDeal();
IList<BidType> previousBids = new List<BidType>();
var currentContract = new Contract();
var passesLeft = 4;
while (passesLeft > 0)
{
var allowedBids = currentContract.GetAvailableBidsAfterThisContract(this.game[this.game.GetTeamMate(currentPlayer)]);
var bid = currentPlayer.AskForBid(currentContract, allowedBids, previousBids);
if (bid == BidType.Pass)
{
passesLeft--;
}
else
{
if (!allowedBids.Contains(bid))
{
throw new InvalidPlayerActionException(currentPlayer, string.Format("Invalid bid: {0}", bid));
}
switch (bid)
{
case BidType.Clubs:
currentContract = new Contract(this.game[currentPlayer], ContractType.Clubs);
break;
case BidType.Diamonds:
currentContract = new Contract(this.game[currentPlayer], ContractType.Diamonds);
break;
case BidType.Hearts:
currentContract = new Contract(this.game[currentPlayer], ContractType.Hearts);
break;
case BidType.Spades:
currentContract = new Contract(this.game[currentPlayer], ContractType.Spades);
break;
case BidType.NoTrumps:
currentContract = new Contract(this.game[currentPlayer], ContractType.NoTrumps);
break;
case BidType.AllTrumps:
currentContract = new Contract(this.game[currentPlayer], ContractType.AllTrumps);
break;
case BidType.Double:
currentContract = new Contract(this.game[currentPlayer], currentContract.Type, currentContract.PlayerPosition, true, false);
break;
case BidType.ReDouble:
currentContract = new Contract(this.game[currentPlayer], currentContract.Type, currentContract.OriginalBidder, false, true);
break;
}
passesLeft = 3;
}
this.game.GameInfo.InformForBid(new BidEventArgs(this.game[currentPlayer], bid, currentContract));
previousBids.Add(bid);
currentPlayer = this.game.GetNextPlayer(currentPlayer);
}
return currentContract;
}