Ejemplo n.º 1
0
        public void ParallelStep()
        {
            if (this._size == 0)
            {
                return;
            }
            ++_generation;
            OnGenerationChanged();
            Cell[,] newCells = new Cell[this._size, this._size];
            AliveCells.Clear();
            ConcurrentBag <Coordinates> modifiedCells = new ConcurrentBag <Coordinates>();

            Parallel.For(0, this._size, (i) =>
            {
                for (int j = 0; j < this._size; ++j)
                {
                    int aliveNeighbors = CountNeighboringAliveCells(i, j);
                    if (_cells[i, j] == Cell.Alive && (aliveNeighbors == 2 || aliveNeighbors == 3))
                    {
                        newCells[i, j] = Cell.Alive;
                        AliveCells.Add(new Coordinates(i, j));
                    }
                    else if (_cells[i, j] == Cell.Dead && aliveNeighbors == 3)
                    {
                        newCells[i, j] = Cell.Alive;
                        //OnCellChanged(i, j, newCells[i, j]);
                        AliveCells.Add(new Coordinates(i, j));
                        modifiedCells.Add(new Coordinates(i, j));
                    }
                    else if (_cells[i, j] == Cell.Alive && (aliveNeighbors < 2 || aliveNeighbors > 3))
                    {
                        newCells[i, j] = Cell.Dead;
                        //OnCellChanged(i, j, newCells[i, j]);
                        modifiedCells.Add(new Coordinates(i, j));
                    }
                    else
                    {
                        newCells[i, j] = Cell.Dead;
                    }
                }
            });
            foreach (Coordinates coord in modifiedCells)
            {
                OnCellChanged(coord.x, coord.y, newCells[coord.x, coord.y]);
            }

            this._cells = newCells;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calculates the next generation
        /// </summary>
        public void Step()
        {
            if (this._size == 0)
            {
                return;
            }
            ++_generation;
            OnGenerationChanged();
            Cell[,] newCells = new Cell[this._size, this._size];
            AliveCells.Clear();
            for (int i = 0; i < this._size; ++i)
            {
                for (int j = 0; j < this._size; ++j)
                {
                    int aliveNeighbors = CountNeighboringAliveCells(i, j);
                    if (_cells[i, j] == Cell.Alive && (aliveNeighbors == 2 || aliveNeighbors == 3))
                    {
                        newCells[i, j] = Cell.Alive;
                        AliveCells.Add(new Coordinates(i, j));
                    }
                    else if (_cells[i, j] == Cell.Dead && aliveNeighbors == 3)
                    {
                        newCells[i, j] = Cell.Alive;
                        OnCellChanged(i, j, newCells[i, j]);
                        AliveCells.Add(new Coordinates(i, j));
                    }
                    else if (_cells[i, j] == Cell.Alive && (aliveNeighbors < 2 || aliveNeighbors > 3))
                    {
                        newCells[i, j] = Cell.Dead;
                        OnCellChanged(i, j, newCells[i, j]);
                    }
                    else
                    {
                        newCells[i, j] = Cell.Dead;
                    }
                }
            }

            this._cells = newCells;
        }
Ejemplo n.º 3
0
        public void NewPattern(int size, bool isRandom)
        {
            this._size       = size;
            this._generation = 0;
            Random rand = new Random();

            if (AliveCells == null)
            {
                AliveCells = new List <Coordinates>();
            }
            else
            {
                AliveCells.Clear();
            }
            this._cells = new Cell[this._size, this._size];
            for (int i = 0; i < this._size; ++i)
            {
                for (int j = 0; j < this._size; ++j)
                {
                    if (isRandom)
                    {
                        int isAlive = rand.Next(0, 2);
                        if (isAlive == 1)
                        {
                            this._cells[i, j] = Cell.Alive;
                            AliveCells.Add(new Coordinates(i, j));
                        }
                        else
                        {
                            this._cells[i, j] = Cell.Dead;
                        }
                    }
                    else
                    {
                        this._cells[i, j] = Cell.Dead;
                    }
                }
            }
            OnLoadComplete();
        }