Изображаем пространство

У сетки, моделирующей мир, заданы ширина и высота. Клетки определяются координатами 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