int NextGeneration() { int x, y, n, t1, t2, alive = 0; int neighbours; Cell key; Neighbours deadNeighbours = new Neighbours(new List <Cell>()); Dictionary <Cell, int> allDeadNeighbours = new Dictionary <Cell, int>(); List <List <int> > newState = new List <List <int> >(); for (int i = 0; i < _actualState.Count; i++) { _topPointer = 1; _bottomPointer = 1; for (int j = 1; j < _actualState[i].Count; j++) { x = _actualState[i][j]; y = _actualState[i][0]; deadNeighbours.add(x - 1, y - 1, 1) .add(x, y - 1, 1) .add(x + 1, y - 1, 1) .add(x - 1, y, 1) .add(x + 1, y, 1) .add(x - 1, y + 1, 1) .add(x, y + 1, 1) .add(x + 1, y + 1, 1); neighbours = GetNeighboursFromAlive(x, y, i, deadNeighbours); for (int m = 0; m < 8; m++) { if (true) //TODO: if (deadNeighbours[m] !== undefined) { key = new Cell(deadNeighbours.getCell(m).x, deadNeighbours.getCell(m).y, 1); if (!allDeadNeighbours.ContainsKey(key)) { allDeadNeighbours.Add(key, 1); } else { allDeadNeighbours[key]++; } } } if (!(neighbours == 0 || neighbours == 1 || neighbours > 3)) { AddCell(x, y, newState); alive++; _redrawList.Add(new Cell(x, y, 2)); } else { _redrawList.Add(new Cell(x, y, 0)); } } } //Process dead neighbours foreach (Cell keyCell in allDeadNeighbours.Keys) { if (allDeadNeighbours[keyCell] == 3) { AddCell(keyCell.x, keyCell.y, newState); alive++; _redrawList.Add(new Cell(keyCell.x, keyCell.y, 1)); } } _actualState = newState; return(alive); }