protected override void PlayCard( PlayingManager manager ) { Card selectedCard = null; _playingManager = manager; IList<Card> validCards = GetValidCards(); if ( manager.CurrentHand.IsEmpty ) // 2.1 { #region 2.1 int maxEvaluated = 0; Card maxEvaluatedCard = null; foreach ( Card card in validCards ) { int points = EvalutePointsOnRemaining( card ); points += EvalutePointsOnPartnerAnnounce( card ); points += EvalutePointsOnTrumpColor( card ); if ( points > maxEvaluated ) { maxEvaluated = points; maxEvaluatedCard = card; } } if ( maxEvaluatedCard != null ) { #region 2.1.1 if ( IsCurrentMaxCardInPlayingColor( maxEvaluatedCard ) ) { #region 2.1.1.1 selectedCard = maxEvaluatedCard; #endregion } else { #region 2.1.1.2 int minPlayingPoints = 1000; // incorrect but big enough value; Card minPlayingPointsCard = null; foreach ( Card card in validCards ) { if ( card.CardColor == maxEvaluatedCard.CardColor ) { int points = CardPointEvaluator.EvaluateCard( _playingManager.CurrentAnnouncement.Type, card ); if ( points < minPlayingPoints ) { minPlayingPoints = points; minPlayingPointsCard = card; } } } selectedCard = minPlayingPointsCard; #endregion } #endregion } else { #region 2.1.2 Random rand = new Random(); selectedCard = validCards[ rand.Next( validCards.Count ) ] as Card; #endregion } #endregion } else //2.2 { #region 2.2 Card currentMaxCardInPlayingColor = null; foreach ( Card card in validCards ) { if ( card.CardColor == GetPlayingColor() && IsCurrentMaxCardInPlayingColor( card ) ) { currentMaxCardInPlayingColor = card; break; } } if ( currentMaxCardInPlayingColor != null ) // 2.2.1 { selectedCard = currentMaxCardInPlayingColor; } else // 2.2.2 { #region 2.2.2 IList< CardColor > zeroEvaluatedColors; if ( FindZeroEvaluatedColor( validCards, out zeroEvaluatedColors ) ) // 2.2.2.1 { #region 2.2.2.1 Card biggestCardInHand = _playingManager.GetBiggestCard(); Player partner = _playingManager.GetPartner( this ); if ( IsCurrentMaxCardInPlayingColor( biggestCardInHand ) && _playingManager.GetPlayerWhoPlayedCard( biggestCardInHand ) == partner ) //2.2.2.1.1 { #region 2.2.2.1.1 int maxPlayingPoints = -100; Card maxPlayingPointsCard = null; foreach ( Card card in validCards ) { foreach ( CardColor color in zeroEvaluatedColors ) { // we are in case 2.2.2.1 so we know card evaluated to 0 points exists if ( card.CardColor == color ) { int points = CardPointEvaluator.EvaluateCard( _playingManager.CurrentAnnouncement.Type, card ); if ( points > maxPlayingPoints ) { maxPlayingPoints = points; maxPlayingPointsCard = card; } } } } selectedCard = maxPlayingPointsCard; #endregion } else // 2.2.2.1.2 { #region 2.2.2.1.2 int minPlayingPoints = 1000; // incorrect but big enough value; Card minPlayingPointsCard = null; foreach ( Card card in validCards ) { foreach ( CardColor color in zeroEvaluatedColors ) { // we are in case 2.2.2.1 so we know card evaluated to 0 points exists if ( card.CardColor == color ) { int points = CardPointEvaluator.EvaluateCard( _playingManager.CurrentAnnouncement.Type, card ); if ( points < minPlayingPoints ) { minPlayingPoints = points; minPlayingPointsCard = card; } } } } selectedCard = minPlayingPointsCard; #endregion } #endregion } else // 2.2.2.2 { #region 2.2.2.2 Card biggestCardInHand = _playingManager.GetBiggestCard(); Player partner = _playingManager.GetPartner( this ); if ( IsCurrentMaxCardInPlayingColor( biggestCardInHand ) && _playingManager.GetPlayerWhoPlayedCard( biggestCardInHand ) == partner ) //2.2.2.2.1 { #region 2.2.2.2.1 int minEvaluated = 1000; Card minEvaluatedCard = null; foreach ( Card card in validCards ) { int pointsOnRemaining = EvalutePointsOnRemaining( card ); // we are in case 2.2.2.2 so we know card evaluated >0 exists if ( pointsOnRemaining < minEvaluated ) { minEvaluated = pointsOnRemaining; minEvaluatedCard = card; } } selectedCard = minEvaluatedCard; #endregion } else // 2.2.2.2.2 { #region 2.2.2.2.2 int minPlayingPoints = 1000; // incorrect but big enough value; int minOnRemainingPoints = 1000; Card minPlayingPointsCard = null; Card minOnRemainingCard = null; foreach ( Card card in validCards ) { int pointsOnRemaining = EvalutePointsOnRemaining( card ); pointsOnRemaining += EvalutePointsOnPartnerAnnounce( card ); int points = CardPointEvaluator.EvaluateCard( _playingManager.CurrentAnnouncement.Type, card ); if ( points < minPlayingPoints ) { minPlayingPoints = points; minPlayingPointsCard = card; } if ( pointsOnRemaining <= 0 && points < minOnRemainingPoints ) { minOnRemainingPoints = points; minOnRemainingCard = card; } } if ( minOnRemainingCard == null ) { selectedCard = minPlayingPointsCard; } else { selectedCard = minOnRemainingCard; } #endregion } #endregion } #endregion } #endregion } Debug.Assert( selectedCard != null ); RaiseCardPlayed( selectedCard ); }