Obliczenie wartości ręki w pokerze

0

Proszę o pomoc w zadaniu domowym z książki C++ przewodnik dla początkujących. Za zadanie mam wylosować pięć kart i obliczyć ich wartość (w pokerze). Udało mi się stworzyć talię, z której wybieram 5 kart. Zrobiłem to w formie stringa, czyli mam rękę składającą się np. "as pik", "dama kier", "dwojka karo", "dwojka trefl", "czworka kier". Nie mogę wpaść na pomysł jak to przełożyć na jakieś wartości (np. żeby program wyliczył, że mam parę dwójek). Być może źle zacząłem cały program tworząc tablice stringów. Poniżej mój kod:

 
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

string kolory[4] ={"kier", "karo", "trefl", "pik"};
string wartosci[13] ={"dwojka", "trojka", "czworka", "piatka", "szostka", "siodemka",
                "osemka", "dziewiatka", "dziasiatka", "walet", "dama", "krol",
                "as"};
string cala_talia[52];
string moja_reka[7];
int ile_bylo = 0;

bool czy_byla(string cala_talia[], int ile, string karta){
    int licznik = 0;
    do {
        if (karta == cala_talia[licznik])
        {return true;}
        else licznik++;
    } while(licznik<ile);
    return false;
}

void tasowanie() {
    bool bylo = false;
    string karta;
        while (ile_bylo < 52){
            do
            {
                karta = wartosci[rand() % 13] +" "+ kolory[rand() % 4];
            if(!czy_byla(cala_talia, ile_bylo, karta))
                {cala_talia[ile_bylo] = karta;
                ile_bylo++;
                bylo=true;}
            }while(bylo==false);
        }
        for ( int i = 0; i < 52; i++ ) {
            cout<<i<<" "<<cala_talia[i]<<endl;
        }
}


void wybieranie() {
    for (int i = 0; i < 5; i++) {
        {moja_reka[i] = cala_talia[i];
        cout<<i<<" "<<moja_reka[i]<<endl;}
    }
}

int main() {
    srand(time(NULL));
    tasowanie();
    wybieranie();
    return 0;
}

0

najprościej wg mnie sprawdzić corner case'y:

  • sprawdź czy ma jedną parę;
  • sprawdź czy ma dwie pary;
  • sprawdź czy jest trójka (tylko 3 karty takie same figury);
  • sprawdź czy jest czwórka (tylko 4 karty takie same figury);
  • sprawdź czy wszystkie karty są tego samego koloru;
  • sprawdź czy wszystkie karty są po kolei;

na podstawie tych flag możesz złożyć rękę pokerową;

to jaką heurystykę zastosujesz (w jakiej kolejności będziesz sprawdzał te warunki i kiedy przerywał sprawdzanie ponieważ mogłeś już wyczerpać wszystkie możliwość i dalsze sprawdzanie nie będzie miało sensu) wpłynie pewnie na elegancję wykonania tego zadania

mam nadzieję, że niczego nie pominąłem, to tylko skrót myślowy

0
gośćabc napisał(a):

najprościej wg mnie sprawdzić corner case'y:

  • sprawdź czy ma jedną parę;

Właśnie tu jest problem, że pobieram karty w formie:
"dwojka trefl
trojka karo
trojka kier
walet trefl
as pik"

Pojedyncze karty są stringami i po prostu nie mam pomysłu jak je podzielić, żeby porównywać poszczególne człony. W Pythonie pewnie użył bym metody split() i sobie porównał pierwsze elementy poszczególnych kart. Nie potrafię tego zrobić w C++. Najtrudniejsze dla mnie jest na razie znalezienie jednej głupiej pary. Później myślę, że pójdzie z górki. Prosiłbym tylko o podpowiedź jak porównać takie stringi jak wyżej? W książce, z której się uczę zadanie występuje w początkowych rozdziałach książki, nawet przed tablicami. Domyślam się więc, że da się to wszystko zrobić bez klas i innych bardziej zaawansowanych zagadnień...

0

na przykład tak:

#include <iostream>
#include <vector>

enum class Suits
{
	Hearts,
	Clubs,
	Spades,
	Diamonds
};

enum class CardFaces
{
	Deuce,
	Three,
	Four,
	Five,
	Six,
	Seven,
	Eight,
	Nine,
	Ten,
	Jack,
	Queen,
	King,
	Ace
};

enum class PokerHandRankings
{
	HighCard,
	SinglePair,
	TwoPairs,
	ThreeOfAKind,
	Straight,
	Flush,
	FoudOfAKind,
	StraightFlush
};

struct Card
{
	CardFaces face;

	Suits suit;
};

void stateMyPokerHand(std::vector<Card> const& hand);

int main()
{
	std::vector<Card> myHand { { CardFaces::Eight, Suits::Clubs },
							   { CardFaces::Seven, Suits::Hearts },
							   { CardFaces::Eight, Suits::Spades },
							   { CardFaces::Deuce, Suits::Diamonds },
							   { CardFaces::Seven, Suits::Spades }
							 };

	stateMyPokerHand(myHand);

	return 0;
}

void stateMyPokerHand(std::vector<Card> const& hand)
{
	// TODO
}

edit:
zamiast std::vector możesz użyć std::set i to posortować, powinno ułatwić analizę zdecydowanie;

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