Problem mit Schleife

Punktkomma

Grünschnabel
Hallo liebe Community,

ich bin relativ neu sowohl im Forum als auch im Programmieren. Ich versuche zur Zeit Schere, Stein, Papier als Konsolen anwendung zu programmieren, was zum größtenteil bissher geklappt hat. Jetzt wollte ich nur Runden dazu einbauen und komme mit den schleifen nicht Vorran. Entweder das programm beendet sich nachdem ich den case ausgewählt habe. hier ist mein Code:
C++:
#include <iostream>

using namespace std;

int main()
{
	int iAuswahl;
	int iS1Punkte=0;
	int iS2Punkte=0;
	int iSpieler1;
	int iSpieler2;
	int iSchere=1;
	int iStein=2;
	int iPapier=3;
	int iRunden=4;
	int iZähler=0;

	cout<<"Bitte wählen Sie aus!"<<endl<<"1.Spielen"<<endl<<"2.Beenden"<<endl;
	cin>>iAuswahl;

	switch (iAuswahl)
	{
		case (1):
		{
			cout<<"Starte Spiel"<<endl;
			do
			{
				cout<<"Spieler1 ist dran"<<endl;
				cin>>iSpieler1;
				cout<<"Spieler2 ist dran"<<endl;
				cin>>iSpieler2;

				if(iSpieler1==1&&iSpieler2==2||iSpieler1==2&&iSpieler2==3||iSpieler1==3&&iSpieler2==1)
				{
					iS2Punkte++;
					cout<<"Spieler2 gewinnt"<<iS2Punkte<<" Punkte "<<endl<<iS1Punkte<<" Punkte "<<endl<<iZähler<<"Runde"<<endl;
				}
				else
				{
					iS1Punkte++;
					cout<<"Spieler1 gewinnt"<<iS2Punkte<<endl<<iS1Punkte<<" Punkte "<<endl<<iZähler<<"Runde"<<endl;
				}

				iZähler;
			} while(iRunden=iZähler);
		}
		break;

		case  (2):
		{
			cout<<"programm Ende"<<endl;
		};

	}

	system("pause");
	return 0;
}
lg Punkt
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

was genau willst du erreichen?
Immer wieder fragen, ob beendet werden soll,
oder zuerst eine Rundenanzahl eingeben?
 
Zeile 44 ist eine sinnlose Anweisung, Zeile 45 eine Zuweisung statt Vergleich.
Dann hast du eine Endlosschleife...
(wenn man jede Zeile anders einrückt kann man schon mal was übersehen.)

edit: Dann weg mit der Abfrage, den Zähler auch erhöhen und Rest steht schon oben.
 
Hallo Punktkomma

Da du sagst du bist neu beim Programmieren einige Stylingideen, die dir das Leben deutlich vereinfachen:
GoNo go
int a = 1;int a=1;
if(a == 1 && b == 2)if(a==1&&b==2)
std::cout << "foo" << std::endl;cout<<"foo"<<endl;
std::cout, std::cin, std::endl, ...using namespace std;

Viele Grüsse
Cromon
 
Nur so aus neugier warum ist using namespace std; ein no go? hat das stilistische Gründe oder hat es einfluss auf das Programm ?

lg Punkt
 
Einer der Hauptgründe, wozu Namespaces wie das standardmäßig vorhandene "std"
verwendet werden ist, Namenüberschneidungen zu verhindern.

Nur als ein Beispiel von vielen: Es gibt ein std::list
Wenn jetzt "using namespace std;" in der Datei steht
kann man eben auch einfach list schreiben.
Aber: Was, wenn man selbst schon eine Variable/Funktion list hat?
So ungewöhnlich ist der Name nicht, für eine Liste/Menge von mehreren Irgendwas.
Wenn dann einfach "list" dasteht ist immer die Frage, welches gemeint ist.
Es gibt zwar schon klare Regeln, welche wann Priorität hat, aber
a) hilft sowas nicht unbedingt beim Code-verstehen bzw. Überblick behalten
b) Wenn man gerade das falsche verwendet können Compilerfehler enstehen,
ausbessern kostet Zeit, die man sich eigentlich sparen könnte (und oft ist Zeit=Geld)
c) oder noch schlimmer: Es kann vorkommen, dass ein Codeteil mit beiden list´s
richtig kompilieren würde, nur je nach dem, welches verwendet wird, eben etwas Anderes macht.
Wenn man da dann das Falsche verwendet...viel Spaß beim ewigen Fehlersuchen.
Falls man den Fehler überhaupt bemerkt, bevor das Programm beim Lehrer/Kunden etc. ist

Wenn man genau weiß, was in einem Namespace ist, den man einbindet, kanns schon gehn.
Aber in std ist so viel Zeug, dass niemand alles auswendig kennt
-> Keiner weiß,welche Variablen/Funktionsnamen schon besetzt sind oder nicht,
wenn man einfach mit "using namespace std" alles reinhaut
(wobei man 99% sowieso nicht verwendet)

Wenn es nur um ein paar bestimmte Sachen geht kann man auch mit
"using std::cout" etc. bestimmte Teile importieren.
Oder man schreibt eben im Code jedesmal std:: dazu


Noch ein paar andere Anmerkungen von mir:
Am Ende eines "case" ist kein ; nötig (nicht falsch, nur sinnlos)

Und system("pause") ist auch ein Nogo.
Das ruft im Wesentlichen ein ganzes anderes Programm auf,
nur um eine Ausgabe zu machen und einen Tastendruck abzuwarten.
Speicher/Zeitverbrauch: Horror, vergleichen zu einem cout im eigenen Programm.
Und was, wenn es das Programm pause gar nicht gibt (das gibt es tatsächlich nicht überall)?
Usw.
 
Hallo Punktkomma

Dafür gibt es mehrere Gründe. Zum einen ermöglicht es dir immer zu sehen woraus ein Objekt oder eine Funktion ist. Zum anderen gilt genau das auch für den Compiler. Wenn du zum Beispiel den Header algorithm includierst hast du allerweltsnamen wie count, sort oder bind im globalen Namespace. Bei Funktionen führt das schnell dazu, dass falsche überladungen verwendet werden.

Viele Grüsse
Cromon
 
Alles klar, danke für die Aufklärung. Ich lese zur Zeit "C++" für Spiele-Programmierer und da wurde es auch verwendet, deshalb habe ich es einfach mit übernommen und in jedem Tutorial, das ich mir angesehen habe wurde es auch als erstes gezeigt, aber danke für den Rat ich werde es in Zukunft berücktsichtigen.

Aber ich habe noch eine Frage. Das Problem mit den Runden hatte ich Gestern noch hingekriegt zu lösen, aber wie mache ich es am besten, das ich nach den Runden wieder ins Menü komme und das Programm sich nicht beendet auch mit einer do while schleife?

lg Punkt
 

Neue Beiträge

Zurück