Program przerywa działanie

Odpowiedz Nowy wątek
2015-01-05 18:03
0

Witam, mam następujący problem, napisałem prostą grę karcianą (jeszcze w konsoli) i rozgrywka działa dobrze z jednym wyjątkiem, zawiesza się! I to nie w jakimś konkretnym momencie tylko wydaje się to być losowe. Raz się przerywa w pierwszej rundzie a raz w 20, innym razem w x'tej rundzie. Nie przerywa się też w cały czas tym samym miejscu programu. Raz przerwało mi gdy wykonywałem ruch a innym razem przy wyświetlaniu wyników i to w połowie. Czy jest to problem w kodzie czy należy go szukać w innym miejscu?

Pozostało 580 znaków

2015-01-05 18:05
Biały Krawiec
0

Pokaż kod. Takie zachowanie śmierdzi wyciekiem pamięci.

Pozostało 580 znaków

2015-01-05 18:06
0

Problem zawsze znajduje sie pomiędzy monitorem a krzesłem. Ale efekty tego problemu potem przenikają do kodu.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-05 18:09
0

Gra złożona jest z kilku klas, wrzucę póki co tylko kod rozgrywki żeby nie śmiecić za bardzo

 while (gracz.moze_grac() && t != 't')
    {
        Krupier krupier = Krupier();

        krupier.dobierz_karte(krupier.rozdaj());
        gracz.dobierz_karte(krupier.rozdaj());
        krupier.dobierz_karte(krupier.rozdaj());
        gracz.dobierz_karte(krupier.rozdaj());

        while (gracz.punkty() <= 21)
        {
            system("cls");
            cout << "Sterowanie:\n   H -\t\tdobierz karte\n   S -\t\tNie dobieraj\n   E -\t\tWyjscie\nMILEJ GRY!\n\n" << endl;
            cout << "KRUPIER:\n" << "Karty:\t\t";
            krupier.pokaz_reke(true);

            cout << "\n\n\nGRACZ: ";
            gracz.wnazwa();
            cout << "\n\nKarty:\t\t";
            gracz.pokaz_reke();
            cout << "\nStan gotowki: \t";
            gracz.wgotowka();
            cout << "\nPunkty: \t" << gracz.punkty();

            if (_zaklad)
            {
                cout << "\n\n\nPostaw zaklad:\n>> ";
                cin >> zaklad;
                krupier.przyjmij_zaklad(gracz.postaw_zaklad(zaklad));
                _zaklad = false;
                cin.ignore(); cin.sync();
            }
            cout << "\n\nCo chcesz zrobic:\n>>";

            string ruch = "y";
            getline(cin, ruch);
            if (ruch[ 0 ] == 'h' || ruch[ 0 ] == 'H')
            {
                gracz.dobierz_karte(krupier.rozdaj());
            }
            else if (ruch[ 0 ] == 's' || ruch[ 0 ] == 'S')
            {
                while (krupier.punkty() < 17 && gracz.punkty() > krupier.punkty() && gracz.punkty() <= 21)
                {
                    krupier.dobierz_karte(krupier.rozdaj());
                }
                break;
            }
            else if (ruch[ 0 ] == 'e' || ruch[ 0 ] == 'E')
            {
                cout << "Wybrales E, czy na pewno? (T/N)\n>> ";
                cin >> t;

                if (t == 't' || t == 'T')
                {
                    break;
                }
                else
                {
                    continue;
                }

            }
            else
            {
                cout << "Powtorz wybor!" << endl;
            }
        }//while

        string wynik;

        if (krupier.punkty() > gracz.punkty() && krupier.punkty() <= 21) wynik = "\n\n\nWYGRAL KRUPIER!";
        else if (krupier.punkty() <= 21 && gracz.punkty() > 21) wynik = "\n\n\nWYGRAL KRUPIER!";
        else if (krupier.punkty() == gracz.punkty() && krupier.punkty() <= 21)
        {
            wynik = "\n\n\nREMIS!\nOtrzymujesz zwrot swojego zakladu";
            gracz.wez_nagrode(krupier.wydaj_nagrode() / 2);
        }
        else
        {
            wynik = "\n\n\nWYGRALES!!\nOtrzymujesz nagrode w wysokosci dwukrotnego zakladu!";
            gracz.wez_nagrode(krupier.wydaj_nagrode());
        }

        _sleep(2000);

        gracz.reset();
        _zaklad = true;

    }//while 

Karty gracza i krupiera przechowuję w vectorze :)

Dodam jeszcze że wszystko działało jak należy dopóki nie poprawiłem liczenia punktów z kart:

kod wygląda tak:

 int Gracz::punkty()
{
    int punkty = 0;
    int ile_asow = 0;

    for (unsigned int i = 0; i < reka.size(); i++)
    {
        Karta k = reka[ i ];
        if (k.punkty() == 11) ile_asow++;
        punkty += k.punkty();
    }

    while (ile_asow)
    {
        if (punkty > 21)
        {
            punkty -= 10;
            ile_asow--;
        }
    }

    p_reki = punkty;
    return punkty;
}
edytowany 2x, ostatnio: BeYourself20, 2015-01-05 18:12

Pozostało 580 znaków

2015-01-05 18:14
1
  1. Pierwszy błąd:
    Krupier krupier = Krupier();

    powinno być

    Krupier krupier;
  2. Kod to tragedia. Serio. Funkcja powinna mieć 5-10 linijek max. Dodatkowo powinna mieć jeden poziom abstrakcji, a u ciebie masz poziom logiki gry pomieszany z jakimiś niskopoziomowymi rzeczami typu porównywanie charów i czyszczenie strumienia wejsciowego. Masakra.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
nad jakością kodu cały czas pracuję - BeYourself20 2015-01-05 18:19

Pozostało 580 znaków

2015-01-05 23:25
0

Poprawiłem wskazane błędy lecz problem nadal występuje, ktoś ma jeszcze jakieś pomysły?

tak odpal to w debuggerze i złap to co się wysypuje - gośćabc 2015-01-06 00:08

Pozostało 580 znaków

2015-01-06 00:07
1

Nie i nikt nie będzie miał bo błąd pewnie leży gdzieś w części kodu której nie pokazałeś. Ale nie, nie wstawiaj całego. Patrząc na spaghetti które już pokazałeś to nikt tego nie tknie nawet patykiem. Uruchom program z debugera i jak sie sypnie to zobaczysz gdzie. A jak sie zawiesi to będziesz mógł zrobić "pause" i też zobaczysz gdzie wisi. I nie, nie pisz "nie umiem używać debugera". Nie obchodzi nas to. Czas sie nauczyć.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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