C++ Erstes Spiel mit Zeitangaben



  • Hey Leute 😃

    Ich habe mir so über den Tag überlegt wie man die Zeit in Spielen anwenden kann sodass sie von 0 anfängt.
    Dann habe ich mir überlegt:

    Anfangszeit = time(0);
    
    while (true)
    {
        Zeit = time(0) - Anfangszeit
        cout << Zeit;
    }
    

    Mit dieser Überlegung habe ich dann eine Nachmache von Cookieclicker programmiert (in der Konsole).

    Da ich aber schon von meinen Codes gehört habe:
    "Der Code ist generell schrecklich unübersichtlich und völlig unnötig lang."

    Will ich das ihr mir bitte helft und es bewertet (ob es viel zu kompliziert gemacht ist und ob es Übersichtlich ist).

    PS: Kann mir jemand sagen warum immer die Konsole in einer Schleife flackert wenn man

    System("CLS");
    

    benutzt? Kann man das irgendwie mit einem Code abstellen? 😃

    Hier der Quellcode für das C++ -Spiel "Goldclicker":

    #include <iostream>
    #include <conio.h>
    #include <Windows.h>
    #include <ctime>
    
    using namespace std;
    
    int main ()
    {
    	int fsZaehler = 0;
    
    	int Key = 0;
    
    	unsigned int cMulti = 1;
    
    	int startTime = 0;
    	int secondstartTime = 0;
    	unsigned int Gold = 0;
    	unsigned int tGold = 0;
    	int sGold = 0;
    
    	unsigned int GPS = 0;     // GOLD PER SECOND
    
    	int Shoplevel[2] = {0, 0};                                // SHOP initialisierung
    
    	int Cost[2] = {500, 10};                         // COSTS initialisierung
    
    	startTime = time(0);
    
    	srand(time(0));
    
    	while (true)
    	{
    		tGold += GPS*(time(0) - startTime - secondstartTime);                  // GOLD PER SECOND TIMER
    		secondstartTime = time(0) - startTime;                                 // secondstartTime = time don't go over 1 = 0 or 1
    		Gold = sGold;                                                          // output Gold is saved Gold
    		Gold += tGold;                                                         // Gold(sGold) + the gain Gold per second * Gold per Second on the "GOLD PER SECOND TIMER"
    
    		cout << "+-+GOLDCLICKER 1.0+-+\n";     // TITLE
    		cout << "-Moorky Dragonstrike-\n\n";
    
            cout << "\nGold per second: " << GPS << "\n";     // GOLD PER SECOND
    		cout << "\nGold: " << Gold;               // GOLD
    
    		cout << "\n\n\n";
    		cout << "PRESS [x] FOR MORE GOLD";
    		cout << "\n\n\n\n";
    
    		// SHOP
    		//
    		cout << "+-SHOP-+\n\n";
    		cout << "[1] Clickmultiplier, Level: " << Shoplevel[0] << ", cMulti: x2, Gold: -" << Cost[0] << "\n\n";
    		cout << "[2] Autoclicker, Level: " << Shoplevel[1] << ", GPS: +1, Gold: -" << Cost[1] << "\n\n";
    		cout << "[ESC] EXIT" << "\n\n";
    
    		// KEY ABFRAGE
    		//
    		if (kbhit()) { Key = getch(); }
    
    		if (Key == 49 && Gold >= Cost[0]) 
    		{
    			sGold -= Cost[0];
    			cMulti *= 2;
    			Shoplevel[0] += 1;
    			Cost[0] = Cost[0]*1.55;
    		}
    
    		else if (Key == 50 && Gold >= Cost[1]) 
    		{
    			sGold -= Cost[1];
    			GPS += 1;
    			Shoplevel[1] += 1;
    			Cost[1] = Cost[1]*1.45;
    		}
    
    		else if (Key == 120 ) 
    		{
    			sGold += 1*cMulti;
    		}
    
    		else if (Key == 27) { return 0; }
    
            Key = 0;
    
    		system("CLS");
    	}
    
    	cout << "\n\n";
    	system("PAUSE");
    	return 0;
    }
    

    MFG Moorky! 🙂



  • Wie wärs denn, wenn du einfach eine genügend große Anzahl newlines ausgibst?
    Dann würde ich noch system("PAUSE") durch getchar() ersetzen, um keine system()-Befehle mehr zu haben (die massig unnötigen Code ausführen).


  • Mod

    philipp2100 schrieb:

    Wie wärs denn, wenn du einfach eine genügend große Anzahl newlines ausgibst?
    Dann würde ich noch system("PAUSE") durch getchar() ersetzen, um keine system()-Befehle mehr zu haben (die massig unnötigen Code ausführen).

    Das löst das Problem nicht mit dem Flackern. Da braucht's eine richtige Konsolenbibliothek, wenn man "Grafik" in der Konsole machen will. Einfache Textausgabe ist darauf einfach nicht ausgelegt.

    Wegen dem CLS nehme ich mal eine Windowskonsole an. Ich verschiebe es mal nach Winapi, da das alte Konsolenforum geschlossen wurde, aber im Winapi-Forum sind die Leute, die sich mit der Windowskonsole auskennen.

    Zum Thema Übersicht:
    Definiere in C++ Variablen so lokal wie möglich. Du hast alles am Funktionsanfang, furchtbar unübersichtlich. Ein paar scheinen unbenutzt, andere doppelt gemoppelt, du hast vermutlich selber die Übersicht verloren, was du brauchst und wozu was da ist. Wenn du etwas weiter bist mit C++, dann bietet es sich an, das ganze auch Objektorientiert aufzuziehen. Allein schon das Zusammenfassen von zusammen gehörenden Daten in Klassen/Structs sollte einiges an Übersicht bringen, selbst wenn du dann nicht objektorientiert programmierst.

    Anstatt Key == 50 schreib doch Key == '2' . Das ist viel verständlicher für den Leser und viel robuster (auch wenn praktisch nicht zu erwarten ist, dass du jemals einen Rechner mit '2' != 50 siehst).

    Ein paar Funktionen mit aussagekräftigen Namen würden das Programm viel übersichtlicher machen:

    if (bedingung)
      aktion();
    if (andere bedingung)
      andere_aktion();
    

    anstatt so wie jetzt

    if (bedingung)
    {
      sehr;
      viel;
      code;
      bei;
      dem;
    }
    if (andere bedingung)
    {
      man;
      ganz;
      vergisst;
      worum;
      es;
      überhaupt;
      geht;
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Zeug in die Konsole malen
    
             if (kbhit()) { Key = getch(); } 
    
             if (Key == 49 && ...) 
             {
                ...
             }    
             else if (Key == 50 && ...) 
             { 
                ...
             }    
             else if (Key == 120) 
             { 
                ...
             }    
             else if (Key == 27) { return 0; } 
    
             Key = 0; 
    
             Konsole löschen
    

    Das ist von der Reihenfolge für mich ein totales WTF.
    =>

    Konsole löschen
             Zeug in die Konsole malen
    
             if (kbhit())
             {
                 int Key = getch();
    
                 if (Key == 49 && ...) 
                 {
                    ...
                 }    
                 else if (Key == 50 && ...) 
                 { 
                    ...
                 }    
                 else if (Key == 120) 
                 { 
                    ...
                 }    
                 else if (Key == 27) { return 0; } 
             }
    


  • SeppJ schrieb:

    Ein paar Funktionen mit aussagekräftigen Namen würden das Programm viel übersichtlicher machen:

    Naja, für 4 Zeilen (auch für 10, 20, 30) finde ich es so übersichtlicher als eine neue Funktion zu machen. Gerade wenn es mal mehr als 5 Zeilen werden kann man mit einem Kommentar ganz am Anfang des Blockes die Übersichtlichkeit erhalten.
    Ist wohl Geschmackssache..

    hustbaer schrieb:

    Das ist von der Reihenfolge für mich ein totales WTF.

    In seinem Code wird halt immer wieder die Aktion von dem Key ausgeführt, der als letztes gedrückt wurde. Kann doch sein, dass das so gewünscht ist. Auch wenn ich mich persönlich wundere, dass kein sleep() o.Ä. dazwischen ist, der ne kleine Pause reinmacht.



  • philipp2100 schrieb:

    SeppJ schrieb:

    Ein paar Funktionen mit aussagekräftigen Namen würden das Programm viel übersichtlicher machen:

    Naja, für 4 Zeilen (auch für 10, 20, 30) finde ich es so übersichtlicher als eine neue Funktion zu machen. Gerade wenn es mal mehr als 5 Zeilen werden kann man mit einem Kommentar ganz am Anfang des Blockes die Übersichtlichkeit erhalten.
    Ist wohl Geschmackssache..

    Als Geschmackssache kann ich das nicht durchgehen lassen.
    Das ist einfach nur schlecht.

    Und gerade wenn es mal mehr als 5 Zeilen sind gehört es in eine Funktion mit einem aussagekräftigen Namen verpackt.

    hustbaer schrieb:

    Das ist von der Reihenfolge für mich ein totales WTF.

    In seinem Code wird halt immer wieder die Aktion von dem Key ausgeführt, der als letztes gedrückt wurde.

    Nein, wird sie eben gerade nicht.
    Mein Code macht im Endeffekt genau das selbe wie seiner.

    Ich dachte auch erst dass die Aktion wiederholt wird - und genau das ist auch das Problem daran. Dass hier ein triviales Problem auf eine unübliche und unnötig unübersichtliche Art und Weise gelöst wird. Dass man 2x (oder 3x oder 4x) hingucken muss um zu verstehen was abgeht.

    Guck dir den Code nochmal an. Wenn du die Stelle gefunden hast die ich meine (die übrigens auch in meiner "Kurzfassung" seines Codes vorhanden ist) weisst du vermutlich auch warum ich WTF geschrieben habe.

    BTW: @Moorky Dragonstrike: Nochwas: Flow-Control gehört sichtbar gemacht.

    if (condition) { action(); } // BÖSE
    
    if (condition)
        action(); // OK
    


  • Dein Fenster flackert, weil Du immer das ganze Fenster löschst und alles (auch das, was immer an derselben Stelle unverändert ausgegeben wird) immer wieder neuzeichnest.



  • Belli schrieb:

    Dein Fenster flackert, weil Du immer das ganze Fenster löschst und alles (auch das, was immer an derselben Stelle unverändert ausgegeben wird) immer wieder neuzeichnest.

    Wie man den Cursor wieder nach oben (oder sonstwohin) bekommt, sowie das Löschen
    des Screens hatten wir schon mehrfach diskutiert, zB. hier:

    Console Flackert wegen System("cls"), Alternative?
    http://www.c-plusplus.net/forum/320735


Anmelden zum Antworten