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); }
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); }
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); }
/// <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); } } }
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); }
/// <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')); } } } }
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)); }
/// <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); }
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); } } }
/// <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); } } } }
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; } }
public void Setup() { _sut = new CellField(3, 3); }
public void Render(CellField cellField) { var pixelMap = ParseToPixelMap(cellField); _coe.Render(pixelMap); }