> 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,