seltsamer verlauf von while schleifen



  • Hallo,
    Bei mir läuft eine maus bis sie zur einer wand kommt.

    while ( vorne_frei(x,y) ){
        vor();
    }
    

    Also vorne_frei fragt ob da eine mauer ist wenn nicht geht die maus ein schritt vor. Wenn vorne_frei false zurück gibt bzw. das feld besetzt ist bleibt die maus stehen und dreht sich. Dann rufe ich die while schleife nochmal mal auf. Im ganzen sieht das so aus.

    while ( vorne_frei(x,y) ){
        vor();
    }
    drehen=2;
    
    while(vorne_frei(x,y)){
        vor();
    }
    

    Dann sollte die Maus weiter gehen weil sie ja keine Mauer mehr vor sich hat. Aber die zweite while schleife wird nicht mehr aufgerufen!!!
    Als wenn vorne_frei eine Variable ist die denn Wert von der ersten while schleife noch hat.
    Aber eig. sollte doch die Funktion aufgerufen werden und nochmal überprüft werden ob vorne keine Mauer ist.
    Kann es sein das der Wert, true oder false, von vorne_frei in einer temporären Variable gespeichert wird die das System erzeugt und das dann in der 2 while schleife die Funktion nicht nochmal aufgerufen wird sondern die temporäre Variabel ausgelesen wird???

    Hoffe das ist verständlich?!?! Ich bitte um Hilfe



  • Nein. Die Funktion wird da bestimmt noch einmal aufgerufen. Wahrscheinlich hast du da einen solchen Fehler in der Funktion gemacht.

    Zeig mal, wie die Funktion aussieht.



  • Daran liegt es glaub ich nicht weil die Funktion beim ersten mal funktioniert und wenn ich die richtung der maus vor dem programm start ändere funktioniert es in jede richtung aber ebend das zweite mal nicht mehr.

    bool vorne_frei (int v, int w){
    
        if (0 == kompass){
             if (spielfeld[v--][w]== ' ')
                return true;
            else if (spielfeld[v--][w]!=' ') {
                return false;
            }
        }
        else if (1 == kompass){
             if (spielfeld[v][w++]== ' ')
                return true;
            else if (spielfeld[v][w++]!=' ') {
                return false;
            }
        }
        else if (2 == kompass){
            if (spielfeld[v++][w]== ' ')
                return true;
            else if (spielfeld[v++][w]!=' ') {
                return false;
            }
    
        }
        else if (3 == kompass){
             if (spielfeld[v][w--]== ' ')
                return true;
            else if (spielfeld[v][w--]!=' ') {
                return false;
            }
        }
        }
    

    Funktioniert in etwa so. Erstmal wird geguckt in welche richtung die maus guckt Kompass=0=Norden, Kompass=1=Osten, usw. Dann wird geguckt ob das Feld vor der maus frei ist ' ' oder ebend nicht. Und gibt dann je nachdem true oder false zurück.
    Das Spielfeld ist ein 2 Dimensionaler char Array.



  • zwerg91 schrieb:

    bool vorne_frei (int v, int w){
    
        if (0 == kompass){
             if (spielfeld[v--][w]== ' ')
                return true;
            else if (spielfeld[v--][w]!=' ') {
                return false;
            }
        }
        else if (1 == kompass){
             if (spielfeld[v][w++]== ' ')
                return true;
            else if (spielfeld[v][w++]!=' ') {
                return false;
            }
        }
        else if (2 == kompass){
            if (spielfeld[v++][w]== ' ')
                return true;
            else if (spielfeld[v++][w]!=' ') {
                return false;
            }
    
        }
        else if (3 == kompass){
             if (spielfeld[v][w--]== ' ')
                return true;
            else if (spielfeld[v][w--]!=' ') {
                return false;
            }
        }
        }
    

    Funktioniert in etwa so. Erstmal wird geguckt in welche richtung die maus guckt Kompass=0=Norden, Kompass=1=Osten, usw. Dann wird geguckt ob das Feld vor der maus frei ist ' ' oder ebend nicht. Und gibt dann je nachdem true oder false zurück.
    Das Spielfeld ist ein 2 Dimensionaler char Array.

    Und an welcher Stelle kommt in dieser Funktion drehen vor?



  • Schauen sollte w nicht ändern. Also nur w+1 statt w--, wo --w gemeint war? Und w-- und dann nochmal w-- hat dann gar nicht das selbe Feld abgefragt. Und der else-Teil hat dann auf was geprüft, was eh klar war.

    bool vorne_frei (int v, int w){
        if (0 == kompass){
             return spielfeld[v-1][w]== ' ';
        }
        else if (1 == kompass){
             return spielfeld[v][w+1]== ' ';
        }
        else if (2 == kompass){
            return spielfeld[v+1][w]== ' ');
        }
        else if (3 == kompass){
             return spielfeld[v][w-1]== ' ');
        }
        }
    


  • Ich habe das umbenannt damit man es sich besser vorstellen kann.
    Eigentlich steht da kompass=2, das ändert dann die richtung der maus.



  • Du hast da schon einmal ein paar logische Fehler drin.

    Warum veränderst du z.B v und w? (Du dekrementierst die da ja.. willst du wahrscheinlich eher nicht..

    Dann kannst du das mit der Überprüfung noch ein wenig einfacher machen.

    bool vorne_frei (int v, int w){
        if (0 == kompass){
             return (spielfeld[v-1][w] == ' ');
        }
        else if (1 == kompass){
             return (spielfeld[v][w+1] == ' ');
        }
        else if (2 == kompass){
             return (spielfeld[v+1][w] == ' ');
        }
        else if (3 == kompass){
             return (spielfeld[v][w-1] == ' ');
        }
    }
    

    Du überprüfst ja, ob das Feld etwas enthält oder nicht und das kannst du dann gleich als Ergebnis zurückliefern.

    Aber zu deinem Fehler. Du machst da oben ja:

    drehen=2;
    

    Aber in der Funktion wird das keine Auswirkung haben. Warum sollte dann also ein anderer Wert zurück kommen?



  • Ok erstmal vielen dank es funktioniert!!! Aber wieso???
    Was ist der unterschied zwischen v++ und v+1???



  • Grundlagen?

    v++ manipuliert v (v = v + 1)

    v + 1 ist ein Ausdruck, der den Wert v + 1 darstellt. v wird nicht manipuliert


Anmelden zum Antworten