Flackern trotz system("clr")



  • Hallo,

    ich habe ein kleines Problem und Google hat mir nur teilweise geholfen.

    Ich habe ein kleines "Spiel" indem ich ein X über ein Spielfeld steuere, doch bei jeder Bewegung wird das Spielfeld neu ausgegebn und dabei entsteht ein unschönes flackern, da habe ich es mit system("clr") versucht. Jetzt ist die Konsole zwar schön leer, aber das flackern beim bewegen ist immernoch da 😞

    system("cls");
    
    for (int i = 0; i < 12; i++) {
        for (int j = 0; j < 12; j++) {
    	cout << Spielfeld[i][j] << " ";
        }
        cout << endl;
    }
    

    Mache ich etwas falsch?

    Danke schonmal für eine Antowrt :>



  • günstiger wäre, das jeweils gezeichnete zeichen alleine zu "löschen", und den gesamten hintergrund stehen zu lassen.
    schau dich in win32 konsolenforum um, dort findest du vor allem im faq viel zum thema.



  • Du meinst wohl eher "Flackern wegen system("clr")"? 😃

    Erstens bist du im falschen Forum (-> DOS und Win32-Konsole) und zweitens schau dir mal die Improves Konsole an. Dort gibt es dann bessere Funktionen für die exakte Platzierung innerhalb der Konsole.

    Dass Flackern unterbindest du dann am besten, wenn du nur die letzte Position löschst (Leerzeichen) und dann an der neuen Position das "x" platzierst (anstatt jedesmal die gesamte Konsole zu löschen).

    Edit: zwar etwas langsamer als "elise" dafür etwas detailierter 🙂



  • Ok, danke für die schnelle hilfe ;>



  • Ok, ich habe es versucht, aber irgendwie bekomme ich es nicht hin nur die "Figur" zu bewegen :<

    Hier mal der Code...

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    
    using namespace std;
    
    int main ()
    {
    	char Spielfeld[12][12] = { { 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O' },
    							   { 'O', 'O', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', ' ', ' ', ' ', ' ', 'O', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', 'O', ' ', ' ', ' ', ' ', 'O', ' ', 'O', ' ', 'O' },
    							   { 'O', ' ', ' ', ' ', ' ', 'O', 'O', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', ' ', ' ', ' ', ' ', 'O', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O' },
    							   { 'O', ' ', 'O', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O' }, 
    							   { 'O', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O', 'X', 'O' },
    							   { 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O' } };//Spielfeld
    	bool End = false;
    	char Move;
    	int PlayerpositionX = 10;
    	int PlayerpositionY = 10;
    	int PlayeroldpositionX = 10;
    	int PlayeroldpositionY = 10;
    
    	cout << "Steuern mit W, A, S und D!\n" << endl;
    	Sleep(2000);
    
    	do{
    		cout << endl;
    
    		Spielfeld[PlayeroldpositionX][PlayeroldpositionY] = ' ';//alte position frei machen
    		Spielfeld[PlayerpositionX][PlayerpositionY] = 'X';//neue position bestimmen
    
    		system("cls");//Bildschirm leeren
    
    		for (int i = 0; i < 12; i++) {
    			for (int j = 0; j < 12; j++) {
    				cout << Spielfeld[i][j] << " ";//Spielfeld ausgeben
    			}
    			cout << endl;
    		}
    
    		PlayeroldpositionY = PlayerpositionY;//alte Position speichern
    		PlayeroldpositionX = PlayerpositionX;
    
    		do{
    			Move = _getch();//bewegen
    
    			if (Move == 'w') {//noch oben
    				PlayerpositionX--;
    				if (Spielfeld[PlayerpositionX][PlayerpositionY] != ' ')
    					PlayerpositionX = PlayeroldpositionX;}
    			else if (Move == 'a') {//nach links
    				PlayerpositionY--;
    				if (Spielfeld[PlayerpositionX][PlayerpositionY] != ' ')
    					PlayerpositionY = PlayeroldpositionY;}
    			else if (Move == 's') {//nach unten
    				PlayerpositionX++;
    				if (Spielfeld[PlayerpositionX][PlayerpositionY] != ' ')
    					PlayerpositionX = PlayeroldpositionX;}
    			else if (Move == 'd') {//nach rechts
    				PlayerpositionY++;
    				if (Spielfeld[PlayerpositionX][PlayerpositionY] != ' ')
    					PlayerpositionY = PlayeroldpositionY;}
    			else {}
    		}while (Spielfeld[PlayerpositionX][PlayerpositionY] != ' ');//neue Position nur auf Leerzeichen
    
    	}while (End != true);
    
    	return 0;
    }
    

    Könnte einer von euch bitte erklären wie es geht? (Ich bin nicht der beste Programmierer >.<)

    Danke schonmal im voraus :>


Anmelden zum Antworten