Книга: Выразительный JavaScript
Изображаем пространство
Изображаем пространство
У сетки, моделирующей мир, заданы ширина и высота. Клетки определяются координатами x и y. Мы используем простой тип Vector
(из упражнений к предыдущей главе) для представления этих пар координат.
function Vector(x, y) {
this.x = x;
this.y = y;
}
Vector.prototype.plus = function(other) {
return new Vector(this.x + other.x, this.y + other.y);
};
Потом нам нужен тип объекта, моделирующий саму сетку. Сетка – часть мира, но мы делаем из неё отдельный объект (который будет свойством мирового объекта), чтобы не усложнять мировой объект. Мир должен загружать себя вещами, относящимися к миру, а сетка – вещами, относящимися к сетке.
Для хранения сетки значений у нас есть несколько вариантов. Можно использовать массив из массивов-строк, и использовать двухступенчатый доступ к свойствам:
var grid = [["top left", "top middle", "top right"],
["bottom left", "bottom middle", "bottom right"]];
console.log(grid[1][2]);
// ? bottom right
Или мы можем взять один массив, размера width ? height, и решить, что элемент (x, y) находится в позиции x + (y ? width).
var grid = ["top left", "top middle", "top right",
"bottom left", "bottom middle", "bottom right"];
console.log(grid[2 + (1 * 3)]);
// ? bottom right
Поскольку доступ будет завёрнут в методах объекта сетки, внешнему коду всё равно, какой подход будет выбран. Я выбрал второй, потому что с ним проще создавать массив. При вызове конструктора Array
с одним числом в качестве аргумента он создаёт новый пустой массив заданной длины.
Следующий код объявляет объект Grid
(сетка) с основными методами:
function Grid(width, height) {
this.space = new Array(width * height);
this.width = width;
this.height = height;
}
Grid.prototype.isInside = function(vector) {
return vector.x >= 0 && vector.x < this.width &&
vector.y >= 0 && vector.y < this.height;
};
Grid.prototype.get = function(vector) {
return this.space[vector.x + this.width * vector.y];
};
Grid.prototype.set = function(vector, value) {
this.space[vector.x + this.width * vector.y] = value;
};
Элементарный тест:
var grid = new Grid(5, 5);
console.log(grid.get(new Vector(1, 1)));
// ? undefined
grid.set(new Vector(1, 1), "X");
console.log(grid.get(new Vector(1, 1)));
// ? X
- 6.3 Пространство имен устройств
- Временное пространство сортировки
- Адресное пространство процесса
- 3.1. Адресное пространство Linux
- 20.3. Rinda: пространство кортежей в Ruby
- Глава 14 Адресное пространство процесса
- Пространство пользователя и параметр HZ
- Отображение файла на адресное пространство процесса
- Включение и отключение "использовать все пространство"
- 7 Контент-платформа: пространство, где контент живет и работает
- Глава 1 Пространство мифа
- Пространство или время