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

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


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

= true;

      }

      }

      }

      }

      else

      {

      // only destroy tomatoes of the cheese is going up

      for (int i = 0; i < tomatoes.Length; i++)

      {

      if (!tomatoes[i].visible)

      {

      continue;

      }

      if (cheeseRectangle.IntersectsWith(

      tomatoes[i].rectangle))

      {

      //At the time of collision,

      //the Beep signal is given:

      Microsoft.VisualBasic.Interaction.Beep();

      // hide the tomato

      tomatoes[i].visible = false;

      // bounce down

      goingDown = true;

      // only destroy one at a time

      break;

      }

      }

      }

      } //End of the method updatePositions.

      В режиме выполнения (Build, Build Selection; Debug, Start Without Debugging) несколько i-х помидоров появляются в верхней части экрана в качестве мишеней (рис. 5.7), которые исчезают после попадания в них летающего сыра (рис. 5.8).

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

      К разработке методики подсчёта очков в игре мы и приступаем.

      5.6. Методика подсчёта очков в игре

      Игра отличается от любого другого приложения тем, что один или несколько игроков набирают в игре очки, и победителем считается игрок, набравший наибольшее количество очков. А после набора определённого количества очков игра может переходить на более высокие (более сложные) и интересные уровни, после прохождения которых игрок может получить приз, например, в виде изображения какого-нибудь смешного персонажа.

      Методика подсчёта очков (score) в игре подразумевает наличие в программе счётчика (scorer) очков и вывода очков на экран (например, методом DrawString) в строке:

      g.DrawString(messageString, messageFont, messageBrush,

      messageRectangle);

      Видно, что в этом методе DrawString мы дожны определить параметры в виде шрифта messageFont, кисти messageBrush и зарезервированного прятоугольника для записи очков messageRectangle, причём в этот прямоугольник летающие объекты не должны залетать. На рис. 5.9 мы получили 20 очков за 2 сбитых помидора, а на 5.10 – 50 очков за 5 сбитых помидоров.

      За каждый сбитый помидор мы можем начислить игроку любое количество очков, например, 10 очков в строке:

      scoreValue = scoreValue + 10;

      Новые очки сразу же выводятся на экран, информируя игрока.

      Рис. 5.9. Получили 20 очков за 2 сбитых помидора. Рис. 5.10. Получили 50 очков.

      Приступим к программной реализации методики подсчёта очков в игре в нашем базовом учебном проекте.

      Сначала мы должны опустить ряд помидоров пониже, чтобы освободить место вверху для записи очков, поэтому вместо 4 записываем ординату, равную, например, 20:

      int tomatoDrawHeight = 20;

      В любом месте класса Form1 добавляем новые переменные для счётчика очков.

      Листинг 5.8. Новые переменные.

      // Font for score messages.

      Font messageFont = null;

      // Rectangle for score display.

      Rectangle messageRectangle;

      // Height of the score panel.

      int scoreHeight = 20;

      // Brush used to draw the messages.

      SolidBrush messageBrush;

      // The string, which is drawn as the user message.

      string messageString = "Score : 0";

      // Score in a game.

      int scoreValue = 0;

      Приведённый выше код в теле метода Form1_Paint заменяем на тот, который дан на следующем листинге.

      Листинг 5.9. Метод для рисования изображения.

      private void Form1_Paint(object sender, PaintEventArgs e)

      {

      //If the buffer empty, we create the new buffer:

      if (backBuffer == null)

      {

      backBuffer = new Bitmap(this.ClientSize.Width,

      this.ClientSize.Height);

      }

      //We create a object of class Graphics from the buffer:

      using