Выразительный JavaScript (Хавербеке) - страница 71

>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

Программный интерфейс существ

Перед тем, как заняться конструктором мира >World, нам надо определиться с объектами существ, населяющих его. Я упомянул, что мир будет спрашивать существ, какие они хотят произвести действия. Работать это будет так: у каждого объекта существа есть метод >act, который при вызове возвращает действие >action. >Action – объект типа >property, который называет тип действия, которое хочет совершить существо, к примеру >“move”. >Action может содержать дополнительную информацию – такую, как направление движения.

Существа ужасно близоруки и видят только непосредственно прилегающие к ним клетки. Но и это может пригодиться при выборе действий. При вызове метода >act ему даётся объект >view, который позволяет существу изучить прилегающую местность. Мы называем восемь соседних клеток их направлениями по компасу: >“n” на север, >“ne” на северо-восток, и т. п. Вот какой объект будет использоваться для преобразования из названий направлений в смещения по координатам:

>var directions = {

>  "n":  new Vector( 0, -1),

>  "ne": new Vector( 1, -1),

>  "e":  new Vector( 1,  0),

>  "se": new Vector( 1,  1),

>  "s":  new Vector( 0,  1),

>  "sw": new Vector(-1,  1),

>  "w":  new Vector(-1,  0),

>  "nw": new Vector(-1, -1)

>};

У объекта >view есть метод >look, который принимает направление и возвращает символ, к примеру >"#", если там стена, или пробел, если там ничего нет. Объект также предоставляет удобные методы >find и >findAll. Оба принимают один из символов, представляющих вещи на карте, как аргумент. Первый возвращает направление, в котором этот предмет можно найти рядом с существом, или же >null, если такого предмета рядом нет. Второй возвращает массив со всеми возможными направлениями, где найден такой предмет. Например, существо слева от стены (на западе) получит >[“ne”, “e”, “se”] при вызове >findAll с аргументом >“#”.

Вот простое тупое существо, которое просто идёт, пока не врезается в препятствие, а затем отскакивает в случайном направлении.