Simply game

Материал из ALT Linux Wiki
ALT-review logo.png
[[Annotation::Программировать игры гораздо интереснее чем в них играть... попробую объяснить общие принципы программирования простейших игр без привязки к железу и языку программирования.]]

Автор: Author::Kostyalamer   Раздел: Section::игры   Выпуск: Issue::pilot   Тег: Tag::программирование


Spectrum Forever, Linux Rulez!

Интересное было время: апгрейды компьютера при помощи паяльника, огромное количество кодеров-любителей на просторах СНГ, электронные журналы на 5-ти дюймовых дискетах, книги по программированию издательства Инфорком, система IS-Dos — всего и не перечислишь. Что любопытно, довольно много спектрумистов со временем стали линуксоидами. Видимо Спектрумист это состояние души, не привязанное к конкретному железу, а поэтому Spectrum Forever!

Во времена ZX в числе прочих кодерских радостей я баловался написанием простейших игрушек. Дело это увлекательное, можно с таким же успехом писать игрушки и сейчас на современном железе. Как подтверждение этого тезиса поглядите тему на форуме ALT Linux.

В общем, премудрость не очень хитрая, постараюсь ей поделиться. Если кому стало интересно, то читаем дальше.

Программирование простых игр при помощи двумерных массивов

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

Самое главное придумать интересный сюжет, а как его реализовать — это уже чисто технические вопросы . При помощи двумерных массивов довольно просто программировать логические игры вроде цветных линий, пятнашек, ходом коня и другие простейшие такого же плана, ходилки типа спектрумовской DIZZY и простейшие стрелялки. Программирование игр на искусственный интеллект (дерево перебора) и объемных ходилок/стрелялок (наверное можно реализовать при помощи трехмерного массива) ввиду сложности этих задач для начинающего кодера рассматривать не будем, моя задача объяснить простейшие базовые понятия. Итак, самое главное, что нужно понять новичку — экран монитора это не окно в виртуальный мир, а просто плоскость! Cоответственно у игры, которую вы будете писать, я выделяю три уровня:

  1. Логический — уровень с правилами/сценарием игры, находится в голове программиста (очень рекомендую еще записать все на бумагу для лучшего понимания логики игры) . Собственно на той же бумажке со временем можно написать простейшие алгоритмы при переходе к математическому уровню.
  2. Математический — внутри которого и происходит основное действие игры. В данном случае имеется двумерный массив (например байтов), соответствующий игровому полю, и над этим (или этими в более сложных случаях) массивом производятся соответствующие операции.
  3. Взаимодействия с пользователем — (вершина айсберга), где вы щелкаете мышкой (или нажимаете что-либо на клавиатуре), а в ответ человечек бегает по лабиринту, появляются разноцветные шарики или еще какая-нибудь дребедень. В общем на экране вашей игры происходит какое-либо действие. То есть, в первом приближении, в ответ на ваши действия информация из игрового массива (или из части этого массива) превращается в картинку на вашем мониторе.

Для упрощения ситуации возьмем так называемую одноэкранную игру, т.е. действие происходит в пределах одного экрана монитора без всяких скроллингов прокруток и пролистываний. Теперь чуть подробнее, на примере простейшей игрушки Ходом Коня :

Simplygame.jpg

Логический уровень:

  1. Игровое поле 10x10, по которому прыгает коняга (как водится буквой Г).
  2. Задача игрока — набрать максимальное количество очков, при этом конь может наступать на каждую клетку только один раз, то есть оно не более 100.

Математический уровень:

  1. Создать двумерный массив 10x10, причем 0 в ячейках этого массива будет обозначать пустые клетки, 2 — текущее положение коняги, а 1 — клетки, где ваша лошадка уже успела наследить (понятно, что числа я взял произвольно).
  2. Написать подпрограмму, проверяющую свободна или занята соответствующая ячейка массива (0 или 1), то есть, можно ли поставить туда коня.
  3. Написать подпрограмму, проверяющую наличие свободных полей, доступных для хода коня, если их нет, то Game Over.

Взаимодействия с пользователем — этот уровень достаточно специфичен для каждого языка программирования:

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

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

Скажу сразу, что:

  1. Оптимизацией кода я не занимался (невзирая на это, прога получилась достаточно маленькая).
  2. Gambas-ом я давно не занимаюсь, поэтому задавать мне какие-либо вопросы по нему бесполезно, пример привел, чтобы показать, что эта статейка не просто пустые рассуждения.

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

С уважением, Константин Коган (kostyalamer) __SHOWFACTBOX__