{GELÖST} [Anfänger] Variablen werden auf 0 zurückgesetzt



  • Hallo und ein Dankeschön erstmal an alle die, die sich die Mühe machen mein Problemtext zu lesen (:

    Ich bin noch ziemlich neu was das programmieren angeht. Kommen wir direkt zu meinem Problem:
    Ich habe mir vorgenommen ein Zahlenrate-Spiel zu programmieren in dem ich mein gelerntes Wissen bündeln kann. Nun möchte ich das die Anzahl an Versuchen die der Spieler benötigt und auch seine erreichten Punkte an eine Struktur übergeben werden(1. Bild u. 2. Bild) und diese über das Menü dann unter dem Menüpunkt "Spielerinfos" ausgegeben werden können. Bis zum zuweisen funktioniert das alles auch einwandfrei, wenn das Programm jetzt allerdings wieder zur Menü-Schleife zurückspringt, werden die Variablen 'player1.versuche' und 'player1.punkte' wieder auf 0 zurückgesetzt(3. Bild). So viel zum Problem. Hier noch die Bilder:

    Die Struktur:

    //STRUKTUREN
    //__________
    
    //Struktur für Spielerinfo
    struct S_PlayerInfo
    {
    	string name;
    	int grad;
    	int punkte;
    	int versuche;	
    };
    //STRUKTUREN ENDE
    

    Dann noch die Spieleschleife mit der Zuweisung für die player1 Variablen:

     //Funktion für die Spielschleife
    void spielStarten(int zufallsZahl, S_PlayerInfo player1)
    {
    	//Nötige Variablen erzeugen
    	int spielerZahl;
    	
    	//Je nach Schwierigkeitsgrad andere Ausgabe
    	if(player1.grad == 1)
    	{
    		cout<<"Finde die Zahl zwischen 1 und 50:"<<endl;
    	}
    	else if(player1.grad == 2)
    	{
    		cout<<"Finde die Zahl zwischen 1 und 100:"<<endl;
    	}
    	else if(player1.grad == 3)
    	{
    		cout<<"Finde die Zahl zwischen 1 und 150:"<<endl;
    	}
    	else
    	{
    		cout<<"Fehler in Funktion: spielStarten()!"<<endl;
    		cout<<"Der Schwierigkeitsgrad hat einen ungueltigen Wert."<<endl;
    	}
    	
    	//SPIELSCHLEIFE
    	do
    	{
    		//Spieler gibt Zahl ein
    		cin>>spielerZahl;
    		player1.versuche++;
    		
    		//Überprüfe ob die Zufallszahl größer, kleiner oder gleich ist
    		if(spielerZahl == zufallsZahl)
    		{
    			cout<<"*********"<<endl;
    			cout<<"GEWONNEN!"<<endl;
    			cout<<"*********"<<endl;
    			
    			//Punkte errechnen und zuweisen
    			player1.punkte = punkteRechner(player1.versuche, player1.grad);
    			
    			//Punkte ausgeben
    			cout<<"Du hast "<<player1.punkte<<" Punkte erreicht!"<<endl;
    		}
    		else if(spielerZahl < zufallsZahl)
    		{
    			cout<<"Hoeher..."<<endl;
    		}
    		else if(spielerZahl > zufallsZahl)
    		{
    			cout<<"Niedriger..."<<endl;
    		}
    		else
    		{
    			cout<<"\nDa ist was schief gelaufen...\n";
    		}
    		
    	}while(spielerZahl != zufallsZahl);
    	//SPIELSCHLEIFE ENDE
    	
    	
    }
    

    Und zu guter letzt, wo die spielStarten-Funktion aufgerufen wird und wo auch die Variablen auf 0 zurückgesetzt werden:

    //MAIN
     //____
    int main()
    {
    	int auswahl;
    	S_PlayerInfo player1;
    	player1.name = "Du hast noch keine Runde gespielt";
    	player1.grad = 0;
    	player1.punkte = 0;
    	player1.versuche = 0;
    	
    	//Zufallsseed initialisieren
    	srand(time(NULL));
    		
    	//Menü erzeugen
    	do
    	{
    		cout<<"WILLKOMMEN BEI ZAHLENRATEN 2"<<endl;
    		cout<<"____________________________"<<endl;
    		cout<<"1 - Einzelspiel"<<endl;
    		cout<<"2 - Mehrspieler"<<endl;
    		cout<<"3 - Spielerinfos"<<endl;
    		cout<<"4 - Beenden"<<endl;
    		cout<<"____________________________"<<endl;
    		cin>>auswahl;
    		
    		//Switchverzweigung für die Menüauswahl
    		switch(auswahl)
    		{
    			//Einzelspieler
    			case 1:
    			
    				//Schwierigkeitsgrad auswählen
    				cout<<"EINZELSPIELER"<<endl;
    				cout<<"_____________\n"<<endl;
    				cout<<"Bitte gib einen Namen ein:"<<endl;
    				cin>>player1.name;
    				cout<<"___________________________"<<endl;
    				cout<<"Schwierigkeitsgrad waehlen:"<<endl;
    				cout<<"[1]Leicht\n[2]Mittelschwer\n[3]Schwer"<<endl;
    				cin>>player1.grad;
    				
    				//Schweirigkeitsgrad nach gültigkeit überprüfen
    				if(player1.grad > 0 && player1.grad < 4)
    				{
    				
    					//Zufallszahl je nach Schwierigkeitsgrad zuweisen
    					int zufallsZahl;
    					if(player1.grad == 1)
    					{zufallsZahl = (rand()%50)+1;}
    					if(player1.grad == 2)
    					{zufallsZahl = (rand()%100)+1;}
    					if(player1.grad == 3)
    					{zufallsZahl = (rand()%150)+1;}
    				
    					//Spiel starten
    					spielStarten(zufallsZahl, player1);
    				}
    				else
    				{
    					cout<<"\nFehler in: Switch(auswahl) -> case 1!";
    					cout<<"\nUngueltiger Schwierigkeitsgrad.\n\n"<<endl;
    				}
    				
    				break;
    				
    			//Mehrspieler
    			case 2:
    				cout<<"Der Mehrspielermodus ist noch nicht implementiert.";
    				break;
    			
    			//Spielerinfos
    			case 3:
    				spielerInfo(player1);
    				break;
    				
    			//Beenden
    			case 4:
    				cout<<"_______________"<<endl;
    				cout<<"\nSPIEL BEENDET"<<endl;
    				cout<<"_______________"<<endl;
    				break;
    				
    			default:
    				cout<<"\nUngueltige Eingabe!\n\n";
    		}
    		
    	}while(auswahl != 4);
    	
    	
    	return 0;
    }
    

    Kleine Anmerkung:
    Die spielerInfo()-Funktion gibt lediglich über cout die ganzen Variablen der Struktur aus.

    Nun habe ich schon folgendes probiert und bin auf folgende Lösung gekommen:

    • Ich habe Zwischenvariablen deklariert und diesen zuerst die Punkte und Versuche zugewiesen(hat nicht geklappt)

    • Ich habe 2 globale Variablen erstellt und diese konnten die Werte halten

    Ich habe mir die player1 Variablen so ziemlich in jedem Programmablauf ausgeben lassen und sie waren immer richtig bis zu dem Punkt wo die Spielschleifen-Funktion endet und dann wieder das Menue aufgerufen wird. Und ich finde die Lösung mit den globalen Variablen sehr unschön, irgendwas scheine ich nicht ganz verstanden und gemerkt zu haben, denn irgendwas setzt meine Variablen auf 0 zurück...

    Ich entschuldige mich schon mal bei allen denen das zu viel Code ist aber ich wusste echt nicht wie ich es übersichtlicher hätte halten können ^^

    Danke schon mal im voraus,
    LG Meyvel



  • Die Variable player1 aus deiner main() ist, auch wenn sie den selben Namen hat, nicht die selbe wie in der Funktion spielStarten(), denn die Parameter werden kopiert. In der Funktion spielStarten() änderst Du also eine Kopie deiner Variable aus main(), die von den Änderungen nichts mitbekommt. Wahrscheinlich möchtest Du als zweiten Parameter eine Referenz auf S_PlayerInfo übergeben. Also

    void spielStarten(int zufallsZahl, S_PlayerInfo &player1);
    


  • Du übergibst eine Kopie der Daten an die Funktion spielStarten - benutze eine Referenz (&):

    void spielStarten(int zufallsZahl, S_PlayerInfo & player1)
    

    PS: player wäre ein besserer Parametername (also ohne eine Zahl dahinter).



  • Ach, Zeiger und Referenzen ja... genau die Themen die ich noch nicht bearbeitet habe 😃
    Ich sehe den Thread jetzt mal als gelöst an, auch wenn ich die Lösung noch nicht umzusetzen weiss, aber ich danke euch vielmals :3

    Habt noch einen schönen Tag und genießt das Wetter,
    LG Meyver;



  • Eine Lösung ohne Referenz oder Zeiger wäre, die Funktion die geänderte Variable zurückgeben zu lassen und das Ergebnis an der Aufrufstelle an die entprechende Variable zuzuweisen.



  • Ja das hatte ich mir auch schon gedacht aber ich möchte ja das die Anzahl an Versuchen und die Punktzahl wenn dann zurückgegeben wird. Und mir ist zumindest keine Möglichkeit bekannt 2 Werte zurückgeben zu können ^^



  • @meyvel sagte in {GELÖST} [Anfänger] Variablen werden auf 0 zurückgesetzt:

    ich möchte ja das die Anzahl an Versuchen und die Punktzahl wenn dann zurückgegeben wird.

    Beides steckt ja in deiner struct S_PlayerInfo - also gib player1 zurück, das ist nur eine Variable.



  • Hmmm, dass klingt ziemlich einleuchtend! Habe das gerade mal ausprobiert aber ich weiss nicht welchen Rückgabetyp die Funktion dann haben muss, denn folgendes funktioniert nicht:

    S_PlayerInfo spielStarten()



  • S_PlayerInfo spielStarten(int zufallsZahl, S_PlayerInfo player1)
    {
        // ...
    
        return player1;
    }
    

    ... ansonsten spezifiziere "funktioniert nicht".



  • Ok hat doch funktioniert, ich hatte nur vergessen S_PlayerInfo auch vor meinen Funktionsprototypen zu setzen, da stand noch void... 😃

    Jedenfalls ist das Hauptproblem dadurch leider nicht gelöst, die Spielerinfos zeigen immer noch

    • Versuche: 0
    • Gesamtpunkte: 0


  • Code? (am besten vollständig)



  • Hat sich schon erledigt, ich war nur zu hastig im Antworten tut mir leid ^^

    Ich hatte nur vergessen die Rückgabewerte auch wieder an den player zu übergeben. Schande auf mein Haupt.

     player = spielStarten(zufallsZahl, player);
    

    Ich danke dir vielmals lieber Schwertfisch. Hab noch ein schönes restliches Wochenende (:



  • @meyvel sagte in {GELÖST} [Anfänger] Variablen werden auf 0 zurückgesetzt:

    Ja das hatte ich mir auch schon gedacht aber ich möchte ja das die Anzahl an Versuchen und die Punktzahl wenn dann zurückgegeben wird. Und mir ist zumindest keine Möglichkeit bekannt 2 Werte zurückgeben zu können ^^

    Falls du doch mal zwei Werte zurück geben willst und gerade keine Struktur zur Hand hast, deren Rückgabe Sinn machen würde:

    std::pair<unsigned,double> meineFunktionMitRueckgabe()
    {
        return std::make_pair( 42, 273.15 );
    }
    
    
    // Aufruf
    auto RueckGabeDerFunktion = meineFunktionMitRueckgabe();
    

    Nur das du es mal gesehen hast. Wenn du mehr als zwei zurückgeben willst, wäre das "std::tuple"


Log in to reply