Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gra Nim, błędne wyniki

Ostatnio zmodyfikowano 2014-10-16 15:04
Autor Wiadomość
Hunteerrq
Temat założony przez niniejszego użytkownika
Gra Nim, błędne wyniki
» 2014-10-15 23:21:31
Witam. Jestem nowym programistą. Dzisiaj na zadanie dostałem napisanie gry Nim w języku C++ z wykorzystaniem pętli Do...while.
C/C++
#include <iostream>

using namespace std;

int main()
{
    int sterta1, sterta2;
    int sterta, ilosc, zwyciezca;
    sterta1 = 100;
    sterta2 = 100;
    cout << "Podaj imie gracza numer jeden ";
    string gracz1, gracz2;
    cin >> gracz1;
    cout << "Podaj imie gracza numer dwa ";
    cin >> gracz2;
    do
    {
        cout << "Sterta 1 wynosi: " << sterta1;
        cout << "  Sterta 2 wynosi: " << sterta2;
        cout << "  Gracz 1 wybierz sterte [1/2] ";
        cin >> sterta;
        cout << " Gracz 1 wybierz ilosc: ";
        cin >> ilosc;
        if( sterta == 1 )
        {
            sterta1 = sterta1 - ilosc;
            zwyciezca = 1;
        }
        else
        {
            sterta2 = sterta2 - ilosc;
            zwyciezca = 1;
           
        }
       
       
        cout << "Sterta 1 wynosi: " << sterta1;
        cout << "  Sterta 2 wynosi: " << sterta2;
        cout << "  Gracz 2 wybierz sterte [1/2]";
        cin >> sterta;
        cout << "  Gracz 2 wybierz ilosc: ";
        cin >> ilosc;
        if( sterta == 1 )
        {
            sterta1 = sterta1 - ilosc;
            zwyciezca = 2;
           
           
        }
        else
        {
            sterta2 = sterta2 - ilosc;
            zwyciezca = 2;
           
        }
       
       
       
       
    }
    while( sterta1 > 0 && sterta2 > 0 );
   
    cout << "Zwyciezyl gracz " << zwyciezca;
    return 0;
}
To jest cały kod, który napisałem jednak z niewiadomych dla mnie przyczyn przed wyzerowaniem się obu zbiorów kończy i wypisuje gracza w dodatku błędnie. Prosiłbym o objaśnienie błędu który popełniłem i ewentualna poprawka błędu ;). Nie mogę wykorzystywać zbyt różnorodnych komend, muszę zastosować pętle Do...while i jedynie warunki. Pozdrawiam i z góry dziękuję :D.
Zapewniam, iż sam pisałem ten kod a przygodę z programowaniem zacząłem wraz z tym rokiem szkolnym. Od kilku godzin próbuję znaleźć przyczynę jednak nie przyniosło to żadnych skutków, także chciałbym was poprosić o pomoc. ;}
P-118567
walus1305
» 2014-10-16 10:51:35
dodaj biblioteke string. nie sprawdzasz kto jest zwyciezcą . zawsze będzie wygrywał gracz 2 bo on jest wpisywany jako ostatni. daj warunek przed wypisaniem zwycięzcy który sprawdza który z nich wygrał.
P-118579
Hunteerrq
Temat założony przez niniejszego użytkownika
» 2014-10-16 14:28:35
Dodałem bibliotekę i dodałem warunek przy każdym jednak wciąż nie wiem czemu program kończy pracę przed wyzerowaniem się obu stert przez co teraz nie wyświetla żadnego gracza. Chodzi tutaj głównie o celowo popełniany błąd kiedy sterta1 = 0 a sterta2= np. 20 i kiedy weźmiemy ze sterty2 10 kamieni to program i tak kończy działanie
C/C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int sterta1, sterta2;
    int sterta, ilosc, zwyciezca;
    sterta1 = 100;
    sterta2 = 100;
    cout << "Podaj imie gracza numer jeden ";
    string gracz1, gracz2;
    cin >> gracz1;
    cout << "Podaj imie gracza numer dwa ";
    cin >> gracz2;
    do
    {
        cout << "Sterta 1 wynosi: " << sterta1;
        cout << "  Sterta 2 wynosi: " << sterta2;
        cout << "  Gracz 1 wybierz sterte [1/2] ";
        cin >> sterta;
        cout << " Gracz 1 wybierz ilosc: ";
        cin >> ilosc;
        if( sterta == 1 )
        {
            sterta1 = sterta1 - ilosc;
            if( sterta1 == 0 && sterta2 == 0 )
            {
                zwyciezca = 1;
                break;
            }
        }
        else
        {
            sterta2 = sterta2 - ilosc;
            if( sterta1 == 0 && sterta2 == 0 )
            {
                zwyciezca = 1;
                break;
            }
           
        }
       
       
        cout << "Sterta 1 wynosi: " << sterta1;
        cout << "  Sterta 2 wynosi: " << sterta2;
        cout << "  Gracz 2 wybierz sterte [1/2]";
        cin >> sterta;
        cout << "  Gracz 2 wybierz ilosc: ";
        cin >> ilosc;
        if( sterta == 1 )
        {
            sterta1 = sterta1 - ilosc;
            if( sterta1 == 0 && sterta2 == 0 )
            {
                zwyciezca = 2;
                break;
            }
           
           
        }
        else
        {
            sterta2 = sterta2 - ilosc;
            if( sterta1 == 0 && sterta2 == 0 )
            {
                zwyciezca = 2;
                break;
            }
           
        }
       
       
       
       
    }
    while( sterta1 > 0 && sterta2 > 0 );
   
    cout << "Zwyciezyl gracz " << zwyciezca;
    return 0;
}

 
P-118614
walus1305
» 2014-10-16 14:45:17
w while daj >=
P-118615
Hunteerrq
Temat założony przez niniejszego użytkownika
» 2014-10-16 14:54:47
Ogromne podziękowania dla Ciebie! Teraz wszystko działa i gracz jest prawidłowo wyświetlany. Mógłbym tylko wiedzieć dlaczego tam musi być większe lub równe? Czy to jest związane ze specyfikacją tej pętli? Ponieważ kiedy zostawała liczba 10 która jest większa od 0 program również kończył działanie. Chociaż i tak ogromne dzięki za to, że w ogóle chciało Ci się analizować ten kod :).
P-118617
walus1305
» 2014-10-16 15:00:19
jak będziesz miał w stosie 0 i sprawdzasz w petli czy stos >0 to ona się przerwie bo 0 nie jest > od 0 dlatego musisz dać >= i wtedy spełnia się warunek w pętli " działaj dopóki liczby sa większę lub równe 0 " bo tak tylko zadziała dla > od 0
P-118618
Hunteerrq
Temat założony przez niniejszego użytkownika
» 2014-10-16 15:04:48
Zapomniałem, że są tam 2 stosy a ja dałem iloczyn logiczny. Warunek przestaje działać kiedy 1 stos jest 0. Ogromne dzięki za wyjaśnienie! :)
P-118619
« 1 »
  Strona 1 z 1