I was playing a tile-based game and noticed it used what appeared to be a circular shape for the light sources.


How can I generate something similar?

My understanding of cellular automata is that each cell's value is generated based on its neighbours. I had always assumed that every node had to have the exact same behavior, but it looks like the 4's have different behavior.

  • \$\begingroup\$ I'm curious — why do you want to use cellular automata for this? \$\endgroup\$
    – amitp
    Feb 9, 2015 at 16:55
  • \$\begingroup\$ My same thought, explaining this as cellular automata vs procedural generation do have different descriptions in this context \$\endgroup\$
    – Cobertos
    Feb 9, 2015 at 17:00
  • \$\begingroup\$ I was always under the assumption that CA involved starting from a root node and expanding outward, hence the "flow" \$\endgroup\$
    – Kyle Baran
    Feb 14, 2015 at 9:19
  • 1
    \$\begingroup\$ CA doesn't start from a root node and expand; it evaluates all nodes equally. You may be thinking of graph traversal algorithms. \$\endgroup\$
    – amitp
    Feb 14, 2015 at 19:50
  • \$\begingroup\$ Good call, I just started reading about graphs and stuff, so I might've got my terminology confused -- edited title. \$\endgroup\$
    – Kyle Baran
    Feb 16, 2015 at 9:38

2 Answers 2


In the context of cellular automata in second picture, it looks as though the 5 cell might represent a different cell type such that other cells recognize it as a source even if they are separated diagonally. (as @david van brink has shown).
In the context of procedural-generation, it looks rather that the the 5 tile has different behavior from the rest, propagating to not only adjacent tiles but also diagonals while all the rest propagate to just adjacent tiles.

Simple cellular automata might have a simple set of rules where each cell follows a given global behavior but there's nothing that says you must implement your propagation calculations in such simple terms. This is why the idea of cellular automata might not be what you actually want to ask about but just procedural generation in general.
To answer your question, you could define a separate type of tile, say a source tile, which propagates more strongly than just a normal tile. Instead of propagating to just strictly adjacent tiles, it would also propagate to diagonals as well and the rest would carry to adjacent tiles like normal.

  • 2
    \$\begingroup\$ The "5" cell doesn't "push" to adjacent cells; cellular automata requires you to phrase the world such that each cell can compute its own next state, based on its "neighborhood". What the "neighborhood" contains can be defined arbitrarily, as long as all the cells follow the same rule. \$\endgroup\$ Feb 11, 2015 at 2:34
  • 1
    \$\begingroup\$ I have updated my answer to reflect the difference between the two. \$\endgroup\$
    – Cobertos
    Feb 14, 2015 at 18:19

IF this were generated by cellular automata -- It probably wasn't. But the question is sort of interesting, so -- then a plausible algorithm would be:

 start with a field empty but for a single cell marked "5".
 each iteration apply the following algorithm to every cell simultaneously:
   if not blank, do nothing,
   // omit next line to get output on left, include for output on right
   else, if you have a diagonal neighbor "5", mark yourself "4"
     let N = max(non-diagonal neighbors) - 1
     if N > 0, mark yourself N
     else do nothing

Every cell can follow this algorithm, and end up with the pattern posted. And yeah... having a friend called "5" is special, but all cells follow the same rule.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .