Problem z pętlą 'while' i zmiennymi o takiej samej wartości

0

Proszę o pomoc. Kiedy wpisuję jakąkolwiek wartość (A, B, C, itd.) dla 'S', program zaczyna "lecieć" w dół wypisując "Wprowadź inny numer rzutu!" w nieskończoność...

int S, Zr, Bd, Int, Rzt, Cha;
int A, B, C, D, E, F;
    A = 7;
    B = 12;
    C = 15;
    D = 9;
    E = 15;
    F = 11;

     cout << "\tPrzypisz numery rzutow nastepujacym atrybutom...\n\n";
     cout << "\t\tSila:\t";
     cin >> S;
     while ((S != A) && (S != B) && (S != C) &&
           (S != D) && (S != E) && (S != F))
           {
           cout << "\n\t\tWprowadz inny numer rzutu!";
           cout << "\n\n\t\tSila:\t";
           cin << S;
           }
     cout << "\t\tZrecznosc:\t";
     cin >> Zr;
     while ((Zr != A) && (Zr != B) && (Zr != C) &&
           (Zr != D) && (Zr != E) && (Zr != F) &&
           (Zr == S))
           {
           cout << "\n\t\tWprowadz inny numer rzutu!";
           cout << "\n\n\t\tZrecznosc:\t";
           cin >> Zr;
           }

Acha, jeszcze jeden problem zauważyłem: jeżeli, np. A i E mają wartość identyczną, to program nie "łyknie" takiego przypisania, bo w końcu spełni ono warunek Zr == S i wejdzie w pętlę.

2

WTF? S jest intem, wiec jak spróbujesz wpisac do niego literkę to nie dziwota że będzie klopot... a to:

cin << S;

to kolejny WTF.
Kolejny temat z serii "nie umiem programować i nie ogarniam jak działa pętla, ale postanowiłem napisać grę"...

0

No tak, mało mnie to urządza, żeby jedną zmienną przypisywać innej. Poprawiłem błąd. Doszedłem do wniosku, że generalnie pętla 'while' blokuje próby wpisania innych wartości, niż te, które zostały wylosowane (roll1, roll2, . . . , roll6; każda ma wartość rzędu 7-18) i o to mi chodziło, ale nadal nie wiem jak zakodować takiego pilnowacza, który nie pozwoli na wpisanie więcej niż raz każdej wartości rollX. Jak wyżej: jeśli zdarzy się, że np. roll1 i roll2 będą miały te same wartości, no to jestem ugotowany...

int S, Zr, Bd, Int, Rzt, Cha;

     cout << "\tPrzypisz numery rzutow nastepujacym atrybutom...\n\n";
     cout << "\t\tSila: ";
     cin >> S;
     while ((S != roll1) && (S != roll2) && (S != roll3) &&
           (S != roll4) && (S != roll5) && (S != roll6))
           {
           cout << "\n\t\tWprowadz inny numer rzutu!";
           cout << "\n\n\t\tSila:\t";
           cin >> S;
           }
     cout << "\t\tZrecznosc: ";
     cin >> Zr;
     while ((Zr != roll1) && (Zr != roll2) && (Zr != roll3) &&
           (Zr != roll4) && (Zr != roll5) && (Zr != roll6) &&
           (Zr == S))//Zabezpieczenie while jest OK
           {
           cout << "\n\t\tWprowadz inny numer rzutu!";
           cout << "\n\n\t\tZrecznosc: ";
           cin >> Zr;
           }

Wystarczy, żeby jeden roll miał daną wartość, to mogę oszukać program i wpisać każdemu atrybutowi ('S', 'Zr', itd.) tą wartość. Chciałbym, żeby program "wiedział", że tylko dwa rolle zaowocowały, np. 15-stkami i żebym nie mógł przypożądkować 15 więcej niż te dwa razy...

0

Używaj || zamiast &&.

0

OK, już praktycznie rozgryzłem problem, ale przy przypisywaniu 'S', czy też 'Zr' jakiejkolwiek liczby (z rozlosowanych przez rolle wyników) , podaje mi komunikat błędu "Wpisz poprawny wynik rzutu!"... Zdaje się, że 'while' jest kopnięta?

int S, Zr, Bd, Int, Rzt, Cha;
int tabCell[5];
tabCell[0] = roll1;
tabCell[1] = roll2;
tabCell[2] = roll3;
tabCell[3] = roll4;
tabCell[4] = roll5;
tabCell[5] = roll6;

     cout << "\tPrzypisz wyniki rzutow nastepujacym atrybutom...\n\n";
     cout << "\t\tSila: ";
     cin >> S;
     while ((S != tabCell[0]) || (S != tabCell[1]) || (S != tabCell[2]) ||
           (S != tabCell[3]) || (S != tabCell[4]) || (S != tabCell[5]))
           {
           cout << "\n\t\tWpisz poprawny wynik rzutu!";
           cout << "\n\n\t\tSila: ";
           cin >> S;
           }
     if (S == roll1)
     tabCell[0] = 0;
     if (S == roll2)
     tabCell[1] = 0;
     if (S == roll3)
     tabCell[2] = 0;
     if (S == roll4)
     tabCell[3] = 0;
     if (S == roll5)
     tabCell[4] = 0;
     if (S == roll6)
     tabCell[5] = 0;

     cout << "\n\t\tZrecznosc: ";
     cin >> Zr;
     while ((Zr != tabCell[0]) || (Zr != tabCell[1]) || (Zr != tabCell[2]) ||
           (Zr != tabCell[3]) || (Zr != tabCell[4]) || (Zr != tabCell[5]))
           {
           cout << "\n\t\tWpisz poprawny wynik rzutu!";
           cout << "\n\n\t\tZrecznosc: ";
           cin >> Zr;
           }
     while (Zr == 0)
           {
           cout << "\n\t\tWpisz poprawny wynik rzutu!";
           cout << "\n\n\t\tZrecznosc: ";
           cin >> Zr;
           }
     if (Zr == roll1)
     tabCell[0] = 0;
     if (Zr == roll2)
     tabCell[1] = 0;
     if (Zr == roll3)
     tabCell[2] = 0;
     if (Zr == roll4)
     tabCell[3] = 0;
     if (Zr == roll5)
     tabCell[4] = 0;
     if (Zr == roll6)
     tabCell[5] = 0;

1 użytkowników online, w tym zalogowanych: 0, gości: 1