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

Автор: Валерий Алексеевич Жарков
Издательство: Автор
Серия:
Жанр произведения:
Год издания: 2023
isbn:
Скачать книгу
srcX

      0,                                    // srcY

      card.CardImage.Width, // srcWidth

      card.CardImage.Height,      // srcHeight

      GraphicsUnit.Pixel,            // srcUnit

      Card.cardAttributes); // ImageAttributes

      drawRect.X += gapx;

      drawRect.Y += gapy;

      }

      }

      Этот код рисует все карты на экране в случайно определённой позиции (при помощи генератора случайных чисел класса Random).

      1.5. Класс Card для загрузки

      карт в программу

      В движке игры CardEngine.cs объект класса Card представляет каждую из карт в игре. Этот класс держит фактическое значение карты и рисует её на экране. Он также обеспечивает свойства, которые дают возможность пользователям класса найти координаты карты, получить название карты и другую полезную информацию. Класс Card может использоваться во многих других карточных играх, но есть некоторые особенности, которые характерны для игры в очко.

      Первая версия класса Card выполняла загрузку всех изображений, когда приложение начинало выполняться. Каждая из 52 карт и фон игры загружались в самом начале игры. Это делало приложение замедленным. Способ ускорить процесс загрузки состоит в том, чтобы загружать изображения только по запросу при использовании следующего кода:

      static private Image[] cardImages = new Bitmap[53];

      public Image CardImage

      {

      get

      {

      int dispNo = CardNo;

      if (!FaceUp)

      {

      dispNo = 0;

      }

      if (cardImages[dispNo] == null)

      {

      cardImages[dispNo] = new Bitmap(

      execAssem.GetManifestResourceStream(

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

      }

      return cardImages[dispNo];

      }

      }

      Переменная cardImages – массив изображений карт. Первоначально все изображения карт в этом массиве пусты. В этом коде переменная dispNo является индексом массива и именем файла карты. Если данный элемент массива – пустой указатель (null), изображение загружается и затем может быть нарисовано. В следующий раз, когда потребуется изображение данной карты, оно будет найдено немедленно. В результате приложение начинает выполняться намного быстрее, чем если бы все карты были загружены в начале игры; время, потраченное, чтобы загрузить только небольшое количество карт, необходимых для игроков, будет небольшим. Если наши приложения нуждаются в большем количестве изображений карт, то это стоит выполнять постепенно по мере загрузки приложения, вместо того, чтобы выполнить это все сразу же в начале игры.

      1.6. Класс CardHand для представления

      карт в руках игрока

      В движке игры CardEngine.cs мы нуждаемся в контейнерном классе CardHand (Рука игрока или банкомёта с картами), чтобы держать все карты. Законченная игра будет требовать двух объектов этого контейнера: один – для управляемого компьютером дилера и другой – для игрока. Класс CardHand, который мы собираемся использовать, держит множество карт. Это основано на коллекции ArrayList, которая облегчит для пользователей класса CardHand возможность добавлять и перечислять карты в руке. Эта коллекция также содержит метод, который будет рисовать карты в руке, как показано в следующем коде:

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

      int gapx, int gapy)

      Этот метод, приведённый выше, рисует карты, начиная с определённой позиции на экране. Каждая последующая карта рисуется на определённом расстоянии от предыдущей.

      Класс CardHand также содержит следующий метод, который вычисляет счёт набранным картам второго игрока blackjack (компьютера):

      public int BlackJackScoreHand()

      {

      int