[C++] Finde den Fehler nicht

09/23/2010 17:40 .Infinite#1
Ich habe, weil es eine Übungsaufgabenstellung in einem Tutorial war, dieses Münzenspiel programmiert. Es werden halt immer abwechselnd Münzen gezogen und wer die letzte zieht hat gewonnen.

Nur leider geht es bei mir irgendwie auf einmal nicht weiter, nachdem ich eingegeben hab, mit wie vielen Münzen gespielt werden soll.

Das ganze is passiert, nachdem ich die Funktion, wo der Spieler zieht ausgelagert hab, um einfacher zu überprüfen, ob die Zahl, die der Spieler eingegeben hat zu hoch oder zu tief ist...

Hier dann mal den Source:
PHP Code:
#include "StdAfx.h"
#include <iostream>
#include <Windows.h>
using namespace std;

int computer(int muenzen_anzahl)
{
    
int muenzen_gezogen=muenzen_anzahl%4;
    if (
muenzen_anzahl%4==0)
        
muenzen_gezogen=1;
    return 
muenzen_gezogen;
};

int spieler(int muenzen_anzahlint muenzen_gezogen_computer)
{
    
int muenzen_gezogen;
    
cout << "Der Computer hat " << muenzen_gezogen_computer << " gezogen. Es liegen also noch " << muenzen_anzahl << " Muenzen auf dem Tisch. Wie viele moechten sie ziehen?" << endl;
    
cin >> muenzen_gezogen;
    return 
muenzen_gezogen;
};

void main()
{
    
int muenzen_anzahl;
    
int muenzen_gezogen_spieler;
    
int muenzen_gezogen_computer;

    
cout << "Mit wie vielen Muenzen soll gespielt werden?" << endl;
    
cin >> muenzen_anzahl;

    while (
true)
    {
        
muenzen_gezogen_computer=computer(muenzen_anzahl);
        
muenzen_anzahl-=muenzen_gezogen_computer;
        if (
muenzen_anzahl==0)
            
cout << "\n\n Der Computer hat gewonnen"<< endl;
            
Sleep(3000);
            return;

        
muenzen_gezogen_spieler=spieler(muenzen_anzahlmuenzen_gezogen_computer);
        if (
muenzen_gezogen_spieler <=&& muenzen_gezogen_spieler >= 1)
            
muenzen_anzahl-=muenzen_gezogen_spieler;
        else
            
cout << "Sie dürfen nur 1,2 oder 3 Münzen ziehen!" << endl;
            
muenzen_gezogen_spieler=spieler(muenzen_anzahlmuenzen_gezogen_computer);

        if (
muenzen_anzahl==0)
            
cout << "\n\n Der Spieler hat gewonnen"<< endl;
            
Sleep(3000);
            return;
    };
}; 

Vielen Dank im Vorraus,
mfg abba232
09/23/2010 19:04 nkkk#2
hab mir den code nicht wilkich angeschaut, aber hast du schonmal versucht mit dem debugger zu gucken was dein code nach der eingabe macht? normalerweise dürfete man den fehler so finden.
09/23/2010 19:09 .Infinite#3
Hab ich schon mehrmals. Wenn ich in Einzelschritten durchgehe, springt er immer von der Eingabe der Anzahl der Münzen direkt zu "Computer hat gewonnen", obwohl die eingegebene Zahl ja garnicht ==0 ist.
09/23/2010 19:26 Madd Eye#4
schon mal was von klammern gehört?

Code:
if(a==b){
mach was;
}
Die hast du überall vergessen
09/23/2010 21:23 Bot_interesierter#5
Madd Eye hat im Grunde recht, wenn du mehr als eine mit einem Semikolon abgeschlossene Code Zeile nur ausführen möchtest wenn die Bedingung für if zutrifft, dann musst du nach if(expression) eine { setzten und am Ende des If Blocks eine }.
C++ Funktioniert nicht wie Python, die Einrückung hat keine Auswirkung auf die Funktion des Codes.
09/23/2010 21:24 ms​#6
Wie Madd Eye schon richtig sagte musst du jeden mehrzeiligen Block in geschweifte Klammern setzen. Die Klammern kannst du nur weglassen, wenn der Block 1 Zeile enthält.
09/23/2010 22:02 NBA#7
Anhand von code gesagt:
Code:
        if (muenzen_anzahl==0)
            cout << "\n\n Der Computer hat gewonnen"<< endl;
            Sleep(3000);
            return;
hier wird nur
Code:
        if (muenzen_anzahl==0)
            cout << "\n\n Der Computer hat gewonnen"<< endl;
ausgeführt. (Wenn Münzen = 0, Computer gewonnen. Danach, mach, egal welcher umstände Sleep(3000) und return. Das if wird ab dem semikolon hinter endl; ignoriert)

Anders hier
Code:
 if (muenzen_anzahl==0)
{
            cout << "\n\n Der Computer hat gewonnen"<< endl;
            Sleep(3000);
            return;
}
Das heißt: "Wenn Münzen = 0, Computer hat gewonnen, warte 3000, gib ieinen wert wieder".
Ich hoffe das war einigermaßen richtig und verständlich, bin grade sau müde.
09/24/2010 16:44 .Infinite#8
Vielen Dank! (bekommt alle ein thx) hat mir sehr geholfen. Da war wohl mein Tutorial etwas ungenau beim Thema Blöcke :)

Ist es denn dann in Ordnung, wenn ich einfach bei jeder If-Anweisung immer nen Block mache, egal wie viele Befehle er macht. Weil es kann ja immer sein, dass man noch was erweitern will.

Hab das Programm jetzt eh nochmal komplett neu geschrieben. Ich arbeite nämlich jetzt Objektorientiert :D

Allerdings hab ich immer noch nicht so richtig verstanden, wann ich jetzt nach nem Block ein Semikolon machen muss und wann nicht.

mfg abba232
09/24/2010 17:01 MoepMeep#9
Solange nach dem If nur ein einziger Befehl kommt, brauchst du keine geschweiften Klammern, sonst schon.
Ich kann dir aber empfehlen, zumindest anfangs, immer die klammern zu setzen.
09/24/2010 17:16 MrSm!th#10
Quote:
Originally Posted by abba232 View Post
Allerdings hab ich immer noch nicht so richtig verstanden, wann ich jetzt nach nem Block ein Semikolon machen muss und wann nicht.

mfg abba232
Ein Semikolon gehört nie hinter die geschweiften Klammern, außer bei Klassen und Strukturen:

Code:
class X
{
int x;
};

struct y
{
int y;
};