// 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();
    }