A manager that observes playing rules.
Esempio n. 1
0
        internal void EnterPlayingState()
        {
            _playingManager             = new PlayingManager(this.CurrentAnnouncement, _game, _allCards);
            _playingManager.BelotFound += new Belot.PlayingManager.BelotFoundHandler(AddBelotCombination);

            PlayerHasTurn(this._firstPlayer);
        }
Esempio n. 2
0
 /// <summary>
 /// Raises the CardPlaying event
 /// </summary>
 protected void RaiseCardPlaying(PlayingManager manager)
 {
     if (CardPlaying != null)
     {
         CardPlaying(this, manager);
     }
 }
Esempio n. 3
0
        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 );
        }
Esempio n. 4
0
 protected override void PlayCard( PlayingManager manager )
 {
     RaiseCardPlaying( manager );
 }
Esempio n. 5
0
 private void HumanPlayerIsPlaying( Player player, PlayingManager manager )
 {
     SetPlayerActive( player );
     _currentHuman = ( HumanPlayer )player;
 }
Esempio n. 6
0
 /// <summary>
 /// The player has to play a card. Player has to ask the manager if desired card is valid. Otherwise returning invalid card throws exception.
 /// </summary>
 /// <param name="manager">Manager that observes playing rules</param>
 internal protected abstract void PlayCard(PlayingManager manager);
Esempio n. 7
0
 /// <summary>
 /// Raises the CardPlaying event
 /// </summary>
 protected void RaiseCardPlaying( PlayingManager manager )
 {
     if( CardPlaying != null )
         {
              CardPlaying( this, manager );
         }
 }
Esempio n. 8
0
 /// <summary>
 /// The player has to play a card. Player has to ask the manager if desired card is valid. Otherwise returning invalid card throws exception.
 /// </summary>
 /// <param name="manager">Manager that observes playing rules</param>
 protected internal abstract void PlayCard( PlayingManager manager );
Esempio n. 9
0
        internal void EnterPlayingState()
        {
            _playingManager = new PlayingManager( this.CurrentAnnouncement, _game, _allCards );
            _playingManager.BelotFound += new Belot.PlayingManager.BelotFoundHandler( AddBelotCombination );

            PlayerHasTurn( this._firstPlayer );
        }