Else if Anweisungen + Verschachtelung incl. Verwirrung
-
Hallo,
Ich versuche mich nun seit ca. einer Woche mit C++ und besitze das Buch :
C++ für Spieleprogrammierer von Heiko Kalista.Leider komme ich bei dem aktuellen Thema nicht weiter, obwohl ich (fast) immer versuche alles selbständig zu lösen und zu erforschen.
Mein (noch nicht fertiges) Programm soll einfach mittels Else if und switch unterhalten und fragt wie bei aktuellen Multiplayer Titeln den Spielmodus, Model, Spieler, Karte usw.. ab.
Ich habe mir sogar ein Ablauf/Flussdiagramm erstellt, da ich dieses Problem seit ca. 2 Tagen nicht lösen kann.
Was es machen sollte wird nach dem Code erklärt..
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<cmath> using namespace std; inline void keep_open_window() {char ch; cin>>ch;} int main () { int Spieleranzahl; char chSpielwahl; char chKarte; char chModel; int Spielerlevel; cout << "Wie viele Spieler moechten teilnehmen ? "; cin >> Spieleranzahl; if (Spieleranzahl == 0) { cout << "Error" << endl; } else if (Spieleranzahl == 1) { cout << "Singleplayer wird gestartet....." << endl; } else { cout << "Multiplayer wird gestartet....." << endl << endl; cout << "Bitte waehlen sie einen Modus :" << endl << endl; cout << "(B)lume" << endl; cout << "(W)asser" << endl; cin >> chSpielwahl; if ((chSpielwahl == 'b') || (chSpielwahl == 'B')) { cout << "Du spielst Blume " << endl; } else if ((chSpielwahl == 'w') || (chSpielwahl == 'W')) { cout << "Du spielst Wasser" << endl; } else { cout << "Error" << endl; } } if (chSpielwahl == 'B','b','W','w') { cout << "Waeheln sie eine Karte: " << endl; cout << "(A)be, (B)be, (C)be, (D)be " << endl; cin >> chKarte; } switch (chKarte) { case ('A'): { cout << "Du spielst Abe." << endl; } break; case ('B'): { cout << "Du spielst Bbe." << endl; } break; case ('C'): { cout << "Du spielst Cbe." << endl; } break; case ('D'): { cout << "Du spielst Dbe." << endl; } break; default: { cout << "Error" << endl; } } keep_open_window (); }Woran scheitert es bzw. was sollte es tun ?
Alles bis zu Zeile 33 klappt Perfekt. (für mich)
Allerdings will ich bei Zeile 27 einen Error erzeugen, der das Programm anhält.
Klappt auch bis Zeile 27 gut, aber leider wird Zeile 58 immer ausgeführt, egal ob die Spieleranzahl 0 oder größer ist..
Außerdem kommt der Modus Abfrage (Zeile 43) nur beim Multiplayer, und nicht beim Singleplayer.Bitte um Hilfe.
Imp l.g.
-
du hast schließende und öffnende Klammern schon immer schön übereinander, da solltest du sehen, wo du bei der Einrückung verrutscht bist
(Zeile 54 und 58)
-
Könntest du mir das bitte etwas deutlicher erläutern ?
Leider verstehe ich nicht was ich daran falsch gemacht habe...
-
char chSpielwahl; //... if (chSpielwahl == 'B','b','W','w')Du meinst sicherlich:
char chSpielwahl = 0; // ... if (chSpielwahl == 'B' || chSpielwahl == 'b' || chSpielwahl == 'W' || chSpielwahl == 'w')Stichwort: "logisches Oder"
Je nachdem wie Du entwickelst versuch einmal die Compilerwarnungen einzuschalten. Dann hättest Du u.U. eine Warnung, wegen des "Kommaoperators" in dem Ausdruck bekommen.
Und noch eins: die ganzen endls sind doch eh nur Zeilenumbrüche:
cout << "Multiplayer wird gestartet....." << endl << endl; cout << "Bitte waehlen sie einen Modus :" << endl << endl; cout << "(B)lume" << endl; cout << "(W)asser" << endl;Weniger Tipparbeit, und vielleicht sogar übersichlicher:
cout << "Multiplayer wird gestartet.....\n\n" << "Bitte waehlen sie einen Modus :\n\n" << "(B)lume\n" << "(W)asser\n";Weiterhin viel Spaß!

-
Du hast in Zeile 56 deinen Else-Zweig geschlossen. Somit ist der folgende Code nicht mehr von deiner Auswertung der Spieleranzahl abhängig. Nimm am besten die Einrückungab Zeile 57 wieder raus, da dein neues If-Statement dort beginnt.
-
So, du hast quasi drei verschiedene if- Anweisungen, die du einbauen willst:
- Singleplayer/ Multiplayer
- Spielqahl: Blume/ Wasser
- Karte: a/ b/ c/ dich weiß natürlich nicht auf welchem Wissenstandard du schon bist. Ich würde das Programm in Funktionen gliedern, damit du eine bessere Übersicht über das Programm erhältst und Fehler besser nachvollziehen kannst. Hier mein Programmbeispiel:
#include <iostream>
using namespace std;
// Globalen Variabeln
int Spieleranzahl
char chSpielwahl
char chKarte// Funktionen
void spieleranzahl_ermitteln(void);
void chSpielwahl_ermitteln(void);
void chKarte_ermitteln(void);int main()
{
spieleranzahl_ermitteln();
return 0;
}// Definitionen der Funktionen
void spieleranzahl_ermitteln()
{
cout << "Wie viele Spieler wollen teilnehmen? ";
cin >> Spieleranzahl;
// mit break gelange ich direkt an das Ende der main- Funktion; du kannst aber auch mit exit(0) das Programm direkt beenden
if(Spieleranzahl <= 0)
{
cout << "ERROR";
break;
}
if(Spieleranzahl == 1)
{
cout << "Singleplayer wird gestartet...";
break;
}
if(Spieleranzahl > 1)
{
// hier wechsel ich die Funktion und gestalte somit den Code etwas übersichtlicher
chSpielwahl_ermitteln();
}
}void chSpielwahl_ermitteln()
{
cout << "Multiplayer wird gestartet....." << endl << endl;
cout << "Bitte waehlen sie einen Modus :" << endl << endl;
cout << "(B)lume" << endl;
cout << "(W)asser" << endl;
cin >> chSpielwahl;
switch(chSpielwahl)
{
case ('B'): cout << "Du spielst Blume!";
chKarte_ermitteln();
case ('W'): cout << "Du spielst Wasser!";
chKarte_ermitteln();
default: cout << "ERROR";
break;
}
}void chKarte_ermitteln()
{
cout << "Waeheln sie eine Karte: " << endl;
cout << "(A)be, (B)be, (C)be, (D)be " << endl;
cin >> chKarte;
switch(chKarte)
{
case('A'): cout << "Du hast Karte A gewaehlt!";
case('B'): cout << "Du hast Karte B gewaehlt!";
case('C'): cout << "Du hast Karte C gewaehlt!";
case('D'): cout << "Du hast Karte D gewaehlt!";
default: cout << "ERROR";
break;
}
return 0;
}[b]Flüchtigkeitsfehler werden hier zwar drin sein, weil ich es noch nicht getestet habe, aber ich hoffe ich habe dein Problem verstanden und dir eine gut verständliche Lösung gegeben.
-
amichian, könntest du bitte [cpp]-Tags verwenden?

-
So ich habe es nun endlich geschafft, nach so langen Stunden Zeit und Litern Wasser

#include<iostream> #include<string> #include<vector> #include<algorithm> #include<cmath> using namespace std; inline void keep_open_window() {char ch; cin>>ch;} int main () { int Spieleranzahl; char chSpielwahl; char chKarte; char chModel; int Spielerlevel; cout << "Wie viele Spieler moechten teilnehmen ? "; cin >> Spieleranzahl; if (Spieleranzahl == 0) { cout << "Error" << endl; } else if (Spieleranzahl == 1) { cout << "Singleplayer wird gestartet....." << endl; } else if (Spieleranzahl >=2) { cout << "Multiplayer wird gestartet....." << endl << endl; } if (Spieleranzahl >= 1) { cout << "Bitte waehlen sie einen Modus :" << endl << endl; cout << "(B)lume" << endl; cout << "(W)asser" << endl; cin >> chSpielwahl; if ((chSpielwahl == 'b') || (chSpielwahl == 'B')) { cout << "Du spielst Blume " << endl; } else if ((chSpielwahl == 'w') || (chSpielwahl == 'W')) { cout << "Du spielst Wasser" << endl; } else { cout << "Error" << endl; } if (chSpielwahl == 'B' || chSpielwahl == 'b' || chSpielwahl == 'W' || chSpielwahl == 'w') { cout << "Waeheln sie eine Karte: " << endl; cout << "(A)be, (B)be, (C)be, (D)be " << endl; cin >> chKarte; switch (chKarte) { case ('A'): { cout << "Du spielst Abe." << endl; } break; case ('B'): { cout << "Du spielst Bbe." << endl; } break; case ('C'): { cout << "Du spielst Cbe." << endl; } break; case ('D'): { cout << "Du spielst Dbe." << endl; } break; default: { cout << "Error" << endl; } } } } keep_open_window (); }Der Abend ist gerettet

@Flasher.d84
Danke für die Antwort, ich hatte am Anfang garnicht verstanden was pumuckl nun meinte
@amichian
Danke für deinen Vorschlag, den werde ich mir mal anschauen wenn ich mit Void arbeite
Und danke an alle anderen, nettes Forum, ich dachte mir antwortet sowieso keiner.