Валерий Алексеевич Жарков

Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 8: Программирование на Visual C# искусственного интеллекта. Издание 2. Продолжение 1


Скачать книгу

(!FaceUp)

      {

      dispNo = 0;

      }

      if (cardImages[dispNo] == null)

      {

      cardImages[dispNo] = new Bitmap(

      execAssem.GetManifestResourceStream(

      @"PocketJack.images." + dispNo + @".gif"));

      }

      return cardImages[dispNo];

      }

      }

      /// <summary>

      /// Constructs a card with a partiuclar number

      /// </summary>

      /// <param name="cardNo">number of the card

      /// in the range 1 to 52</param>

      /// <param name="faceUp">true if the card

      /// is to be drawn face up</param>

      public Card(byte cardNo, bool faceUp)

      {

      CardNo = cardNo;

      FaceUp = faceUp;

      }

      /// <summary>

      /// Constructs a face up card with that number

      /// </summary>

      /// <param name="cardNo"></param>

      public Card(byte cardNo)

      : this(cardNo, true)

      {

      }

      /// <summary>

      /// String description of the card

      /// </summary>

      /// <returns>the name and suit of the card</returns>

      public override string ToString()

      {

      return ValueName + " of " + Suit;

      }

      }

      /// <summary>

      /// Provides a container for a number of cards.

      /// May be used to draw the cards and compute their score.

      /// </summary>

      public class CardHand : ArrayList

      {

      /// <summary>

      /// Used as a destination of teh draw action

      /// </summary>

      private static Rectangle drawRect;

      /// <summary>

      /// Draws the hand on the graphics.

      /// </summary>

      /// <param name="g">graphics to draw with</param>

      /// <param name="startx">left edge of first card</param>

      /// <param name="starty">top of first card</param>

      /// <param name="gapx">x gap between each card</param>

      /// <param name="gapy">y gap between each card</param>

      public void DrawHand(Graphics g, int startx, int starty,

      int gapx, int gapy)

      {

      drawRect.X = startx;

      drawRect.Y = starty;

      foreach (Card card in this)

      {

      drawRect.Width = card.CardImage.Width;

      drawRect.Height = card.CardImage.Height;

      g.DrawImage(

      card.CardImage,                  // Image

      drawRect,                  // destination rectange

      0,                                    // srcX

      0,                                    // srcY

      card.CardImage.Width, // srcWidth

      card.CardImage.Height,      // srcHeight

      GraphicsUnit.Pixel,            // srcUnit

      Card.cardAttributes); // ImageAttributes

      drawRect.X += gapx;

      drawRect.Y += gapy;

      }

      }

      /// <summary>

      /// Computes the score of the hand

      /// </summary>

      /// <returns>the value of the score</returns>

      public int BlackJackScoreHand()

      {

      int score = 0;

      int aces = 0;

      foreach (Card card in this)

      {

      score += card.BlackJackScore;

      if (card.BlackJackScore == 11)

      {

      aces++;

      }

      }

      while ((score > 21) && (aces > 0))

      {

      score -= 10;

      aces–;

      }

      return score;

      }

      }

      /// <summary>

      /// Contains a number of card decks

      /// which can be dealt one at a time.

      /// </summary>

      public class CardShoe

      {

      private int noOfDecks = 1;

      private byte[] decks;

      private int nextCard;

      private bool testShoe = false;

      /// <summary>

      /// True if the deck is "stacked",

      /// i.e. was created from a byte array

      /// </summary>

      public bool TestShoe

      {

      get

      {

      return testShoe;

      }

      }

      private void makeShoe()

      {

      decks = new byte[noOfDecks * 52];

      int cardPos = 0;

      for (int i = 0; i < noOfDecks; i++)

      {

      for (byte j = 1; j < 53; j++)

      {

      decks[cardPos] = j;

      cardPos++;

      }

      }

      nextCard = 0;

      }

      private void shuffleShoe()

      {

      if (!testShoe)

      {

      System.Random rand = new Random();

      byte swap;

      int