コード例 #1
0
ファイル: ListLife.cs プロジェクト: wiziwizi/Game-of-life
    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);
    }