kleines Spiel zur Übung (mit Konsole realisiert)



  • Ich sage mal das der Ansatz ganz falsch ist.

    Mach ein Array. Dieses soll deinen Bildschirm darstellen. Dieses Array kann Werte speichern. Je nach dem Wert im Array kann es die Straße sein oder der Spieler.

    Du bewegst die Werte im Array. Und am Ende zeichnest du den Inhalt vom Array auf dem Monitor.



  • Netzwerk-Latenz schrieb:

    Ich sage mal das der Ansatz ganz falsch ist.

    Mach ein Array. Dieses soll deinen Bildschirm darstellen. Dieses Array kann Werte speichern. Je nach dem Wert im Array kann es die Straße sein oder der Spieler.

    Du bewegst die Werte im Array. Und am Ende zeichnest du den Inhalt vom Array auf dem Monitor.

    ok...

    Meinst du so ein mehrdimensionales Array?

    Wie bewege ich denn am besten das Array?



  • Mehrdimensional wäre schon nicht schlecht bei einem mehrdimensionalen Bildschirm 😉

    Du kannst im Prinzip eine Queue (Schlange) für Deine Strassendarstellung benutzen.
    Du füllst am Anfang das Array mit dem ersten "Bild" der Strasse. Die Bewegung erreichst Du, indem Du alle Zeilen des Arrays eine Zeile nach unten verschiebst und eine neue oben einfügst.

    Nochmal zum Thema Mehrdimensionalität: Vielleicht ist es auch clever statt einem Array[x][y] ein Array[x*y], also doch eindimensional, zu benutzen. Das macht imho die dynamische Speicherverwaltung einfacher. Dann greifst Du ein Element des Arrays statt mit Array[x][y] mit Array[y*xmax+x] heraus.



  • So ist das total scheisse. Machs doch wie das beim Contest.

    Bye, TGGC (Ein Jahr Helden)



  • #include <iostream>
    #include <string>
    
    int iSpielfeld[10][10];
    
    int main()
    {
    	int i,j;
    
    	// Spielfeld mit Nullen füllen
    	for(i=0; i<10; i++)
    		for(j=0; j<10; j++)
    			iSpielfeld[i][j]=0;
    
    	// Spieler positionieren
    	int x=4;
    	int y=4;
    	iSpielfeld[x][y]=1;
    
    	// Spielfeld zeichnen
    	for(i=0; i<10; i++)
    	{
    		for(j=0; j<10; j++)
    		{
    			if(iSpielfeld[i][j]==1)
    				// Der Spieler
    				std::cout<<"*";
    			else
    				// Ein freies Feld
    				std::cout<<" ";
    		}
    		std::cout<<"\n";
    	}
    
    	return 0;
    }
    

    Ich habe dir mal ein Beispiel vorbereitet.

    An Position x 4, y 4 wird der Spieler gezeichnet. Es ist auch möglich für Wände ect. einen anderen Wert zu nehmen z.B. eine 2 für Wände. So könntest du auch die Kollisionsabfrage lösen. Du könntest abfragen:

    if(iSpielfeld[PlayerX][PlayerY]==2) //Da ist eine Wand
    


  • Netzwerk-Latenz schrieb:

    Ich sage mal das der Ansatz ganz falsch ist.

    Mach ein Array. Dieses soll deinen Bildschirm darstellen. Dieses Array kann Werte speichern. Je nach dem Wert im Array kann es die Straße sein oder der Spieler.

    Du bewegst die Werte im Array. Und am Ende zeichnest du den Inhalt vom Array auf dem Monitor.

    Sag ich ja 😃 framebuffer..
    Das flackert aber dann mächtig..

    Ich würds mal mit Assembler probieren.. oder die WinAPI-Konsolenbefehle..



  • Arbeite doch mit sowas:

    #include <windows.h>
    
    ...
    
    void gotoxy(int x, int y)
    
    {
    
        COORD coordScreen;
    
        coordScreen.X = x;
    
        coordScreen.Y = y;
    
        SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coordScreen);
    
    }
    

    Dann musst du immer nur das entsprechende Zeichen neu schreiben und nich das ganze bild.



  • mal davon abgesehen das es extrem flackern wird 😃 ...

    wenn du ein char array hättest bräuchtest du das if in der schleife nicht mehr sondern könntest einfach das ganze array ausgeben lassen.. dann würde eventuell dadurch das das schneller gezeichnet werden könnte minimal ein bisschen weniger flackern auftreten 😃 wie willst du das eigentlich mit der steuerung machen? immer abwechselnd bild anzeigen steuerungs input oder mit threads?



  • Ich erinnere mich gerade an "good-old-Basic-Zeiten". Da hatte ich dieses Flackern auch, konnte es aber beheben, indem ich, statt alles neu zu zeichnen einen PRINT Befehl ohne Inhalt (also \n) ausgeführt habe. Dadurch ist alles eine Zeile hochgerutscht, und das ohne zu flackern.
    Aber gemäss dem Fall, das das funktioniert, fährt man dann natürlich nach unten....



  • ja aber das auto würde doch mit rutschen bzw. würde dann doch ganz oft angezeigt O_o also wenn ich das richtig verstehe das du nicht immer den ganzen screen neu zeichnen möchtest...



  • Jup, absolut richtig. Hatte ich nicht dran gedacht. Man könnte jedoch das Auto vorm \n löschen und danach wieder zeichnen (oder einfach wegkommen von der Konsolenanwendung 😉 )


Anmelden zum Antworten