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?
Pokaż kod. Takie zachowanie śmierdzi wyciekiem pamięci.
Problem zawsze znajduje sie pomiędzy monitorem a krzesłem. Ale efekty tego problemu potem przenikają do kodu.
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;
}
- Pierwszy błąd:
Krupier krupier = Krupier();
powinno być
Krupier krupier;
- 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.
Poprawiłem wskazane błędy lecz problem nadal występuje, ktoś ma jeszcze jakieś pomysły?
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ć.