Esempio n. 1
0
        private Cell UpdateCell(PositionInt position, Cell[][] cells, GameOfLifeRules rules)
        {
            Cell result = new Cell();

            result.isAlive = false;

            int numberOfAliveNeighbours = 0;

            // cell position relative to the current cell,
            // find living neighbours
            for (int x = -1; x <= 1; x++)
            {
                for (int y = -1; y <= 1; y++)
                {
                    if (!((x == 0) && (y == 0))) // if not at the center
                    {
                        // position will then be normalized in Cell.GetByPosition() to create an 'endless' plate
                        PositionInt neighbourPosition = new PositionInt(position.GetX() + x, position.GetY() + y);
                        Cell        neighbourCell     = Cell.GetByPosition(ref neighbourPosition, cells);
                        if (neighbourCell.isAlive)
                        {
                            numberOfAliveNeighbours++;
                        }
                    }
                }
            }

            if (CompareWithRule(numberOfAliveNeighbours, rules.neighbours_ToCreate))
            {
                result.isAlive = true;
            }

            if (CompareWithRule(numberOfAliveNeighbours, rules.neighbours_ToSurvive))
            {
                result.isAlive = true;
            }
            else
            if (CompareWithRule(numberOfAliveNeighbours, rules.neighbours_ToDie))
            {
                result.isAlive = false;
            }

            return(result);
        }
Esempio n. 2
0
        public GameOfLifePlate(GameOfLifeRules rules)
        {
            cells = new Cell[rules.plateSize.x][];
            for (int x = 0; x < cells.Length; x++)
            {
                cells[x] = new Cell[rules.plateSize.y];
                for (int y = 0; y < cells[x].Length; y++)
                {
                    cells[x][y] = new Cell();
                }
            }

            this.rules = rules;

            foreach (PositionInt liveCellPosition in rules.initialLiveCells)
            {
                PositionInt position = liveCellPosition;
                Cell        cell     = Cell.GetByPosition(ref position, cells);
                cell.isAlive = true;
            }
        }
Esempio n. 3
0
        protected void RunButton_Click(object sender, EventArgs e)
        {
            GameOfLifeRules gameRules = Newtonsoft.Json.JsonConvert.DeserializeObject <GameOfLifeRules>(textBox.Text);

            PerformCalculations(gameRules);
        }
Esempio n. 4
0
        public async void PerformCalculations(GameOfLifeRules gameRules = null)
        {
            runButton.Enabled = false;

            GameOfLifeRules rules = new GameOfLifeRules();

            if (gameRules == null)
            {
                rules.plateSize        = new PositionInt(60, 60);
                rules.initialLiveCells = new PositionInt[]
                {
                    new PositionInt(1, 0),
                    new PositionInt(2, 0),

                    new PositionInt(0, 1),
                    new PositionInt(0, 2),
                    new PositionInt(0, 3),

                    new PositionInt(1, 2),

                    new PositionInt(1, 4),
                    new PositionInt(2, 4),

                    new PositionInt(3, 1),
                    new PositionInt(3, 3),

                    new PositionInt(4, 2),
                    new PositionInt(5, 2),
                    new PositionInt(6, 2),
                    new PositionInt(7, 2),
                    new PositionInt(8, 2),

                    new PositionInt(7, 1),
                    new PositionInt(7, 3)
                };

                for (int i = 0; i < rules.initialLiveCells.Length; i++)
                {
                    rules.initialLiveCells[i] =
                        new PositionInt(
                            rules.initialLiveCells[i].GetX() + (rules.plateSize.GetX() / 2),
                            rules.initialLiveCells[i].GetY() + (rules.plateSize.GetY() / 2));
                }

                //rules.initialLiveCells = new PositionInt[] { new PositionInt(0, 0), new PositionInt(1, 0), new PositionInt(2, 0) };

                rules.neighbours_ToSurvive = new int[] { 2, 3 };
                rules.neighbours_ToDie     = new int[] { 0, 1, 4, 5, 6, 7, 8 };
                rules.neighbours_ToCreate  = new int[] { 3 };
                rules.numberOfIterations   = 50;
                rules.delay = 70;

                defaultRules = rules;
            }
            else
            {
                rules = gameRules;
            }

            textBox.Height = picture.Size.Height;
            textBox.Width  = picture.Size.Width;
            textBox.Text   = JsonConvert.SerializeObject(rules, Formatting.Indented);

            GameOfLifePlate plate = new GameOfLifePlate(rules);


            for (int i = 0; i < rules.numberOfIterations; i++)
            {
                List <GraphPointArray> cells = new List <GraphPointArray>();
                int x = 0;
                foreach (GameOfLifePlate.Cell[] cellRow in plate.GetCells())
                {
                    int y = 0;
                    foreach (GameOfLifePlate.Cell thisCell in cellRow)
                    {
                        Color cellColor = Color.Black;
                        if (thisCell.isAlive)
                        {
                            cellColor = Color.White;
                        }

                        cells.Add(new GraphPointArray(new List <Position> {
                            new Position(x, y)
                        }, cellColor));

                        y++;
                    }
                    x++;
                }


                if (graph == null)
                {
                    graph = new Graph(
                        500, 500,
                        4,
                        cells.ToArray(),
                        Color.FromArgb(70, 70, 70),
                        $"",
                        new Size(1, 1),
                        false
                        );
                    graph.StartForm();
                }

                picture.Image = (Image)graph.PaintGraph();

                graph.SetGraphPointArray(cells.ToArray());

                plate.NextIteration();

                picture.Invalidate();
                picture.Update();
                picture.Refresh();

                await Task.Delay(rules.delay);
            }

            runButton.Enabled = true;
        }
Esempio n. 5
0
 public void SetRules(GameOfLifeRules rules)
 {
     this.rules = rules;
 }