Problema joculet C++ - loop infinit

So… am facut un joculet de barbut, iar while-ul e infinit.

/**
* Craps @ Tudor Micu.
*/

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

int main()
{
    #define player_money 0
    #define mark_money 1
    int pocket[2];

    #define player_dice 0
    #define mark_dice 1
    int dice[2][2];

    pocket[player_money] = 50;

    #define difficulty_switching 0
    #define money_switching 1
    int opt[2];

    int playedSum;
    int error;

    cout<<"Craps @ Tudor Micu."<<"\n"<<"How lucky are you feeling?"<<"\n\n"<<"Mark says: Hey dude, let's play some craps!"<<"\n"
        <<"You says: Okey, let's play!"<<"\n\n"<<"Switch game difficulty."<<"\n\n"<<"1) Easy"<<"\n"<<"2) Medium"<<"\n"
        <<"3) Hard"<<"\n\n"; cin>>opt[difficulty_switching];

    switch(opt[difficulty_switching])
    {
        case 0: cout<<"\n"<<"Error: Invalid difficulty id."; error = 1; break;
        case 1: cout<<"\n"<<"Switched difficulty: Easy. Succes!"; pocket[mark_money] = 100; break;
        case 2: cout<<"\n"<<"Switched difficulty: Medium. Succes!"; pocket[mark_money] = 200; break;
        case 3: cout<<"\n"<<"Switched difficulty: Hard. Succes!"; pocket[mark_money] = 500; break;
        default: cout<<"\n"<<"Error: Invalid difficulty id."; error = 1; break;
    }

    if(error == 1)
    {
        cout<<"\n\n"<<"Switch game difficulty."<<"\n\n"<<"1) Easy"<<"\n"<<"2) Medium"<<"\n"
        <<"3) Hard"<<"\n\n"; cin>>opt[difficulty_switching];

        error = 0;

        switch(opt[difficulty_switching])
        {
            case 0: cout<<"\n"<<"Error: Invalid difficulty id."; error = 1; break;
            case 1: cout<<"\n"<<"Switched difficulty: Easy. Succes!"; pocket[mark_money] = 100; break;
            case 2: cout<<"\n"<<"Switched difficulty: Medium. Succes!"; pocket[mark_money] = 200; break;
            case 3: cout<<"\n"<<"Switched difficulty: Hard. Succes!"; pocket[mark_money] = 500; break;
            default: cout<<"\n"<<"Error: Invalid difficulty id."; error = 1; break;
        }
    }

    while(pocket[player_money] >= 0 || pocket[mark_money] >= 0)
    {
        cout<<"\n\n"<<"Your pocket: $"<<pocket[player_money]<<", Mark's pocket: $"<<pocket[mark_money]<<"\n"
            <<"Switch the money bet for this round."<<"\n\n"<<"1) $5"<<"\n"<<"2) $10"<<"\n"<<"3) $50"<<"\n"<<"4) $100"<<"\n"
            <<"5) $500"<<"\n\n"; cin>>opt[money_switching];

        switch(opt[money_switching])
        {
            case 0: cout<<"\n"<<"Error: Invalid bet id."; error = 1; break;
            case 1: cout<<"\n"<<"You switched $5 bet. Succes!"; playedSum = 5; break;
            case 2: cout<<"\n"<<"You switched $10 bet. Succes!"; playedSum = 10; break;
            case 3: cout<<"\n"<<"You switched $50 bet. Succes!"; playedSum = 50; break;
            case 4: cout<<"\n"<<"You switched $100 bet. Succes!"; playedSum = 100; break;
            case 5: cout<<"\n"<<"You switched $500 bet. Succes!"; playedSum = 500; break;
            default: cout<<"\n"<<"Error: Invalid bet id."; error = 1; break;

        }

        if(error == 1)
        {
            cout<<"\n\n"<<"Your pocket: $"<<pocket[player_money]<<", Mark's pocket: $"<<pocket[mark_money]<<"\n"
                <<"Switch the money bet for this round."<<"\n\n"<<"1) $5"<<"\n"<<"2) $10"<<"\n"<<"3) $50"<<"\n"<<"4) $100"<<"\n"
                <<"5) $500"<<"\n\n"; cin>>opt[money_switching];

            error = 0;

            switch(opt[money_switching])
            {
                case 0: cout<<"\n"<<"Error: Invalid bet id."; error = 1; break;
                case 1: cout<<"\n"<<"You switched $5 bet. Succes!"; playedSum = 5; break;
                case 2: cout<<"\n"<<"You switched $10 bet. Succes!"; playedSum = 10; break;
                case 3: cout<<"\n"<<"You switched $50 bet. Succes!"; playedSum = 50; break;
                case 4: cout<<"\n"<<"You switched $100 bet. Succes!"; playedSum = 100; break;
                case 5: cout<<"\n"<<"You switched $500 bet. Succes!"; playedSum = 500; break;
                default: cout<<"\n"<<"Error: Invalid bet id."; error = 1; break;
            }
        }

        dice[player_dice][0] = 1 + (int) (6.0 * (rand() / (RAND_MAX + 1.0)));
        dice[player_dice][1] = 1 + (int) (6.0 * (rand() / (RAND_MAX + 1.0)));

        dice[mark_dice][0] = 1 + (int) (6.0 * (rand() / (RAND_MAX + 1.0)));
        dice[mark_dice][1] = 1 + (int) (6.0 * (rand() / (RAND_MAX + 1.0)));

        cout<<"\n\n"<<"You rolls "<<dice[player_dice][0]<<" "<<dice[player_dice][1]<<". Mark rolls "<<dice[mark_dice][0]
            <<" "<<dice[mark_dice][1];

        if(dice[player_dice][0] + dice[player_dice][1] > dice[mark_dice][0] + dice[mark_dice][1])
        {
            pocket[mark_money] -= playedSum; pocket[player_money] += playedSum;
            cout<<". You won $"<<playedSum<<". "<<"\n"<<"(+) Now, you have $"<<pocket[player_money]<<". Congratulations!"<<"\n\n";
            if(pocket[mark_money] == 0)  cout<<"Game over. Your GF is so happy because, you bought her a gift from craps winnings.";
            else if(pocket[mark_money] < 0) cout<<"Game over. Your GF is so happy because, you bought her a gift from craps winnings."
                                                  <<"\n"<<"Remember: Now your friend Mark is indebted with $"<<pocket[mark_money]<<" at you."
                                                  <<"\n";
        }
        else if(dice[player_dice][0] + dice[player_dice][1] < dice[mark_dice][0] + dice[mark_dice][1])
        {
            pocket[player_money] -= playedSum; pocket[mark_money] += playedSum;
            cout<<". You lose $"<<playedSum<<". "<<"\n"<<"(-) Now, you have $"<<pocket[player_money]<<"\n\n";
            if(pocket[player_money] == 0)  cout<<"Game over. Your GF is going to kill you because you lost all her money at craps.";
            else if(pocket[player_money] < 0) cout<<"Game over. Your GF is going to kill you because you lost all her money at craps."
                                                  <<"\n"<<"Remember: Now you are indebted with $"<<pocket[player_money]<<" at your friend, Mark."
                                                  <<"\n";
        }
        else cout<<". No one own."<<"\n\n";

    }

    return 0;
}

1 Like

Tot ce trebuie sa faci e sa iesi din while (cu un break, poate) cand banii jucatorului sau dealer-ului ajung la 0 (sau mai putin de 0). Ai deja if-urile in care afisezi ca e jocul gata, trebuie sa si iesi din while acolo.

3 Likes

In acea structura repetitiva while, tu ai folosit operatorul logic || ( OR ), ceea ce inseamna ca, codul din interiorul structurii repetitive va fi executat atata timp cat una din cele doua conditii este adevarata…

1 Like

Pai da. Iar cand conditia e indeplinita while-ul e in continuare functional, nu se opreste.

Sa traiesti, am rezolvat. Pwp :*

Cum ai rezolvat?


ps: nu încurajăm limbajul de messenger sau licențios.

3 Likes

Cu break, cum a zis si @dplesca

Daca tot l-ai pus aici, incearca sa ii faci un upgrade la c++11, foloseste containere std; adu-l in prezent, nu mai suntem in '98

2 Likes

Pe partea de code-review:

  • poti inlocui #define player_money 0 cu const int player_money = 0; fie la nivel global fie in main. Ditto pentru celelalte #define-uri.
  • in primul switch poti scoate case 0:. O sa se ocupe de el default, ca au acelasi cod.
  • toata partea aia de citire a dificultatii ar putea fi mutata intr-un do { .... } while (error == 1). Acuma ai doua incercari de citire. Dar daca jucatorul insista cu greselile o sa fi intr-o stare aiurea cu programul.
  • Ditto pentru toate “citirile” pe care le faci.
4 Likes

La liceu lucram mai “clasic” :joy:

O sa ii fac un update in viitor™… acum am alte idei de joculete in cap.

Mersi de sfaturi!