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

>  this.grid.set(dest, baby);

>  return true;

>};

Размножение отнимает в два раза больше энергии, чем есть у новорожденного. Поэтому мы создаём гипотетического отпрыска, используя >elementFromChar на оригинальном существе. Как только у нас есть отпрыск, мы можем выяснить его энергетический уровень и проверить, есть ли у родителя достаточно энергии, чтобы родить его. Также нам потребуется допустимая клетка направления.

Если всё в порядке, отпрыск помещается на сетку (и перестаёт быть гипотетическим), а энергия тратится.

Населяем мир

Теперь у нас есть основа для симуляции существ, больше похожих на настоящие. Мы могли бы поместить в новый мир существ из старого, но они бы просто умерли, так как у них нет свойства >energy. Давайте сделаем новых. Сначала напишем растение, которое, по сути, довольно простая форма жизни.

>function Plant() {

>  this.energy = 3 + Math.random() * 4;

>}

>Plant.prototype.act = function(context) {

>  if (this.energy > 15) {

>    var space = context.find(" ");

>    if (space)

>      return {type: "reproduce", direction: space};

>  }

>  if (this.energy < 20)

>    return {type: "grow"};

>};

Растения начинают со случайного уровня энергии от 3 до 7, чтобы они не размножались все в один ход. Когда растение достигает энергии 15, а рядом есть пустая клетка – оно размножается в неё. Если оно не может размножиться, то просто растёт, пока не достигнет энергии 20.

Теперь определим поедателя растений.

>function PlantEater() {

>  this.energy = 20;

>}

>PlantEater.prototype.act = function(context) {

>  var space = context.find(" ");

>  if (this.energy > 60 && space)

>    return {type: "reproduce", direction: space};

>  var plant = context.find("*");

>  if (plant)

>    return {type: "eat", direction: plant};

>  if (space)

>    return {type: "move", direction: space};

>};

Для растений будем использовать символ >* — то, что будет искать существо в поисках еды.

Вдохнём жизнь

И теперь у нас есть достаточно элементов для нового мира. Представьте следующую карту как травянистую долину, где пасётся стадо травоядных, лежат несколько валунов и цветёт буйная растительность.

>var valley = new LifelikeWorld(

>  ["############################",

>   "#####                 ######",

>   "##   ***                **##",

>   "#   *##**         **  O  *##",

>   "#    ***     O    ##**    *#",

>   "#       O         ##***    #",

>   "#                 ##**     #",

>   "#   O       #*             #",

>   "#*          #**       O    #",

>   "#***        ##**    O    **#",

>   "##****     ###***       *###",

>   "############################"],

>  {"#": Wall,

>   "O": PlantEater,