Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание компьютерных игр


Информационный Канал Subscribe.Ru

Cоздание компьютерных игр.
Рассылка Евгения Казеко.
Выпускается еженедельно по средам.

Выпуск 7. (от 30 апреля 2003 года)
Выбор и повторение. Выбираем класс персонажа.

--------------------------------------------------------------

В выпуске 5, насколько вы помните, мы написали первую "настоящую программу" - создали игрового персонажа с минимальным набором характеристик, и даже прибавили ему здоровья, истратив немного золота. Там же мы коснулись структуры выбора if. Сегодня мы расширим наши знания о структурах выбора, а также узнаем, что такое циклы и как они используются для повторения набора действий. Как и в прошлый раз, мы будем не просто получать абстрактные знания, а попытаемся тут же их применить для создания элементов игры.

Но прежде чем мы начнем, мне хотелось бы еще раз вернуться к выпуску 5. Благодаря замечанию одного из читателей, я, к своему огорчению, обнаружил, что в html версию этого выпуска вкралась досадная ошибка. Как вы помните, комментарии в языке С записываются либо после двух косых черт // одной строкой, либо между /* и */ одной или несколькими строками. Так вот, при конвертации текстовой версии выпуска в html, в некоторых местах звездочки до и после косых черт оказались выкинуты, в результате комментарии оказались записаны между / и /, что, конечно же, неверно, и приводит к ошибке при компиляции программы. Я буду очень благодарен всем, кто будет сообщать о возможных ошибках, и постараюсь избежать их дальнейшего возникновения.

А теперь перейдем к теме нашего выпуска. Давайте расширим возможности нашего персонажа - увеличим набор его характеристик. Что если нам сделать возможность выбора класса персонажа? Чтобы слишком не усложнять программу, ограничимся тремя классами - warrior (воин), mage (маг), и thief (вор). Их характеристики будут, разумеется, различаться. Поэтому снова возьмем в руки лист бумаги и подумаем, займемся, так сказать, гейм дизайном.

У наших персонажей уже есть имя, здоровье и золото. Конечно же, теперь добавляется еще и класс. Пускай в зависимости от класса у персонажей будут различаться такие характеристики, как сила удара (attack), защита (defence), и магия (magic). Конечно возникает желание сразу наворотить зависимость этих характеристик от силы, ловкости, выносливости и так далее. Но все это усложнит наш пример. Хочу сказать, что мы и так движемся семимильными шагами, несмотря на то, что я забочусь о том, чтобы читатели с нулевыми знаниями могли последовательно изучать выпуски, и чтобы у них не возникало при этом затруднений. Напомню, что вы всегда можете обратиться ко мне за разъяснениями, а также посмотреть соответствующие обучалки на сайте www.gamecoder.nm.ru, или полистать книгу по программированию на С. (На вопросы непосредственно по теме выпуска я отвечаю в первую очередь, в то время как ответ на ваш вопрос, не относящийся к рассылке, может занять у меня некоторое время. Пожалуйста, будьте терпеливы.)

Итак, что у нас получилось? Имя, класс, здоровье, золото, атака, защита и магия. Для начала неплохо.

Вот мы вроде бы и готовы писать нашу программу. Но сперва немного теории, в качестве лирического отступления. В свое время некто Бом и Джакопини доказали, что любую программу можно построить, используя три типа управляющих структур, комбинируя их двумя способами. Вам это ничего не говорит? Это значит, что структурное программирование - очень простая вещь, и мы в этом скоро убедимся.

В самом деле, чтобы написать программу, достаточно использования трех типов управляющих структур - следование, выбор и повторение. При этом их можно комбинировать двумя способами - пакетирование и вложение. Со структурой следования все очень просто, так же как и с пакетированием. Посмотрите на текст. Строки - это структура следования, а абзац - это комбинирование пакетированием. Точно так же и в языке С. А со всем остальным мы сегодня и познакомимся.

Переходим к программе. Дальнейшие объяснения будут вновь идти в виде комментариев. Открываем Visual C++, создаем консольное приложение и - вперед. Если вы только начали читать рассылку и не знаете как это сделать, настоятельно рекомендую ознакомиться с архивом, в частности с выпуском 4. Если у вас не Visual C++, а другой компилятор, то могу посоветовать прочесть документацию к вашему компилятору.

Текст программы:

-----------------------------------------



// Выбор и повторение

// Начинаем как всегда с подключения стандартного заголовочного файла.
#include <stdio.h>


// Создаем функцию main. Без нее программу на С не написать.
void main()
{

 /* Описываем характеристики наших персонажей, а также
  предметы оружейного магазина.
 */

 char name[25];   // Имя персонажа

 int player_class = 0;  // Класс игрока
 // Для описания класса игрока мы будем использовать числа.
 // Число 1 будет означать воина, 2 - мага, 3 - вора.
 // Пока что запишем в переменную число 0.


 int health, gold, attack, defence, magic; // Характеристики персонажа


 // Теперь мы готовы приступить непосредственно к программе.



 // Запрашиваем ввод имени. Это мы делаем только один раз
 // сразу же после запуска программы.

 printf("Enter player's name: ");

 scanf("%s", &name);

 printf("\n");



 /* Далее мы выбираем класс персонажа, для чего мы будем использовать
  структуру выбора if. И уже здесь важно предусмотреть возможность
  ошибочного выбора. Можно конечно в таком случае написать
  "программа выполнила недопустимую операцию и будет закрыта", но
  лучше вместо этого дать игроку шанс повторить ввод. Для этого
  мы будем, как вы уже догадались, использовать структуру
  повторения или цикл while. А заодно познакомимся и с вложением.

  Итак, для того, чтобы игрок мог ошибаться с вводом, нам
  необходимо ВЛОЖИТЬ наши структуры следования и выбора в
  структуру повторения - цикл while. Ниже мы сделаем это, но
  сперва я расскажу как работает этот цикл.

  Так же как и для оператора if, сперва записывается условие.
  Пока это условие будет истинно, будет повторяться то, что
  указано между фигурными скобками (в том числе и вложенные
  структуры выбора). Когда условие становится ложным, происходит
  выход из цикла, и программа продолжается.

  Звучит достаточно сложно, но на самом деле все просто.
  Сейчас мы убедимся в этом.

 */


 /* Начало цикла while (см.ниже).
  Что означает такое условие? Мы используем логический оператор ИЛИ (||).
  И наше условие читается так: выполнять цикл, пока значение класса
  меньше 1 ИЛИ больше 3. Как только введенное число попадет в диапазон
  1 - 3, произойдет выход из цикла. Для того, чтобы не возникло ошибки
  и цикл выполнился хотя бы раз, в самом начале мы присвоили
  переменной player_class значение 0.
 */

 while ( (player_class < 1) || (player_class > 3) )
 {

  printf("Choose your class (1 - warrior, 2 - mage, 3 - thief): ");

  scanf("%d", &player_class);  // Считываем число с клавиатуры.


  /* Вот и структура выбора - оператор if.
   Только на этот раз он в сокращенной форме (без else).
   В случае, если условие истинно (player_class равно 1),
   то действия в фигурных скобках выполняются.
   Если же условие ложно (player_class не равно 1), то
   данный оператор пропускается, и программа выполняется дальше.
   И не забывайте, что условие равенства записывается как "==",
   а = означает оператор присваивания. Если их перепутать, то
   это приведет к ошибке.
  */

  // Персонажам разных классов мы присваиваем разные характеристики.

  // Если персонаж - воин.
  if (player_class == 1)
  {
   health = 40;
   gold = 20;
   attack = 3;
   defence = 3;
   magic = 1;
  }


  // Если персонаж - маг
  if (player_class == 2)
  {
   health = 20;
   gold = 20;
   attack = 1;
   defence = 2;
   magic = 3;
  }

  // Если персонаж - вор
  if (player_class == 3)
  {
   health = 20;
   gold = 40;
   attack = 2;
   defence = 2;
   magic = 2;
  }

  /* Конечно, все это можно было гораздо изящнее сделать с помощью
   структуры выбора switch, но ее мы рассмотрим позже.
   Напоследок необходимо вывести в случае надобности сообщение
   об ошибке. */

  if ((player_class < 1) || (player_class > 3))
   printf("Wrong class. Please choose again.\n\n" );

 } // конец цикла while



 /* Вот мы и выбрали класс. Выведем информацию об игроке.
  А для того, чтобы вывести класс игрока в текстовом
  виде, мы используем структуру выбора switch.
  Она работает как несколько последовательных операторов
  if, однако выглядит намного проще.
 */


 printf("\n");

 printf("Name: %s\n", name);


 switch(player_class) // Мы указали, значение какой переменной нужно проверять.
 {
  case 1:     // Если значение player_class равно 1
   printf("Class: Warrior\n");
   break;    // Остановиться и выйти из switch

  case 2:     // Если значение player_class равно 2
   printf("Class: Mage\n");
   break;    // Остановиться и выйти из switch

  case 3:     // Если значение player_class равно 3
   printf("Class: Thief\n");
   break;    // Остановиться и выйти из switch

  default:    // Если значение player_class ни 1, ни 2, ни 3

   break;
 }


 /*   А теперь подробнее про switch. Этот оператор проверяет, равна ли
  переменная после слова switch нескольким значениям, которые
  мы указываем после слов case с двоеточием. Это очень похоже
  на использование последовательности if, как мы делали выше.
  Обратите внимание, что для частей оператора switch (т.е. для
  вариантов значений - case) мы не используем фигурных скобок.
  Оператор break нужен для выхода из структуры switch, иначе
  все равно будут проверяться все условия до конца. Ключевое
  слово default нужно для того случая, если значение
  проверяемой переменной не соответствует ни одному из
  вариантов. Например, сюда можно было бы ввести сообщение
  об ошибке. Я этого не делаю, так как в этом месте
  программы значение player_class гарантированно равно 1, 2 или 3.

 */

 printf("Health: %d\n", health);
 printf("Gold: %d\n", gold);
 printf("Attack: %d\n", attack);
 printf("Defence: %d\n", defence);
 printf("Magic: %d\n", magic);


} // Конец программы.


-----------------------------------------

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

Опять же, мы двигаемся вперед очень быстро, и многое я не объясняю слишком подробно. Поэтому читайте книги, смотрите обучалки на www.gamecoder.nm.ru, и пишите письма.

До встречи в следующий раз, и хороших вам майских праздников!

--------------------------------------------------------------

Архив рассылки вы найдете по адресам http://subscribe.ru/catalog/comp.games.gamecoder и http://www.gamecoder.nm.ru/subscribe.htm.

Евгений Казеко.
kazeko@list.ru
www.gamecoder.nm.ru
-----------------------------
Рассылка "Создание компьютерных игр", выпуск 7.
Выпускается еженедельно по средам.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное