Mehrdimensionales Array (Updaten?)



  • Hallo erstmal

    Da ich noch ein C++ Neuling bin hoffe ich das das hier 1. die richtige Sektion ist und 2. ich nicht damit nerve;)

    Nun zu meiner Frage.

    Habe wie gehabt ein Mehrdimensionales Array erstellt, welches beispielsweise ein Schachbrett darstellen soll. Dargestellt wird dies lediglich durch Punkte.

    char Spielfeld[10][10];
        int x,y;
            for(x=0;x<10;x++)
            {
                             for(y=0;y<10;y++)
                             {
    
                                              Spielfeld[x][y]='.';
                                              cout<<" "<<Spielfeld[x][y];
    
                             }
                         cout<<    endl;
            }
    

    Klappt auch so alles super und wird problemlos dargestellt.
    Meine Frage wäre nun ob es eine Funktion? oder dergleichen gibt welche es mir ermöglicht das Spielfeld quasi zu aktualisieren und beispielsweise an die Stelle
    (3/4) ein X setzt. Die Betonung liegt hier bei aktualisieren da ich nicht möchte das das Spielfeld neu gezeichnet wird.
    Bedanke mich schon mal im Vorraus für Antworten.

    MFG



  • Hallo,
    du musst den Bildschirm ja irgendwie löschen oder überschreiben...

    Noch ein Tipp: Versuch bitte in Zukunft deinen Code besser zu formatieren 🙂

    Ich habe für dich mal ein kleines Beispiel gemacht:

    #include <iostream>
    #include <windows.h>
    
    const int X_SIZE = 10; // So kannst du dein Spielfeld mit nur dieser Änderung vergrößern/verkleinern
    const int Y_SIZE = 10; // dto.
    
    char Spielfeld[X_SIZE][Y_SIZE];
    
    void initalisiereSpielfeld();
    void zeichneSpielfeld();
    bool setzen(int x, int y, char c);
    void clearScreen();
    
    int main() {
    	bool gameRunning = true;
    	initalisiereSpielfeld();
    	while (gameRunning) {
    		std::cout << "Ueberschrift etc.\n\n";
    
    		zeichneSpielfeld();
    
    		int x, y;
    		do {
    			std::cout << "\nWelche Position moechtest du setzen?\n";
    			std::cout << "X-Position = ";
    			std::cin >> x;
    			std::cout << "Y-Position = ";
    			std::cin >> y;
    			std::cout << "\n";
    		} while (!setzen(x, y, 'X')); // Bis eine gültige Eingabe gemacht wurde
    
    		char c;
    		std::cout << "\nWeiterspielen? (J)a, (N)ein\t:\t";
    		std::cin >> c;
    		if (c != 'j' && c != 'J') {
    			gameRunning = false;
    		}
    		clearScreen();
    	}
    	return 0;
    }
    
    void initalisiereSpielfeld() {
    	for(int x = 0; x < X_SIZE; ++x) {
    		for(int y = 0; y < Y_SIZE; y++) {
    			Spielfeld[x][y] = '.';
    		}
    	}
    }
    
    void zeichneSpielfeld() {
    	for(int x = 0; x < X_SIZE; ++x) {
    		for(int y = 0; y < Y_SIZE; y++) {
    			std::cout << " " << Spielfeld[x][y];
    		}
    		std::cout << std::endl;
    	}
    }
    
    bool setzen(int x, int y, char c) {
    	if (x < X_SIZE && x >= 0 && y >= 0 && y < Y_SIZE) { // Überprüfen, ob die Koordinaten auch im Spielfeld liegen
    		Spielfeld[x][y] = c;
    		return true;
    	}
    	return false;
    }
    
    void clearScreen() // Diese Funktion musst du nicht verstehen. Nimm sie einfach so hin!
    {
    	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	COORD coord = {0, 0};
    	DWORD count;
    
    	CONSOLE_SCREEN_BUFFER_INFO csbi;
    	GetConsoleScreenBufferInfo(hStdOut, &csbi);
    	FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
    
    	SetConsoleCursorPosition(hStdOut, coord);
    }
    

    Das ganze ist schon relativ vollständig. Also mach was raus! Viel Erfolg dabei!

    Gruß,
    Patrick



  • Danke für deine Hilfe. Ich denke das ich die function clearScreen() auf jeden Fall von ihrer Logik her verstehe. Dein Quelltext hat mir sehr geholfen.



  • ein sehr interesanter punkt wäre für dich auch die gotoxy() funktion die in
    manchen conio.h mitgeliefert wird, da diese headerdatei aber bei den meisten
    compeiler nur noch verkürzt mitgeliefert wird kann man sich diese funktion auch
    selber schreiben:

    void gotoxy(short x, short y)
    {
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(hCon, pos);
    }
    

    dies setzt den courser an die entsprechende xy poition um dann dieses feld zu
    überschreiben
    es kann bzw es kommt nämlich ziehmlich sicher zu einem flimmern wenn du den
    bildschirm immer neu beschreibst also löscht und dann neu zeichnen läst
    natürlich kannst du auch die ic verwenden die die gotoxy auch anbietet aber da
    ich selber mit der ic probleme hab würd ich die oben genannte funktion
    übernehmen



  • Das mit dem Flimmern ist mir gerade schon aufgefallen. Ist ja auch klar wenn er alle 0,05 Sekunden löscht und wieder neu schreibt. Danke werde das mal versuchen. 👍



  • du kannst auch mit unterschiedlichen Screenbuffern arbeiten aber dies nicht ganz so leicht ist und da du noch sehr unerfahren bist mit dem programieren ist es mit der gotoxy funktion einfacher hab mit dieser funktion schon erfolge erzielt kannst ja die xy koordinaden aus deinem array lessen



  • Ganz verstehe ich die Funktion von GAMES noch nicht. Wenn ich beispielsweise bei nem Snake Game die Schlange nach rechts laufen lassen will muss ich meiner Meinung nach den Bildschirm imemr neu zeichnen lassen da die goto Funktion ja "nur" einen Wert im Array überschreibt.


Anmelden zum Antworten