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

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


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

«Hit Me» меню maneMenu1. После выбора этой команды, компьютер выдаёт игроку дополнительную карту, если набранное им количество очков меньше 21, как показано в следующем коде:

      void playerHits ()

      {

      if (playerHand. BlackJackScoreHand () <21)

      {

      playerHand.Add(shoe.DealCard ());

      if (playerHand. BlackJackScoreHand ()> 21)

      {

      //We write in the original:

      pot.DoPlaceBet ();

      pot. HouseWins ();

      showPot ();

      mode = GameMode.PlayerBust;

      }

      this.Invalidate ();

      }

      }

      Отметим, что метод BlackJackScoreHand каждый раз возвращает счёт «руки игрока» (playerHand). После этого метод Invalidate перерисовывает форму Form1, точнее, перерисовывает карты и обновляет счёт обоих игроков. Аналогично в меню maneMenu1 имеется команда «Себе», по которой банкомёт набирает карты себе (после игрока).

      1.9. Рисование очков игроков

      Методы Windows для рисования текстов хороши для простых сообщений, но для игры пользователь ожидает что-то более красивое. Например, мы можем рисовать текст на фоне какого-либо рисунка, чтобы выделить текст. Мы можем осуществить это, неоднократно рисуя текст в множестве позиций вокруг его желательного местоположения, перед размещением реального текста на самом верху фона. Чтобы сделать это, был написан ряд утилит, как показано в следующем коде:

      static private SolidBrush messageBrush =

      new SolidBrush (Color. Black);

      public static void BigText (string message, int x, int y,

      Color back, Color fore,

      Font messageFont, Graphics g)

      {

      int i;

      messageBrush.Color = back;

      for (i = 1; i <3; i++)

      {

      g. DrawString (message, messageFont, messageBrush,

      x – i, y – i);

      g. DrawString (message, messageFont, messageBrush,

      x – i, y + i);

      g. DrawString (message, messageFont, messageBrush,

      x + i, y – i);

      g. DrawString (message, messageFont, messageBrush,

      x + i, y + i);

      }

      messageBrush.Color = fore;

      g. DrawString (message, messageFont, messageBrush, x, y);

      }

      Этот метод BigText снабжен ссылкой на объект графики, чтобы использовать её для рисования текста (message) соответствующим шрифтом (messageFont) в соответствующей позиции. Задаётся также цвет для приоритетных и фоновых версий текста. Метод рисует множество фоновых версий текста перед помещением приоритетной версии на вершине. Метод является статическим, поэтому для вызова не нуждается в объекте класса Utilities, а вызывается напрямую после имени класса, как показано в следующем коде:

      Utilities.BigText («Dealer Bust»,

      20, 80, Color. Black, Color. Yellow, messageFont, g);

      В этом коде сообщение «Dealer Bust!» означает «Банкомёт перебрал карты».

      Объект messageFont класса Font создан в начале приложения и используется для всего рисунка сообщения.

      Далее при разработке программы игры мы сначала стандартно создадим шаблон метода Paint (после двойного щелчка по имени события Paint в панели Properties для формы Form1), затем в тело этого шаблона запишем наш код и будем вызывать этот метод каждый раз, когда экран должен быть перерисован. С точки зрения проектирования, считается не очень хорошей практикой выполнять прикладные функции непосредственно в обработчике события Paint. Поэтому для рисования изображений, наше приложение в шаблоне метода Form1_Paint будет вызывать специальный метод paintForm, как показано в следующем коде:

      private void Form1_Paint (object sender, PaintEventArgs e)

      {

      paintForm(e.Graphics);

      }

      1.10. Управление игрой

      Теперь мы можем использовать вышеупомянутые классы, чтобы осуществить большинство видов