Кто кого кушает - можно для каждого смотреть в N клеток вокруг, выбирать жертву (рандом) и соответственно производить нужные действия.
Например: хищник стоит на клетке (5;5), а на клетке (7,6) стоит травоядное. => хищник его видит и может съесть. Если не съел никого за M "ходов" - умер сам. Если лень считать точки, попадающие в окружность, можно "аппрокмимировать" повернутым на 45 градусов квадратом. А если совсем лень, то можно и не повернутым

Воспроизведение соответственно тоже, по заданному времени в соседней клетке появляется такой же.
потом можно добавить рандом, мол хищник не смог поймать травоядное, или травоядное подавилось растением. Еще можно например сделать чтобы если хищник съедает травоядного, то перемещается на его клетку. Или чтобы просто все периодически немного двигались, т.е. если существу из рандом(6) выпало счастливое число 0, то он на одну-две клетки куда-нибудь переезжает.