В играх практически всегда присутствуют некие объекты, которые находятся в неком пространстве. Они ограничены рамками этого пространства и подчиняются его правилам.
Примеры: теннисная ракетка и мячик внутри прямоугольного поля; фигура Тетриса внутри "стакана"; Марио и его противники внутри игрового уровня со стенками и платформами.
Cамое первое, что нужно сделать, когда пишешь игру, это перевести пространство и объекты в память компьютера, а также уточнить правила, которым будут подчиняться объекты.
Возьмем для примера шахматы.
Пространство шахмат – доска размером 8*8 клеток. Фигуры находятся в клетках. Ни одна фигура не может находиться вне доски – если она не на доске, значит её просто нет. И ни одна фигура не может находиться где-то между клеток. Только в клетке. Также в одной клетке может находиться только одна фигура. Такие правила у этого пространства.
Теперь нужно как-то перенести доску и фигуры в память компьютера. Этот этап называется проектированием.
Каждый раз, когда программист занимается проектированием, он устраивает мозговой штурм. Потому что разных способов много, а хороших мало. Но помните, что способ можно выбрать любой, а в результате все равно получатся числа. В память компьютера мы можем сохранить только числа, а не доску и не фигуры и не наши образы из головы.
Какие же числа это будут?
Как правило, есть две отправных точки: от объектов и от пространства.
Если мы отталкиваемся от объектов, то описываем каждый объект отдельно. В шахматах есть разные фигуры черного и белого цвета. Чтобы описать каждую фигуру, нужно составить список ее свойств:
- Кто она
- Какого цвета
- Где находится
- Как будет взаимодействовать с другими объектами
Я попробую сделать это в лоб.
- Кто она. Элементарно: 1 это пешка, 2 это конь, 3 это слон, и т.д.
- Какого цвета. Пусть 1 будет белый, а 2 будет черный.
- Где находится. Два числа: номер клетки по горизонтали и номер клетки по вертикали (начиная с 0, конечно).
- Как будет взаимодействовать с другими объектами. Так как мне известно, в какой клетке находится каждая фигура, я могу определять их взаимное влияние друг на друга, сравнивая их координаты.
Задайте себе контрольный вопрос – этого достаточно, чтобы однозначно реализовать техническую часть игры в шахматы? Мне кажется, что да.
Хорошо, тогда попробую перевести в числа черного слона, который стоит на клетке 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.
Читайте дальше: Метод "От пространства"