Looking for ideas how to refactor my (complex) algorithm

Posted by _simon_ on Stack Overflow See other posts from Stack Overflow or by _simon_
Published on 2010-04-18T14:55:29Z Indexed on 2010/04/18 15:03 UTC
Read the original article Hit count: 463

Filed under:
|

I am trying to write my own Game of Life, with my own set of rules. First 'concept', which I would like to apply, is socialization (which basicaly means if the cell wants to be alone or in a group with other cells). Data structure is 2-dimensional array (for now).

In order to be able to move a cell to/away from a group of another cells, I need to determine where to move it. The idea is, that I evaluate all the cells in the area (neighbours) and get a vector, which tells me where to move the cell. Size of the vector is 0 or 1 (don't move or move) and the angle is array of directions (up, down, right, left).

This is a image with representation of forces to a cell, like I imagined it (but reach could be more than 5):

ForceAppliedToACell

Let's for example take this picture:

Example

Forces from lower left neighbour: down (0), up (2), right (2), left (0)
Forces from right neighbour     : down (0), up (0), right (0), left (2)
sum                             : down (0), up (2), right (0), left (0)

So the cell should go up.

I could write an algorithm with a lot of if statements and check all cells in the neighbourhood. Of course this algorithm would be easiest if the 'reach' parameter is set to 1 (first column on picture 1). But what if I change reach parameter to 10 for example? I would need to write an algorithm for each 'reach' parameter in advance... How can I avoid this (notice, that the force is growing potentialy (1, 2, 4, 8, 16, 32,...))? Can I use specific design pattern for this problem?

Also: the most important thing is not speed, but to be able to extend initial logic.

Things to take into consideration:

  • reach should be passed as a parameter
  • i would like to change function, which calculates force (potential, fibonacci)
  • a cell can go to a new place only if this new place is not populated
  • watch for corners (you can't evaluate right and top neighbours in top-right corner for example)

© Stack Overflow or respective owner

Related posts about .NET

Related posts about algorithm