Пример #1
0
        public void Should_kill_lone_cell_on_GenerateNextState()
        {
            var cellFieldInitial = new CellField(3, 3);

            cellFieldInitial.SeedLife(1, 1);

            _sut.GenerateNextState(cellFieldInitial);
            Assert.That(!cellFieldInitial[1, 1].IsAlive);
        }
Пример #2
0
        public void Should_reborn_with_three_neighbours_on_GenerateNextState()
        {
            var cellFieldInitial = new CellField(3, 3);

            cellFieldInitial.SeedLife(0, 0);
            cellFieldInitial.SeedLife(1, 0);
            cellFieldInitial.SeedLife(0, 1);

            _sut.GenerateNextState(cellFieldInitial);
            Assert.That(cellFieldInitial[1, 1].IsAlive);
        }
Пример #3
0
        public void Should_kill_two_neighbour_cells_on_GenerateNextState()
        {
            var cellFieldInitial = new CellField(3, 3);

            cellFieldInitial.SeedLife(0, 0);
            cellFieldInitial.SeedLife(0, 1);

            _sut.GenerateNextState(cellFieldInitial);
            Assert.That(!cellFieldInitial[0, 0].IsAlive);
            Assert.That(!cellFieldInitial[0, 1].IsAlive);
        }
Пример #4
0
    /// <summary>
    /// Запускается, когда нажата клетка на игровом поле.
    /// </summary>
    /// <param name="cell">нажатая клетка</param>
    public void FieldCellPressed(GameObject cell)
    {
        GetComponent <PlayAudio>().FieldAudio();

        inactiveWall = -1;

        // Находим в переданной клетке ее игровую компоненту.
        CellField cf = cell.GetComponent <CellField>();

        // Выделяем нажатую клетку поля цветом.
        cellBackground.transform.position = cf.transform.position;
        cellBackground.SetActive(true);

        // Удаляем все предыдущие ходы с панели.
        ClearChildren();

        // Если панель не активна и есть возможные ходы, то сделать ее активной.
        if (cf.signed)
        {
            possibleMoves.SetActive(false);
        }
        else if (!possibleMoves.activeSelf)
        {
            possibleMoves.SetActive(true);
        }

        if (possibleMoves.activeSelf)
        {
            // Проверяем для каждой стенки, стоит ли она на на данной клетке или нет.
            // Если нет - добавляем соответствующий возможный ход на панель.
            for (int i = 0; i < cf.Walls.Length; i++)
            {
                if (!cf.Walls[i])
                {
                    GameObject possibleMove = Instantiate(cell_p[i], possibleMoves.transform);
                    possibleMove.GetComponent <CellPanel>().sender = cell;
                    inactiveWall = i;

                    // Добавляем в массив потомков нашей панели еще один возможный ход.
                    panelChildren.Add(possibleMove);
                }
            }

            // Возможность поставить крестик/нолик.
            if ((panelChildren.Count == 1 || panelChildren.Count == 0) && !cf.signed)
            {
                GameObject possibleMove = Instantiate(cell_p[4 + (Player.player.CrossTurn ? 0 : 1)], possibleMoves.transform);
                possibleMove.GetComponent <CellPanel>().sender = cell;
                ClearChildren();
                panelChildren.Add(possibleMove);
            }
        }
    }
Пример #5
0
        public void Should_CellField_Equals()
        {
            var cellField1 = new CellField(2, 2);

            cellField1.SeedLife(0, 0);
            var cellField2 = new CellField(2, 2);

            cellField2.SeedLife(0, 0);

            Assert.IsTrue(cellField1.Equals(cellField2));
            Assert.IsFalse(cellField1 == cellField2);
        }
Пример #6
0
    /// <summary>
    /// Запускается, когда выбран ход на панели.
    /// </summary>
    /// <param name="cell">выбранный ход</param>
    public void PanelCellPressed(GameObject cell)
    {
        // Если панель активна, то сделать ее неактивной.
        if (possibleMoves.activeSelf)
        {
            possibleMoves.SetActive(false);
        }

        // Находим в переданной клетке ее игровую компоненту.
        CellPanel cp = cell.GetComponent <CellPanel>();

        // Для клетки, на которую мы нажали и захотели сделать ход на ней, добавляем новую стенку.
        CellField sender = cp.sender.GetComponent <CellField>();

        // Индекс стенки, которую нужно активировать.
        int ind = panelChildren.Count == 1 ? inactiveWall : cp.Index;

        sender.AddSprite(ind, panelChildren.Count == 1);

        if (ind >= 0)
        {
            // Куда нужно сдвинуться от данной клеточки, чтобы поставить соседнюю стенку.
            Vector2 shift = new Vector2((ind - 1) % 2, -(ind - 2) % 2);

            // Находим соседа данной клеточки.
            GameObject neighbour = FindCell(sender.x + (int)shift.x, sender.y + (int)shift.y);

            // Меняем спрайт соседа, если он есть.
            if (neighbour != null)
            {
                neighbour.GetComponent <CellField>().AddSprite((ind + 2) % 4, false);
            }
        }

        // Если поставили знак, увеличиваем количество клеток со знаками и проверяем, закончилась ли игра.
        if (sender.signed)
        {
            signedCells++;

            if (signedCells == GetComponent <FieldGenerator>().cellsHandler.childCount)
            {
                WinOrLose();
            }
        }

        GetComponent <PlayAudio>().PanelAudio();

        cellBackground.SetActive(false);

        // Меняем очередь.
        Player.player.CrossTurn = !Player.player.CrossTurn;
    }
 private IEnumerable <Pixel> ParseToPixelMap(CellField cellField)
 {
     for (int j = 0; j < cellField.Height; j++)
     {
         for (int i = 0; i < cellField.Width; i++)
         {
             var cell = cellField[i, j];
             if (cell.IsAlive)
             {
                 yield return(new Pixel(cell.PosX, cell.PosY, 'O'));
             }
         }
     }
 }
Пример #8
0
        public void Should_state_not_changed_on_GenerateNextState()
        {
            var cellFieldInitial       = new CellField(3, 3);
            var cellFieldWithNextState = new CellField(3, 3);

            for (int j = 0; j < 2; j++)
            {
                for (int i = 0; i < 2; i++)
                {
                    cellFieldInitial.SeedLife(i, j);
                    cellFieldWithNextState.SeedLife(i, j);
                }
            }

            _sut.GenerateNextState(cellFieldWithNextState);
            Assert.That(cellFieldInitial.Equals(cellFieldWithNextState));
        }
Пример #9
0
    /// <summary>
    /// Находит клетку по ее координатам.
    /// </summary>
    /// <param name="x">координата x клетки</param>
    /// <param name="y">координата y клетки</param>
    /// <returns>найденная клетка</returns>
    private GameObject FindCell(int x, int y)
    {
        // Найдем родительский трансформ поля.
        Transform field = GetComponent <FieldGenerator>().cellsHandler;

        foreach (Transform child in field)
        {
            CellField cf = child.gameObject.GetComponent <CellField>();

            // Если клетка имеет заданные координаты.
            if (cf != null && cf.x == x && cf.y == y)
            {
                return(child.gameObject);
            }
        }

        return(null);
    }
Пример #10
0
        public void Run()
        {
            var field = new CellField(40, 40);

            field.SeedFieldRandomly(0.2);
            IEnviroment env = new ClassicEnviroment();

            using (var coeAdapter = new ConsoleOutputEngineAdapter())
            {
                coeAdapter.Render(field);

                for (int i = 0; i < 600; i++)
                {
                    env.GenerateNextState(field);
                    coeAdapter.Render(field);
                    Thread.Sleep(1000);
                }
            }
        }
Пример #11
0
        /// <summary>
        /// Seeds instance of CeedField with alive cells randomly
        /// </summary>
        /// <param name="field"></param>
        /// <param name="density">Value from 0 to 1. Defines the chance of seeding alive cell.</param>
        public static void SeedFieldRandomly(this CellField field, double density)
        {
            if (density < 0 || 1 < density)
            {
                throw new ArgumentOutOfRangeException(nameof(density), density, "Value of the \"{0}\" should be in range of 0 and 1.");
            }

            var random = new Random();

            for (int j = 0; j < field.Height; j++)
            {
                for (int i = 0; i < field.Width; i++)
                {
                    if (random.NextDouble() < density)
                    {
                        field.SeedLife(i, j);
                    }
                }
            }
        }
Пример #12
0
        public void GenerateNextState(CellField field)
        {
            var changedCells = new List <Cell>();

            for (int j = 0; j < field.Height; j++)
            {
                for (int i = 0; i < field.Width; i++)
                {
                    var cell            = field[i, j];
                    var neighboursAlive = field.GetNeighbours(cell).Count(x => x.IsAlive);

                    if (cell.IsAlive)
                    {
                        if (neighboursAlive < _neighboursToLiveMin)
                        {
                            changedCells.Add(new Cell(cell.PosX, cell.PosY, false));
                        }
                        else if (neighboursAlive > _neighboursToLiveMax)
                        {
                            changedCells.Add(new Cell(cell.PosX, cell.PosY, false));
                        }
                    }
                    else
                    {
                        if (neighboursAlive == _neighboursToReborn)
                        {
                            changedCells.Add(new Cell(cell.PosX, cell.PosY, true));
                        }
                    }
                }
            }

            foreach (var cell in changedCells)
            {
                field[cell.PosX, cell.PosY].IsAlive = cell.IsAlive;
            }
        }
Пример #13
0
 public void Setup()
 {
     _sut = new CellField(3, 3);
 }
        public void Render(CellField cellField)
        {
            var pixelMap = ParseToPixelMap(cellField);

            _coe.Render(pixelMap);
        }