Probleme bei einer do-while schleife.[SOLVED]



  • Erstmal hallo liebes Forum,

    auf der Suche nach Hilfe habe ich diese Forum entdeckt! Hoffe hier kann mir jemand helfen. (Bestimmt schon xD)

    ich programmiere zurzeit ein kleines Black Jack Programm in Cpp. Dort benutze ich folgende Schleife:

    do
    {
       cout << "Wie viele Chips moechten sie setzen? ";
       cin >> setcoins;
    } while ((coins < setcoins) /* && (setcoins <= 0)*/);
    

    Wenn ich den auskommentierten Teil nicht benutze tut es das was es soll. Nämlich verhindern, dass der Spieler mehr Chips setzt als er hat. Benutze ich den auskommentierten Teil jedoch mit, macht er nichts mehr. Eigentlich soll er dann nämlich noch zusätzlich dafür sorgen, dass kein Wert <= 0 eingegeben werden kann. Wie gesagt funktioniert das nicht. Man kann dann nämlich alles eingeben wie man lustig ist. 😕

    Hier der ganze Source:

    /*
    #########################
    #		BLACKJACK		#
    #		BY PALONE		#
    #########################		
    #		HAVE FUN		#
    #		AND LEARN		#
    #########################
    */
    
    #include <stdlib.h>
    #include <iostream>
    #include <time.h>
    #include <windows.h>
    
    using namespace std;
    
    int main() 
    {
    	//VAR_DEKLARATION
    	int score,dscore,choice,again,coins,opencard,setcoins,bet;
    	srand((unsigned)time( NULL ));//Bindet RAND() an Sekunden. Wichtig weil RAND() sonst immer den gleiche Wert ausgeben würde.
    
    	score = 0;//Spieler Punkte
    	dscore = 0;//Dealer Punkte
    	choice = 0;//Entscheidung ob Karte gezogen wird
    	coins = 100;//Spieler Geld
    	setcoins = 0;//Gesetzte Coins
    	opencard = 0;//Die offene karte des Dealers
    	bet = 0;//Verhindert ein mehrmaliges Setzen innerhalb einer Runde
    
    	do
    	{
    	//START
    
    		//Entscheidung ob Spiel wiederholt wird
    		again = 0;//Muss hierhin sonst Bug beim restarten!
    
    		system("cls");
    		cout << "Willkommen bei: 'BlackJack'" << endl;
    		system("pause");
    		cout << endl << "Die karten werden neu gemischt..."  << endl;
    		cout  << "Sie erhalten 2 karten!" << endl;
    
    		//VERGABE DER ERSTEN BEIDEN KARTEN
    		score = (rand() % 9 + 2) + (rand() % 9 + 2);
    		_sleep(123);//Ohne sleep gibt es manchmal die gleichen Punktzahlen!!!
    		opencard = (rand() % 9 + 2);
    		dscore = (rand() % 9 + 2) + opencard;
    
    		//HAUPTSCHLEIFE
    		do
    		{
    			//START
    
    			//COINS SETZEN
    			cout << "Chips: " << coins << endl << endl;
    
    			if (bet == 0)//Man kann nur setzen wenn noch nicht gesetzt wurde nämlich (BET = 0)
    			{	
    				do
    				{
    					cout << "Wie viele Chips moechten sie setzen? ";
    					cin >> setcoins;
    				} while ((coins < setcoins) /* && (setcoins <= 0)*/);//Verhindert das mehr Chips gesetzt werden als vorhanden und das mindestens "1" gesetzt wird!
    
    				coins = coins - setcoins;
    				bet = 1;//(BET = 1) bedeutet es wurde schon gesetzt
    			}
    			system("cls");
    
    			//KARTE ZIEHEN?
    			cout << endl << "Eigene Punktzahl: " << score << endl << endl;
    			cout << "Dealer: " << dscore << endl;
    			cout << "Offene Karte des Dealers: " << opencard << endl;//Zeigt die offene Karte ded Dealers an.
    			cout << endl << "Moechten sie eine weitere Karte? <0=NEIN|1=JA>" << endl;
    			cin >> choice;//Entscheidung ob Karte gezogen wird
    
    			if (choice >= 1)
    			{
    				score = score + (rand() % 9 + 2);
    				_sleep(123);//Ohne Sleep gibt es manchmal die gleichen Punktzahlen!!!
    			}
    
    			if (dscore <= 16)//Der Dealer zieht seine Karten immer nach der “Dealer must stand on 17 and must draw to 16“ Regel. Siehe Wikipedia!
    			{
    				dscore = dscore + (rand() % 9 + 2);
    			}
    
    			system("cls");
    			//ENDE
    		} while ((score <= 21) && (choice == 1) && (coins >= 0) && (dscore <= 21));//Alle Abbruchkriterien
    
    		//LETZTE ANZEIGE DER PUNKTE
    		cout << endl << "Punktzahl: " << score << endl;
    		cout << "Dealer: " << dscore << endl << endl;
    
    		//SPIEL_ÜBERPRÜFUNG
    
    		if ((score > 21) && (dscore <= 21))
    		{
    			cout << "Sie haben mehr als 21! Verloren!" << endl;
    			setcoins = 0;
    		}
    
    		else if ((score > 21) && (dscore > 21))
    		{
    			cout << "Sie beide haben mehr als 21! Untentschieden!" << endl;
    			setcoins = 0;
    		}
    
    		else if ((dscore > 21) && (score <= 21))
    		{
    			cout << "Der Dealer hat mehr als 21! Gewonnen!" << endl;
    			setcoins = setcoins * 2; 
    		}
    
    		else  if (score > dscore)
    		{
    			cout << "Sie haben mehr als der Dealer! Gewonnen!" << endl;
    			setcoins = setcoins * 2;
    		}
    
    		else if (score == dscore)
    		{
    			cout << "Sie beide haben gleich viel! Unentschieden!" << endl;
    			setcoins = 0;
    		}
    
    		else if (dscore > score)
    		{
    			cout << "Der Dealer hat mehr! Verloren!" << endl;
    			setcoins = 0;
    		}
    
    		//Herausgabe des Gewinns
    		coins = coins + setcoins;
    		cout << "Chips: " << coins << endl << endl;
    
    		//Überprüfung des Geldes
    		if (coins <= 0)
    		{
    			cout << "Sie sind Pleite!!! GAME OVER!!!" << endl;
    			break;//Spiel wird beendet. GAME OVER!
    		}
    
    		//AGAIN ABFRAGE
    		cout << endl << "Nochmal? (1=Ja) ";
    		cin >> again;
    
    		bet = 0;//Das Setzen für nächste Runde wieder aktivieren!!!
    
    	} while (again == 1);	
    
    //ENDE
    system("pause");
    return 0;	
    }
    

    Was mich dabei am meisten verwirrt ist, dass ich in der Hauptschleife eine do-while Schleife ,mit 4 Abbruchkriterien benutzen kann, und alle funktionieren ohne je probleme gemacht zu haben... 😕 😮

    Vielen Dank schonmal für die Hilfe 👍 🙂

    GREETS PALone

    EDIT: Ich benutze Visual Studio 2012 Professional, falls das wichtig ist 🙂



  • Die Schleife soll laufen, solange der eingegebene Wert größer als die Vorhandenen ist oder kleiner gliech 0 ist.
    Siehst du den Unterschied?



  • PALone schrieb:

    //VERGABE DER ERSTEN BEIDEN KARTEN
    		score = (rand() % 9 + 2) + (rand() % 9 + 2);
    		_sleep(123);//Ohne sleep gibt es manchmal die gleichen Punktzahlen!!!
    		opencard = (rand() % 9 + 2);
    		dscore = (rand() % 9 + 2) + opencard;
    

    So ein Bullshit. Auf das hat das _sleep() an der stelle genau garkeinen Einfluß.



  • OK danke 😃 👍
    Mit ODER hats geklappt 😉 Da hat ich wohl nen massiven Denkfehler 😮

    Zu _sleep:

    Ich habe die Idee, RAND() an die Millisekunden zu "hängen" aus irgendeinem anderen Forum. Da stand bei das man eben SLEEP benutzen muss. Habs grad ohne gestest geht auch. Danke ihr beiden 👍 👍 👍



  • PALone schrieb:

    srand((unsigned)time( NULL ));//Bindet RAND() an Sekunden. Wichtig weil RAND() sonst immer den gleiche Wert ausgeben würde.
    

    Da wird nichts gebunden. Der seed für rand wird auf einen Wert gesetzt.

    Man nimmt da gerne die Epoche (Sekunden seit irgendwann (i.A. 1.1.1970)).
    So bekommt nur dieselbe (Zufalls-)Zahlenfolge, wenn das Programm nochmal in derselben Sekunde gestartet wird.


Anmelden zum Antworten