Mehrere Endlosschleifen gleichzeitig



  • Ich habe versucht ein visuell dargestelltes Spiel in einer Dos Shell zu schreiben. Den Code habe ich dazu auf mehrere Funktionen aufgeteilt.

    Jetzt sollen diese Funktionen einigermaßen gleichzeitig bearbeitet werden:

    1. Prüfe welche Taste grade gedrückt wird und ändere im Array die Position des Spielers entsprechend.

    2. **Lies das Array aus und gib entsprechende Zeilen aus.
    **
    Das ist der grobe Sinn hinter den 2 Funktionen (Gibt aber natürlich noch ein paar mehr).
    Das ist Problem ist, dass ich das aktuell in 2 unterschiedlichen Endlosschleifen laufen habe. Nachdem ich die eine Funktion in der main aufgerufen habe, scheint das Programm die andere Funktion nicht mehr aufzurufen.

    Ist es irgendwie möglich, beide gleichzeitig aufzurufen? Andernfalls müsste ich vermutlich den kompletten code abändern.

    Für die die code wollen, hier ein case davon falls eine Tatse gerückt wird:

    void Big::movePlayer(char direction) {
    
    	switch (direction) {
    		case 'l':
    			system("color a");
    			for (int a = 0; a <= 9; a++) {
    
    				for (int b = 0; b <= 9; b++) {
    
    					if (n.Spielfeld[a] == 1) {
    
    						if (a - 1 != -1) {
    
    							if (a - 1 == 2) {
    								GameOver();
    							}
    
    							n.Spielfeld[a][b] = 0;
    							n.Spielfeld[a - 1][b] = 1;
    						}
    					}
    				}
    			}			break;
    

    **

    (Die Endlosschleife befindet sich in der main)

    [b]Und hier die Ausgabe der Zeichen:**

    void Big::starlight(char arg)
    {
    
    	do {
    
    		for (int a = 0; a <= 10; a++) {
    
    			for (int b = 0; b <= 10; b++) {
    
    				if (n.Spielfeld[a][b] == 0) {
    
    					A[b] = A[b] + "   ";
    				}
    
    				if (n.Spielfeld[a][b] == 1) {
    
    					A[b] = A[b] + "/o\\";
    				}
    
    				if (n.Spielfeld[a][b] == 2) {
    
    					A[b] = A[b] + "\\o/";
    				}
    			}
    		}
    
    		system("cls");
    
    		for (int c = 0; c <= 9; c++) {
    
    			cout << A[c] << endl;
    
    		}
    
    		for (int e = 0; e <= 9; e++) {
    			A[e] = '\0';
    		}
    
    	}		while (arg == 's');
    


  • Ich habe nicht versucht es in einer dos shell zu schreiben, sondern es in einer dos shell visuell darzustellen



  • Mehrere Dinge gleichzeitig auszuführen ist zwar mit Threads prinzipiell möglich, wäre hier aber der völlig falsche Ansatz.
    Du solltest eine Hauptschleife haben, die wiederholt folgendes macht:
    1. Eingaben verarbeiten
    2. Spiellogik behandeln
    3. Spielfeld (oder was auch immer) neu zeichnen



  • Du solltest eher zeigen, mit welchem Code du die Tasten einliest. Such mal nach "kbhit"...



  • Also mal unabhängig davon, dass es nicht wirklich geht, in einem einzigen Thread mehrere Schleifen gleichzeitig laufen zu lassen, hat deine starlight-Methode den entscheidenden Nachteil, dass bei Eingabe von 's' die Schleife dort nie wieder verlassen wird. 'arg' ist eine lokale Kopie eines anderen Wertes in der Methode und da du in der Schleife überhaupt nix damit machst, wird die nie terminieren.

    Mach entweder eine explizite Zuweisung in der Schleife oder - wohl eher sinnvoller - denk darüber nach, wie du dein Programm umstrukturieren kannst. Das macht so leider nicht viel Sinn und ;eea hat da schon einen guten Hinweis gegeben, wie du den Programmablauf gestalten könntest.

    Lustigerweise beschreibst du dein Programm auch in der Reihenfolge "1. mach das, 2. dann das". Genauso solltest du es auch bauen, nämlich nacheinander und nicht mit Endlosschleifen arbeiten. Die CPU wird's dir danken, wenn sie nicht für die Katz bei 90° rumeiert.


Anmelden zum Antworten