Program przerywa działanie

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?

0

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

0

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

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;
}
1
  1. Pierwszy błąd:
Krupier krupier = Krupier();

powinno być

Krupier krupier;
  1. 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.
0

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

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ć.

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