Scala: Game of Life

I’m trying to write as many small programs as possible on my way to learn Scala. Along the lines, Dhananjay Nene suggested that Conway’s Game of Life is a good one to implement. So here is an implementation, feel free to critique.

I tried to write it in a more functional way but you would surely see an overlap of imperative programming style (having worked with Java for over a decade now).

Rules of the game

[Reproduced from the same Wikipedia article linked above]

The universe of the Game of Life is an infinite two-dimensional orthogonal grid of square cells, each of which is in one of two possible states, live or dead. Every cell interacts with its eight neighbors, which are the cells that are directly horizontally, vertically, or diagonally adjacent. At each step in time, the following transitions occur:

  1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
  2. Any live cell with more than three live neighbours dies, as if by overcrowding.
  3. Any live cell with two or three live neighbours lives on to the next generation.
  4. Any dead cell with exactly three live neighbours becomes a live cell.

The initial pattern constitutes the seed of the system. The first generation is created by applying the above rules simultaneously to every cell in the seed—births and deaths happen simultaneously, and the discrete moment at which this happens is sometimes called a tick (in other words, each generation is a pure function of the one before). The rules continue to be applied repeatedly to create further generations.

Code

Hopefully self explanatory ;)

Test

Let’s pass in live cell coordinates and board size to mimic the behavior of Oscillators (Beacon) pattern. See image below:

Output

A dot (.) represents an empty cell and a star (*) represents a live cell.  Initial, generation 1 and generation 2 in that order below:…… .**… .*…. ….*. …**. …… …… .**… .**… …**. …**. …… …… .**… .*…. ….*. …**. ……

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *