Beispiel #1
0
        public Life(int size, int numOfLifes)
        {
            _uni = new University(size);
            _size = size;

            List<int> generated = new List<int>();
            for (int i = 0; i < numOfLifes; i++)
            {
                int r = rnd.Next(size * size);
                if (generated.Contains(r))
                    continue;
                int row = r % size;
                int column = r / size;
                _uni[row, column] = true;
            }
        }
Beispiel #2
0
        //пустая (мёртвая) клетка, рядом с которой ровно три живые клетки, оживает;
        //если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает (от «одиночества» или от «перенаселённости»).
        //Игра прекращается, если на поле не останется ни одной «живой» клетки, или если при очередном шаге ни одна из клеток не меняет своего состояния (складывается стабильная конфигурация).
        public void Evaluate(int subTaskNumberSqrt)
        {
            //create shalow copy of universe
            _prev = new University(_uni);

            //evaluate universe size for each task
            int taskSize = _size / subTaskNumberSqrt;

            Task[] tasks = new Task[subTaskNumberSqrt * subTaskNumberSqrt];
            for (int k = 0; k < subTaskNumberSqrt * subTaskNumberSqrt; k++)
            {
                tasks[k] = new Task((state) =>
                {
                    int ind = (int)state;
                    int starti = (ind % subTaskNumberSqrt) * taskSize;
                    int startj = (ind / subTaskNumberSqrt) * taskSize;
                    for (int i = starti; i < starti + taskSize; i++)
                        for (int j = startj; j < startj + taskSize; j++)
                        {
                            int countNeig = CountNeighborn(_prev, i, j);
                            if (_prev[i, j])
                                if (countNeig < 2 || countNeig > 3)
                                    _uni[i, j] = false;
                            if (!_prev[i, j])
                                if (countNeig == 3)
                                        _uni[i, j] = true;
                        }
                },k);
                tasks[k].Start();
            }

            //wait for all tasks end
            for (int i = 0; i < subTaskNumberSqrt * subTaskNumberSqrt; i++)
                tasks[i].Wait();

            //clear reference for gc
            _prev = null;
        }
Beispiel #3
0
 private int CountNeighborn(University uni, int row, int col)
 {
     int count = 0;
     for (int i = row - 1; i <= row + 1; i++)
         for (int j = col - 1; j <= col + 1; j++)
             if (uni[i, j])
                 count++;
     if (uni[row, col])
         count--;
     return count;
 }
Beispiel #4
0
 public University(University u)
 {
     this.size = u.size;
     uni = (bool[,])u.uni.Clone();
 }