Найти тему
ZDG

Проектирование игр. Объекты против пространства. Часть 1.

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

Примеры: теннисная ракетка и мячик внутри прямоугольного поля; фигура Тетриса внутри "стакана"; Марио и его противники внутри игрового уровня со стенками и платформами.

Cамое первое, что нужно сделать, когда пишешь игру, это перевести пространство и объекты в память компьютера, а также уточнить правила, которым будут подчиняться объекты.

Возьмем для примера шахматы.

-2

Пространство шахмат – доска размером 8*8 клеток. Фигуры находятся в клетках. Ни одна фигура не может находиться вне доски – если она не на доске, значит её просто нет. И ни одна фигура не может находиться где-то между клеток. Только в клетке. Также в одной клетке может находиться только одна фигура. Такие правила у этого пространства.

Теперь нужно как-то перенести доску и фигуры в память компьютера. Этот этап называется проектированием.

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

Какие же числа это будут?

Как правило, есть две отправных точки: от объектов и от пространства.

Если мы отталкиваемся от объектов, то описываем каждый объект отдельно. В шахматах есть разные фигуры черного и белого цвета. Чтобы описать каждую фигуру, нужно составить список ее свойств:

  1. Кто она
  2. Какого цвета
  3. Где находится
  4. Как будет взаимодействовать с другими объектами

Я попробую сделать это в лоб.

  1. Кто она. Элементарно: 1 это пешка, 2 это конь, 3 это слон, и т.д.
  2. Какого цвета. Пусть 1 будет белый, а 2 будет черный.
  3. Где находится. Два числа: номер клетки по горизонтали и номер клетки по вертикали (начиная с 0, конечно).
  4. Как будет взаимодействовать с другими объектами. Так как мне известно, в какой клетке находится каждая фигура, я могу определять их взаимное влияние друг на друга, сравнивая их координаты.

Задайте себе контрольный вопрос – этого достаточно, чтобы однозначно реализовать техническую часть игры в шахматы? Мне кажется, что да.

Хорошо, тогда попробую перевести в числа черного слона, который стоит на клетке e2:

3 (слон), 2 (черный), 4 (e), 1 (2)

Итак, я получил 4 числа: 3,2,4,1

И эти числа описывают игровой объект - черного слона, который стоит в клетке e2. Здорово, правда? Мы смотрим на числа, а видим слона.

Я уже могу сохранить состояние этого слона в памяти.

В начале шахматной партии имеется 32 фигуры, значит мне понадобится 32*4=128 байт памяти для хранения всех фигур. Почему байт? Потому что ни одно из этих чисел не будет больше 255, значит хватит одного байта на каждое число.

Это хоть и не лучшее, но вполне годное решение. Но за этапом проектирования идет этап ревизии. Как правило, программист замечает, что сделал что-то не так, или что-то можно упростить.

Мне сразу подумалось, что не надо хранить номер клетки отдельно по горизонтали и по вертикали. У доски 64 клетки, и если их просто посчитать слева направо/сверху вниз, то все они получат адрес (расстояние) от начала доски, выражаемый числом 0..63. Достаточно хранить только адрес клетки. Координаты по горизонтали и вертикали легко вычисляются из адреса.

Адреса клеток шахматной доски
Адреса клеток шахматной доски

Из e2 получится адрес 52, значит теперь черный слон будет представлен так:

3 (слон), 2 (черный), 52 (адрес клетки)

Тут мне приходит в голову еще одна идея. А зачем отдельно хранить цвет фигуры? Можно просто пронумеровать все фигуры подряд, и белые и черные. Пусть белые фигуры будут первые в списке. Пешка – 1, конь – 2, слон – 3, ладья – 4, ферзь – 5, король – 6. А дальше пусть идут черные: пешка – 7, конь – 8, слон – 9, ладья – 10, ферзь – 11, король – 12.

Теперь мой черный слон выглядит так:

9 (черный слон), 52 (адрес клетки)

От чисел 3,2,4,1 я пришел к числам 9,52, сэкономив 2 байта на каждой фигуре.

Хотите еще прикол? Так как тип фигуры - это один байт, то можно вместо числа написать символ, ведь символ - это тоже один байт. Это немножко улучшит читабельность кода. Вместо непонятной цифры 9 удобнее видеть 'B' - это я так назвал слона, от англ. Bishop, вы же можете назвать как хотите. У меня белый слон будет 'b', а черный слон - 'B'. Теперь черный слон на клетке e2 в коде программы будет выглядеть так:

'B', 52,

А в памяти будет записан так:

66, 52

Потому что 66 - это код буквы 'B'.

Пока что всё выглядит замечательно, но есть маленький подвох: а где 4-й вопрос этапа проектирования, то есть взаимодействие объектов?

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

А здесь, для завершения выпуска, я приведу полный набор данных, которые получились при кодировании всех шахматных фигур в начальной позиции:

Вот мне и пригодился массив :) Это запись на условном языке, но она вполне сойдет для Javascript.

Читайте дальше: Метод "От пространства"