Labyrinth



  • Hallo,

    ich versuche gerade aus folgendem Programm von unserem Prof schlau zu werden

    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int sum=0;
    
    void mazeTraverse( char [][14], int, int );
    
    int main()
    {
    	char maze[14][14] = 
    	{
    	{ '.','.','.','.','.','.','.','.','.','.','.','.','.','.' },
    	{ '.','#','#','#','#','#','#','#','#','#','#','#','#','.' },
    	{ '.','#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ','#','.' },
    	{ '.',' ',' ','#',' ','#',' ','#','#','#','#',' ','#','.' },
    	{ '.','#','#','#',' ','#',' ',' ',' ',' ','#',' ','#','.' },
    	{ '.',' ',' ',' ',' ',' ','#','#','#',' ','#',' ',' ','.' },
    	{ '.','#','#','#','#',' ','#',' ','#',' ','#',' ','#','.' },
    	{ '.','#',' ',' ','#',' ','#',' ','#',' ','#',' ','#','.' },
    	{ '.','#','#',' ','#',' ','#',' ','#',' ','#',' ','#','.' },
    	{ '.','#',' ',' ',' ',' ',' ',' ',' ',' ','#',' ','#','.' },
    	{ '.','#','#','#','#','#','#',' ','#','#','#',' ','#','.' },
    	{ '.','#',' ',' ',' ',' ',' ',' ','#',' ',' ',' ','#','.' },
    	{ '.','#','#','#','#','#','#','#','#',' ','#','#','#','.' },
    	{ '.','.','.','.','.','.','.','.','.','.','.','.','.','.' }
    	};
    
    	mazeTraverse( maze, 3, 1 );
    
    	cout << "Es gibt " << sum << " Ausgaenge" << endl;
    
    	system("pause");
    
    	return 0;
    
    }	
    
    void mazeTraverse( char m[][14], int r, int c )
    {
    	static int update = time( 0 ) % 10;
    
    	while ( time(0) % 10 != update )
    		;	// warten
    
    	if ( time( 0 ) % 10 == 9 )
    		update = 0;
    	else
    		update = (time( 0 ) % 10) + 1;
    
    	m[r][c] = 'x';	// Punkt als besucht markieren
    
    	system("cls");
    
    	// Labyrinth ausgeben
    	for ( int row = 0; row < 14; row++ )
    	{
    		for ( int column = 0; column < 14; column++ )
    			cout << m[row][column];
    
    		cout << '\n';
    	}
    
    	if ( m[r][c] == 'E' )
    	{
    		cout << "\nsuccess!\n";
    		return;
    	}
    	else
    	{
    		if ( m[r-1][c] == ' ' || m[r-1][c] == 'E' )	// wenn Bewegung hoch möglich
    			mazeTraverse( m, r-1, c );	// hochbewegen
    
    		if ( m[r-1][c] == '.' || m[r][c+1] == 'E' ) //Überprüfen ob . getroffen
    
    		    sum++; // Summe (der Ausgänge) hochzählen
    
    		if ( m[r+1][c] == ' ' || m[r+1][c] == 'E' )	// wenn Bewegung runter möglich
    			mazeTraverse( m, r+1, c );	// runterbewegen
    
    		if ( m[r+1][c] == '.' || m[r][c+1] == 'E' ) //Überprüfen ob . getroffen
    
    		    sum++; // Summe (der Ausgänge) hochzählen
    
    		if ( m[r][c-1] == ' ' || m[r][c-1] == 'E' )	// Wenn Linksbewegung möglich
    			mazeTraverse( m, r, c-1 );	// nach links bewegen
    
    		if ( m[r][c-1] == '.' || m[r][c+1] == 'E' ) //Überprüfen ob . getroffen
    
    		    sum++; // Summe (der Ausgänge) hochzählen
    
    		if ( m[r][c+1] == ' ' || m[r][c+1] == 'E' )	// Wenn Rechtsbewegung möglich
    			mazeTraverse( m, r, c+1 );	// nach rechts bewegen
    
    		if ( m[r][c+1] == '.' || m[r][c+1] == 'E' ) //Überprüfen ob . getroffen
    
    		    sum++; // Summe (der Ausgänge) hochzählen
    
    		return;
    	}
    
    }	// end function mazeTraverse
    

    Mir sind eigentlich auch alle Schritte klar, bis auf dieser hier:

    if ( m[r][c] == 'E' )
    	{
    		cout << "\nsuccess!\n";
    		return;
    	}
    

    Wozu ist dieses E, woher kommt es und wieso ist dort dieses cout das, wenn ich das programm laufen lasse nie ausgegeben wird? Wieso werden die Bewegungen damit verglichen?

    Gruß

    Gunnar



  • Blind geraten: Vermutlich ist die Kennung 'E' für eine Erweiterung des Programms vorgesehen (wenn du bei dem E ankommst, hast du gewonnen). Jedenfalls werten alle anderen Abfragen das E als freies Feld (und als Kennzeichnung für einen Ausgang).

    Aber am besten fragst du danach mal deinen Prof.



  • I see.... aber wenn ich es lösche funktioniert es nicht mehr?

    Edit: vergiss es funktioniert doch 😉



  • Aber eines noch...

    was macht das:

    while ( time(0) % 10 != update )
            ;    // warten
    
        if ( time( 0 ) % 10 == 9 )
            update = 0;
        else
            update = (time( 0 ) % 10) + 1;
    

    Ist das dafür verantwortlich, ob das LAbyrinth neugestartet wird, oder fortgesetzt?



  • ThaRealMatix schrieb:

    Aber eines noch...

    was macht das:

    while ( time(0) % 10 != update )
            ;    // warten
    

    Das ist eine Warteschleife, um den Programmablauf etwas auszubremsen (time() gibt die Sekunden seit 1.1.1970 zurück, update wird (siehe unten) als Zielvorgabe für die Zeit gesetzt.

    if ( time( 0 ) % 10 == 9 )
            update = 0;
        else
            update = (time( 0 ) % 10) + 1;
    

    Damit wird für den nächsten Schleifendurchlauf update neu gesetzt (effektiv auf "jetzt plus 1 Sekunde").

    Insgesamt bewirkt diese Konstruktion, daß du auch mitverfolgen kannst, wie sich das Programm durch das Labyrinth durchhangelt (setz den ganzen Block mal in /.../ und dann schau dir an, wie schnell das Programm arbeitet).


Anmelden zum Antworten