/// <summary>Setzt den übergeben Zellenzustand und passt alles weiter entsprechend an</summary> /// <param name="_state">Der Zustand der gesetzt werden soll</param> /// <remarks>Setzt den übergeben Zellenzustand und passt dann die Zellenfarbe entsprechend dem Alter und Zustand an. Außerdem wird hier dann auch die aktuelle /// Altersgruppe festgelegt</remarks> public void SetCellState(STATES _state) { //Je nach übergeben Zustand die Zellenfarbe sowie die Altersgruppe anpassen switch (_state) { case STATES.NONE: m_Renderer.color = new Color(0, 0, 0, 0); break; case STATES.ALIVE: if (m_Age <= (ulong)m_Baby.Age) { m_Renderer.color = m_Baby.AgeColor; m_AgeGroup = AGES.BABY; } else if (m_Age <= (ulong)m_Teenager.Age) { m_Renderer.color = m_Teenager.AgeColor; m_AgeGroup = AGES.TEENAGER; } else if (m_Age <= (ulong)m_Adult.Age) { m_Renderer.color = m_Adult.AgeColor; m_AgeGroup = AGES.ADULT; } else { m_Renderer.color = m_Grandparents.AgeColor; m_AgeGroup = AGES.GRANDPARENTS; } //Ist der aktuelle Zellenzustand "Gestorben" und wird er jetzt auf "Lebendig" gesetzt wird dem Grid Manager mitgeteilt das es eine weitere Lebende //Zelle gibt. if (m_CurrentState == STATES.DEAD) { m_GridManager.LivingCells++; } break; case STATES.DEAD: m_Renderer.color = m_DeadColor; m_Age = 0UL; m_AgeGroup = AGES.NONE; //Ist der aktuelle Zellenzustand "Lebendig" und wird er jetzt auf "Gestorben" gesetzt wird dem Grid Manager mitgeteilt das es eine Lebende weniger //gibt. if (m_CurrentState == STATES.ALIVE) { m_GridManager.LivingCells--; } break; } //Den neuen Zellenzustand speichern, damit die Zelle ihren eigenen Zustand kennt m_CurrentState = _state; }
/// <summary>Zählt wie-viele Nachbarn um die Zelle aktuell Leben. Diese müssen sich aber in dem übergebenen Altersgruppenumfeld befinden</summary> /// <param name="_minAgeGroup">In welcher Altersgruppe müssen sich die Nachtbarzellen mindestens befinden damit sie gezählt werden</param> /// <param name="_maxAgeGroup">In welcher Altersgruppe dürfen sich die Nachtbarzellen maximal befinden damit sie gezählt werden</param> /// <returns>Anzahl der Lebenden Zellen um die Zelle</returns> /// <remarks>Zählt die Nachbarszellen die eine Reihe um die eigene Zelle deren aktueller Zellenzustand "Lebendig" ist. Diese müssen sich aber in dem # /// übergebenen Altersgruppenumfeld befinden</remarks> int AgeGroupNeighbors(AGES _minAgeGroup, AGES _maxAgeGroup) { int TempCounter = 0; //Startposition der Zählung festlegen -> oben Links int TempX = (int)m_CellPos.x - 1; int TempY = (int)m_CellPos.y - 1; //Die Nachbarszellen durchlaufen und überprüfen ob deren aktueller Zustand "Lebendig" ist for (int i = 0; i < 3; i++) { for (int a = 0; a < 3; a++) { //Überprüfen ob es sich um die eigene Zelle handelt if (TempX == (int)m_CellPos.x && TempY == (int)m_CellPos.y) { TempY++; //Eine Zelle weiter nach rechts rutschen continue; } //Überprüfen ob man am oberen oder unteren Spielfeldrand angekommen ist if (TempX < 0 || TempX > m_GridManager.FieldSize.x - 1) { break; } //Überprüfen ob man am linken oder rechten Spielfeldrand angekommen ist. Wenn nicht wird die Nachbarszellen die sich an der TempX und TempY Position des Spielfeld //befindet überprüft ob diese den Zellenzustand "Lebendig" trägt und ob sie sich in dem entsprechenden Altersumfeld befindet. if (TempY >= 0 && TempY <= m_GridManager.FieldSize.y - 1) { if (m_GridManager.Field[TempX, TempY].CurrentState == STATES.ALIVE && m_GridManager.Field[TempX, TempY].m_AgeGroup >= _minAgeGroup && m_GridManager.Field[TempX, TempY].m_AgeGroup <= _maxAgeGroup) { TempCounter++; } } TempY++; //Eine Zelle nach unten rutschen } TempX++; //Eine Zelle weiter nach rechts rutschen TempY = (int)m_CellPos.y - 1; //Suchlauf wieder an der linken Zelle beginnen lassen } return(TempCounter); }