// Use this for initialization void Awake() { WidthPlayfield = LevelSettings.GetLevelWidth(); HeightPlayfield = LevelSettings.GetLevelHeight(); _pathHelp = gameObject.GetComponent <ShowPath>(); // Fehlerfall abdecken, falls Groesse und Hoehe des Spielfelds kleiner als 1 if (WidthPlayfield < 1) { WidthPlayfield = 1; } if (HeightPlayfield < 1) { HeightPlayfield = 1; } TilesField = new bool[HeightPlayfield, WidthPlayfield]; int posX = (int)Random.Range(0, WidthPlayfield); // Startwert auf der X-Achse wird gewuerfelt int posY = 0; // zaehlt die "Zeilen" des Arrays tilesField hoch, Start bei 0 TilesField[posY, posX] = IS_CORRECT_TILE; // Startwert als ersten Wert in das Spielfeld eintragen _pathHelp.AddToPathList(posX, posY); int pathDirection = 0; // speichert die moeglichen Richtungen des Pfades, initial = 0 (vorwaerts) int pathLength; // speichert die Laenge des Pfads in die gewuerfelte Richtung int pathEnd; // Abbruchbedingung for-Schleife, ansonsten wird currentPosition in der Bedingung ueberschrieben int maxForwardLength = (HeightPlayfield / 5 + 2); // Laenge des Pfads kann sich je nach Einstellung aendern. DEFAULT: (height - currentPosY) TileOffset = Mathf.Abs(TileOffset); TileWidth = TilePrefab.transform.localScale.x + TileOffset; // speichert die Breite des Tile Prefabs TileHeight = TilePrefab.transform.localScale.z + TileOffset; // speichert die Laenge des Tile Prefabs bool isRight = false, isLeft = false; // geben die Richtung des letzten Schritts an int heightCounter = 1; // verhindert einen aufeinanderfolgenden links-rechts-Schritt, = 1, da Startwert als ein Schritt gilt, ansonsten = 2 // legt den richtigen Laufpfad fest while (posY < (HeightPlayfield - 1)) { // welche Richtung wurde gewaehlt, Startwert ist immer vorwaerts switch (pathDirection) { // PFADRICHTUNG VORWAERTS case 0: pathLength = (int)Random.Range(1, maxForwardLength); heightCounter -= pathLength; // Hoehenunterschied durch Schritt berechnen pathEnd = posY + pathLength; for (int indxY = (posY + 1); indxY <= pathEnd && posY < (HeightPlayfield - 1); indxY++) { TilesField[indxY, posX] = IS_CORRECT_TILE; _pathHelp.AddToPathList(posX, indxY); posY = indxY; } // naechste Pfadrichtung waehlen // // Fall abdecken, falls Breite doch mal 1 entsprechen sollte if (WidthPlayfield == 1) { pathDirection = 0; break; } // Normalfaelle - Hoehenunterschied von if (heightCounter <= 0) { if (posX == 0) // Position ganz links --> naechste Wegrichtung ist rechts { pathDirection = 1; } else if (posX == (WidthPlayfield - 1)) // Position ganz rechts --> neachste Wegrichtung ist links { pathDirection = -1; } else // ansonsten wuerfel aus, ob links oder rechts { pathDirection = (Random.Range(0f, 1f) < 0.5f) ? pathDirection = -1 : pathDirection = 1; } isLeft = false; isRight = false; } else { if (isLeft && posX != 0) { pathDirection = Random.Range(-1, 1); } else if (heightCounter > 0 && isRight && posX != (WidthPlayfield - 1)) { pathDirection = Random.Range(0, 2); } // ansonsten bleibt pathDirection unveraendert, muss nicht abgefragt werden } break; // PFADRICHTUNG LINKS ODER RECHTS default: // PFADRICHTUNG LINKS if (pathDirection < 0) { pathLength = (int)Random.Range(1, (posX + 1)); pathEnd = posX - pathLength; for (int indxX = (posX - 1); indxX >= pathEnd; indxX--) { TilesField[posY, indxX] = IS_CORRECT_TILE; _pathHelp.AddToPathList(indxX, posY); posX = indxX; } // naechste Pfadrichtung angeben isLeft = true; } // PFADRICHTUNG RECHTS else if (pathDirection > 0) { pathLength = (int)Random.Range(1, (WidthPlayfield - posX)); pathEnd = posX + pathLength; for (int indxX = (posX + 1); indxX <= pathEnd; indxX++) { TilesField[posY, indxX] = IS_CORRECT_TILE; _pathHelp.AddToPathList(indxX, posY); posX = indxX; } isRight = true; } // naechste Pfadrichtung ist vorwaerts pathDirection = 0; heightCounter = 2; break; } } // ENDE WHILE // Generierung des Spielfelds CreateBoard(); }