Lesson 5 | Lifeform interaction rules |

Objective | Write a version of next() for empty squares that is based on the lifeform interactions defined in other versions of next(). |

The rules in the different versions of

`next()`

determine a set of interactions between the lifeforms. In this example, we are keeping the interactions purposely simple. We use the array type `world`

as a container for the lifeforms. We will look at how `world`

is initialized and updated in the next lesson.
living* grass::next(world w) { int sum[STATES]; sums(w, sum); if (sum[GRASS] > sum[RABBIT]) //eat grass return (new grass(row, column)); else return (new empty(row, column)); }

Rabbits die of old age if they exceed some defined limit

`DRAB`

.
In addition, rabbits can be eaten if there is an appropriate number of foxes in the neighborhood:
living* rabbit::next(world w) { int sum[STATES]; sums(w, sum); if (sum[FOX] >= sum[RABBIT] ) //eat rabbits return (new empty(row, column)); else if (age > DRAB) //rabbit too old return (new empty(row, column)); else return (new rabbit(row, column, age + 1)); }

Foxes can die of overcrowding, or they die of old age if they exceed some defined limit

`DFOX`

:
living* fox::next(world w) { int sum[STATES]; sums(w, sum); if (sum[FOX] > 5) //too many foxes return (new empty(row, column)); else if (age > DFOX) //fox is too old return (new empty(row, column)); else return (new fox(row, column, age + 1)); }The rules in the different versions of

`next()`

determine a possibly complex set of interactions. Of course, to make the simulation more interesting, other behaviors, such as sexual reproduction, where the animals have gender and can mate, should be simulated.There is another version of

`next()`

where we need one for empty squares.
`next()`

that determines how to fill an empty square in the simulation.