Как программировать игры на C. Учебник первый

01

из 05

Введение в учебники по программированию игр

Это первая из нескольких обучающих программ по программированию на C для начинающих. Вместо того, чтобы концентрироваться на обучении C, а затем показывать примеры программ, которые они преподают C, предоставляя вам полные программы (т.е. игры) на C

Сохраняя это простым

Первая игра в серии - это консоль (т.е. текстовая игра под названием Star Empires). Star Empires - это простая игра, в которой вам нужно захватить все 10 систем в Галактике, не позволяя противнику делать то же самое.

Вы начинаете владеть Системой 0, а ваш враг - системой 9. Остальные восемь систем (1-8) все начинают нейтральной. Все системы запускаются в пределах квадрата 5 парсек х 5 парсек, поэтому ни одна система не находится на расстоянии более 6 парсек. Самые дальние две точки (0,0) и (4,4). По теореме Пифагора самым дальним расстоянием между любыми двумя системами является квадратный корень ((4)2 + (4)2), который является квадратным корнем из 32, что составляет около 5,657.

instagram viewer

Пожалуйста, обратите внимание, что это не окончательная версия и будет изменена. Последнее изменение: 21 августа 2011 г.

Пошаговая и в режиме реального времени

Игра основана на поворотах, и каждый ход вы отдаете приказы перемещать любое количество флотов из любой вашей системы в любую другую. Если у вас более одной системы, вы можете приказать флотам перейти от всех ваших систем к целевой системе. Это делается пропорционально, так что если у вас есть три системы (1,2,3) с 20, 10 и 5 флотами и вы приказываете 10 флотам перейти в систему 4, затем 6 перейдут из системы 1, 3 из системы 2 и 1 из системы 3. Каждый флот движется 1 парсек за ход.

Каждый ход длится 5 секунд, хотя вы можете изменить скорость, чтобы ускорить или замедлить ее, изменив цифру 5 в этой строке кода на 3 или 7 или на другое значение, которое вы выберете. Посмотрите на эту строку кода:

onesec = clock () + (5 * CLOCKS_PER_SEC);

C Программирование Учебник

Эта игра была запрограммирована и предполагает, что вы не знаете программирования на Си. Я представлю возможности программирования на C в этом и следующих двух или трех уроках по мере их развития. Во-первых, вам понадобится компилятор для Windows. Вот два бесплатных:

  • Пытаться CC386
  • Или Visual C ++ 2010 Express

В статье CC386 рассказывается о создании проекта. Если вы устанавливаете этот компилятор, все, что вам нужно сделать, это загрузить программу Hello World, как описано, скопировать и вставить исходный код поверх примера, сохранить его, а затем нажать F7, чтобы скомпилировать и запустить его. Аналогично, статья Visual C ++ 2010 создает программу Hello World. Перезапишите его и нажмите F7, чтобы создать Star Empires., F5, чтобы запустить его.

На следующей странице - Заставить звездные империи работать

02

из 05

Заставить Звездную Империю Работать

Заставить Звездную Империю Работать

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

  • Система происхождения (1-10).
  • Система назначения (1-10)
  • Сколько кораблей (1-много)
  • Повороты, чтобы прибыть
  • Чей это флот? 0 = игрок, 9 = враг

Мы будем использовать структуру в C для хранения этого:

структура флота {
int fromsystem;
int tosystem;
Int превращается;
int fleetsize;
владелец int;
};

Структура - это набор данных, в данном случае 5 чисел, которыми мы манипулируем как единое целое. Каждый номер имеет имя, например, fromsystem, tosystem. Эти имена являются именами переменных в C и могут иметь подчеркивание like_this, но не пробелы. В C числа являются целыми числами; целые числа, такие как 2 или 7, называются целыми числами или числами с десятичными частями, такими как 2,5 или 7,3333, и они называются числами с плавающей точкой. Во всей Звездной Империи мы используем поплавки только один раз. В куске кода вычисляется расстояние между двумя местами. Любое другое число является int.

Таким образом, fleet - это имя структуры данных, содержащей пять переменных типа int. Теперь это для одного флота. Мы не знаем, сколько флотов нам потребуется, поэтому мы выделим достаточно места на 100, используя массив. Думайте о структуре как о обеденном столе с комнатой для пяти человек (целых). Массив похож на длинный ряд обеденных столов. 100 столов означает, что он может вместить 100 х 5 человек.

Если бы мы на самом деле обслуживали эти 100 обеденных столов, нам нужно было бы знать, какой стол какой был, и мы делаем это путем нумерации. В C мы всегда нумеруем элементы массивов, начиная с 0. Первый обеденный стол (флот) - номер 0, следующий - 1, а последний - 99. Я всегда помню, сколько обеденных столов у этого стола с самого начала? Первый в начале, так что 0 вперед.

Так мы объявляем флот (то есть наши обеденные столы).

структурировать флот флотов [100];

Прочитайте это слева направо. Структурный флот относится к нашей структуре, чтобы держать один флот. Имя флота - это имя, которое мы даем всем флотам, и [100] говорит нам, что в переменной fleets есть 100 x struct fleet. Каждый int занимает 4 места в памяти (называемые байтами), поэтому один флот занимает 20 байтов, а 100 флотов - 2000 байтов. Всегда полезно знать, сколько памяти требуется нашей программе для хранения данных.

В структурном флоте каждый из целых содержит целое число. Это число хранится в 4 байтах, и его диапазон составляет от -2 147 483 647 до 2 147 483 648. Большую часть времени мы будем использовать меньшие значения. Существует десять систем, поэтому и fromsystem, и tosystem будут иметь значения от 0 до 9.

На следующей странице: Системы и случайные числа

03

из 05

О системах и случайных числах

Каждая из нейтральных систем (1-8) начинается с 15 кораблей (число, которое я выбрал из воздуха!), А у двух других (у вас: система 0 и ваш компьютерный оппонент в системе 9) по 50 кораблей. Каждый ход количество кораблей в системе увеличивается на 10% с округлением в меньшую сторону. Так что после одного хода, если вы их не двигаете, ваши 50 станут 55, а у каждой из нейтральных систем будет 16 (15 + 1,5 округлено в меньшую сторону). Обратите внимание, что флот, переходящий в другую систему, не увеличивается в количестве.

Увеличение количества кораблей таким способом может показаться немного странным, но я сделал это, чтобы игра продолжалась. Вместо того, чтобы загромождать этот урок слишком большим количеством дизайнерских решений, я написал отдельную статью о дизайнерских решениях Star Empires.

Внедрение систем

В начале мы должны сгенерировать все системы и поместить их на карту, максимум одна система в каждая локация, так как в нашей сетке 5 x 5 есть 25 локаций, у нас будет десять систем и 15 пустых местах. Мы генерируем их, используя функцию GenMapSystems (), которую мы рассмотрим на следующей странице.

Система хранится в структуре со следующими 4 полями, которые все являются int.

структура системы {
int x, y;
int numfleets;
владелец int;
};

Галактика (все 10 систем) хранится в другом массиве, как и во всех флотах, за исключением того, что у нас есть 10 систем.

структура системы галактики [10];

Случайные числа

Все игры требуют случайных чисел. C имеет встроенную функцию rand (), которая возвращает случайное int. Мы можем форсировать это в диапазоне, передавая максимальное число и используя оператор%. (Модуль упругости). Это похоже на арифметику часов за исключением того, что вместо 12 или 24 мы передаем целое число, называемое макс.

/ * возвращает число от 1 до макс. * /
int Random (int max) {
return (rand ()% max) +1;
}

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

  • Интересно, что такое компилятор? Читать Что такое компилятор? (Статья)

Функция подобна математической функции, такой как Sin (x). Эта функция состоит из трех частей:

int Случайный (int max)

Int сообщает, какой тип числа он возвращает (обычно int или float). Random - это имя функции и (int max) говорит, что мы передаем целое число. Мы могли бы использовать это так:

Int Dice;
кубик = случайный (6); / * возвращает случайное число от 1 до 6 * /

Линия:

return (rand ()% max) +1;

На следующей странице: Генерация случайной стартовой карты

04

из 05

Генерация случайной стартовой карты

Карта звездных империй

Этот код ниже генерирует стартовую карту. Вот это показано выше.

void GenMapSystems () {
int i, x, y;
for (x = 0; x for (y = 0; y layout [x] [y] = '';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Найти пустое место для оставшихся 8 систем * /
для (я = 1; я делаю {
х = случайный (5) -1;
у = случайный (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15, -1);
}
}

Генерация систем - это добавление систем игрока и противника (в 0,0) и (4,4), а затем случайным образом добавление 8 систем в оставшихся 23 пустых местах.

В коде используются три переменные типа int, определенные строкой

int i, x, y;

Переменная - это место в памяти, которое содержит значение типа int. Переменные x и y содержат координаты систем и будут содержать значение в диапазоне 0-4. Переменная i используется для подсчета в циклах.

Чтобы разместить 8 случайных систем в сетке 5x5, нам нужно знать, есть ли в одной системе система, и помешать другой системе поместить ее в то же место. Для этого мы используем простой двумерный массив символов. Тип char - это другой тип переменной в C, который содержит один символ, например «B» или «x».

Грунтовка по типам данных в C

Основными типами переменных в C являются int (целые числа, такие как 46), char (один символ, такой как 'A') и float (для хранения чисел с плавающей запятой, таких как 3.567). Массивы [] предназначены для хранения списков одного и того же элемента. Таким образом, char [5] [5] определяет список списков; двумерный массив символов. Думайте об этом как о 25 кусочках Эрудита, расположенных в сетке 5 х 5

Теперь мы петли!

Каждый символ первоначально устанавливается в пробел в двойном цикле, используя два для операторов. Формулировка состоит из трех частей. Инициализация, часть сравнения и часть изменения.

for (x = 0; x for (y = 0; y layout [x] [y] = '';
}

  • х = 0; Это часть инициализации.
  • Икс
  • х ++. Это часть изменения. Это добавляет 1 к х.

Так (для (х = 0; х

Внутри цикла for (x находится цикл for y, который делает то же самое для y. Этот цикл у происходит для каждого значения X. Когда X равен 0, Y будет повторять цикл от 0 до 4, когда X равен 1, Y будет повторять цикл и так далее Это означает, что каждое из 25 мест в массиве макета инициализируется пробелом.

После цикла for вызывается функция InitSystem с пятью параметрами int. Функция должна быть определена до ее вызова, иначе компилятор не будет знать, сколько у нее должно быть параметров. InitSystem имеет эти пять параметров.

На следующей странице: Генерация случайной стартовой карты продолжается ...

05

из 05

Генерация случайной стартовой карты продолжается

Это параметры для InitSystem.

  • systemindex - значение от 0 до 9.
  • х и у - координаты системы (0-4).
  • numships - сколько кораблей в этой системе.
  • владелец. Кто владеет системой 0 означает игрока, 9 означает врага.

Таким образом, строка InitSystem (0,0,0,50,0) инициализирует систему 0 в точках x = -0, y = 0 с 50 кораблями для владельца 0.

C имеет три типа цикла, в то время как циклы, для циклов и циклов do, и мы используем для и делаем в функции GenMapSystems. Здесь мы должны разместить оставшиеся 8 систем где-нибудь в галактике.

для (я = 1; я делаю {
х = случайный (5) -1;
у = случайный (5) -1;
}
while (layout [x] [y]! = '');
InitSystem (i, x, y, 15,0);
}

В этом коде есть два вложенных цикла. Внешний цикл - это оператор for, который считает переменную i от начального значения 1 до конечного значения 8. Мы будем использовать i для ссылки на систему. Помните, что мы уже инициализировали системы 0 и 9, поэтому теперь мы инициализируем системы 1-8.

Все от do {до while (layout [x] [y] - это второй цикл. Синтаксис: do {кое-что} while (условие истинно); Таким образом, мы присваиваем случайные значения x и y, каждое значение в диапазоне 0-4. Random (5) возвращает значение в диапазоне от 1 до 5, вычитание 1 возвращает диапазон от 0 до 4.

Мы не хотим помещать две системы в одинаковые координаты, поэтому этот цикл ищет случайное место, в котором есть пробел. Если там есть система, макет [x] [y] не будет пробелом. Когда мы вызываем InitSystem, он помещает туда другое значение. Кстати! = Означает не равно и == означает равно.

Когда через некоторое время код достигает InitSystem (layout [x] [y]! = ''), X и y определенно ссылаются на место в макете, в котором есть пробел. Таким образом, мы можем вызвать InitSystem и затем обойти цикл for, чтобы найти случайное место для следующей системы, пока все 8 систем не будут размещены.

Первый звонок в InitSystem устанавливает систему 0 в месте 0,0 (в верхнем левом углу сетки) с 50 автопарками и выиграл я. Второй вызов инициализирует систему 9 в местоположении 4,4 (внизу справа) с 50 флотами и принадлежит игроку 1. Мы рассмотрим внимательно, что на самом деле делает InitSystem в следующем уроке.

#define

Эти строки объявляют буквальные значения. Обычно их вводят в верхнем регистре. Везде, где компилятор видит MAXFLEETS, он использует значение 100. Измените их здесь, и это применяется везде:

  • #define WIDTH 80
  • #define HEIGHT 50
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSYSTEMS 10
  • #define FIGHTMARKER 999

Вывод

В этом уроке мы рассмотрели переменные и использование int, char и struct для их группировки, а также массива для создания списка. Тогда простой цикл с помощью для и сделать. Если вы изучите исходный код, одни и те же структуры видны раз за разом.

  • для (я = 0; я
  • для (я = 0; я

Учебник Twowill рассмотрим аспекты C, упомянутые в этом учебнике.

instagram story viewer