cgolam

Conways Game of life, And modifications


License
MIT

Documentation

cgolam Build Status Coverage Status

This is an implementation of Conway's Game of Life, and modifications. You can run the standard game, but the rules, the display the backend store and even the initialisation routines can be swapped out by using alternative callback modules.

Running the standard game

Start the application amd start a standard game like this:

1> ok = application:start(cgolam).
ok
2> cgolam:start([{width, 100}, {height, 100}]).
{ok,<0.83.0>}
3>

Start a version of the standard game but using colours, like this:

cgolam:start([
    {title, "Coloured Conway's Game of Life"},
    {interval, 50},
    {rules, cgolam_rules_coloured, []},
    {field, cgolam_field_ets, []},
    {width, 150}, {height, 150},
    {display, cgolam_display_wx, [{sqsize, 5}]},
    {init, cgolam_rules_coloured, default, [{cluster_size, 150}]}
]).

This looks like different species competing and interbreeding, but the rules are the same as the standard game, so they are cooperative really.

Multiple species

To see an attempt at a true multi species varient, try this one:

cgolam:start([
    {title, "UNcooperative multi species CGoL varient"},
    {interval, 50},
    {rules, cgolam_rules_species3, [{colmatch_algorithm, common_duo}]},
    {field, cgolam_field_ets, []},
    {width, 150}, {height, 150},
    {display, cgolam_display_wx, [{sqsize, 5}]},
    {init, cgolam_rules_species3, default, [
        {cluster_size, 300},
        {cluster_density, 100},
        {clusters, 3}
    ]}
]).

A bit like CGoL generally, it's not so much a life simulation as a curious demonstration of emergent behaviour, it's difficult to say if this exhibits any real competition, but there are elements of that inherent to this cgolam_rules_species3 algorithm certainly.

A single colour will perform entirely according the the CGoL rules but when multiple colours colide, like the coloured version above the results can be a colour combination... but the difference here is that the colours are actually entirely independent from each other and a colour merge only occurs when there is competition for a common cell (i.e. in a given game cycle two different colours both want to occupy the same cell), where as two colours can in fact operate along side one another without having any affect on each other at all IF they never compete...

What constitutes the same colour is a tricky thing, if an exact match is required then the chances of a new colour establishing are small so some tolerance tends to result in more interesting simulations.

For a non tolerant version of the above try this:

cgolam:start([
    {title, "UNcooperative multi species CGoL varient"},
    {interval, 50},
    {rules, cgolam_rules_species3, [{colmatch_algorithm, intolerant_duo}]},
    {field, cgolam_field_ets, []},
    {width, 150}, {height, 150},
    {display, cgolam_display_wx, [{sqsize, 5}]},
    {init, cgolam_rules_species3, default, [
        {cluster_size, 300},
        {cluster_density, 100},
        {clusters, 3}
    ]}
]).

In many ways the simple coloured version looks more interesting, though I think the 'species' versions are intellectually more so.

Running games when the app starts

The games application env variable is a list, and adding lists of properties to it will cause games to be run on application start, for example:

{application, cgolam, [
    {description, "Conways Game of life, And modifications"},
    {vsn, "0.9.0"},
    {registered, [
        cgolam_sup,
        cgolam_game_sup
    ]},
    {applications, [
        kernel,
        stdlib,
        sasl
    ]},
    {mod, {cgolam_app, []}},
    {env, [
        {games, [
            [{title, "Coloured Conway's Game of Life"},
                {interval, 50},
                {rules, cgolam_rules_coloured, []},
                {field, cgolam_field_ets, []},
                {width, 150}, {height, 150},
                {display, cgolam_display_wx, [{sqsize, 5}]},
                {init, cgolam_rules_coloured, default, [{cluster_size, 150}]}
                ],
            [{title, "Coloured Conway's Game of Life"},
                {interval, 50},
                {rules, cgolam_rules_coloured, []},
                {field, cgolam_field_ets, []},
                {width, 150}, {height, 150},
                {display, cgolam_display_wx, [{sqsize, 5}]},
                {init, cgolam_rules_coloured, default, [{cluster_size, 150}]}
                ]
            ]}
    ]}
]}.

Other game specification properties

There are a variety of other supported properties.

rules

Rules allows you to set the rules callback module and any associated config.

Use either {rules, RulesModule, RulesConfig} or {rules, RulesModule}. The default RulesModule is cgolam_rules_normal, with [] default config.

Another rules implementation is cgolam_rules_coloured, which, as noted above, also implements Conway's Game of Life, but uses different colours for the cells, with new cells (becoming alive from dead) assuming a colour mix of the surrounding cells.

IMAGE DISPLAY ERROR    IMAGE DISPLAY ERROR

field

The 'field' is the back end storage of the game state. Use {field, FieldModule, FieldConfig} or {field, FieldModule}. The default FieldModule is cgolam_rules_ets with [] default config. You should have no reason to change this though cgolam_rules_gb_trees and cgolam_rules_tuples also exist.

init

The 'init' property sets the field initialisation module and any associated config. This defaults to the rules module (which initialises the field with data appropriate to the rules) but an alternative can be specified, and alternative types of initialisation can be specified if supported too.

Use {init, InitModule, InitType, InitConfig} or {init, InitModule, InitType}. The default InitType is default (atom) and InitConfig defaults to [] with supported properties being entirely dependent on the module.

The cgolam_rules_normal and cgolam_rules_coloured rules modules default initialisations both support cluster_size and cluster_density which are both percentage numbers (100 default) affecting the size and density of the initial clusters respectively (50 means half, 200 means double, etc). Both also support clusters, which defaults to 3 and 4 for cgolam_rules_normal and cgolam_rules_coloured respectively.

The 'display' property sets the display module and any associated config. The only one currently available is cgolam_display_wx, thus it is the default. Use {display, cgolam_display_wx, DisplayConfig} or {display, cgolam_display_wx}. The default DisplayConfig is [] but {sqsize, N} may be given to set the square size.

Licensing

Copyright 2018 Michael Wright mjw@methodanalysis.com

'cgolam' is free software, you can redistribute it and/or modify it under the terms of the MIT license.