{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 deinermain()
ist, auch wenn sie den selben Namen hat, nicht die selbe wie in der FunktionspielStarten()
, denn die Parameter werden kopiert. In der FunktionspielStarten()
änderst Du also eine Kopie deiner Variable ausmain()
, die von den Änderungen nichts mitbekommt. Wahrscheinlich möchtest Du als zweiten Parameter eine Referenz aufS_PlayerInfo
übergeben. Alsovoid 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 :3Habt 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"