Embaralhamento e distribuição de cartas. Modifique

o programa que você desenvolveu no Exercício

18.12 de modo que possa simular o distribuidor das

cartas. A mão de cinco cartas do distribuidor é distribuída

‘virada para baixo’, para que o jogador não

possa vê-la. O programa deverá, então, avaliar a mão

do distribuidor e, com base na qualidade da mão, retirar

uma, duas ou três outras cartas para substituir

o número correspondente de cartas desnecessárias

na mão original. Então, o programa deverá reavaliar

a mão do distribuidor.

Passo 1

Nossa tarefa é implementar uma maneira de remover cartas desnecessárias - cartas que não são usadas na combinação mais valiosa da mão.

Para isso, criaremos uma função que, com base no valor retornado pela avaliação da mão, remove as cartas desnecessárias.

Primeiramente, vamos lembrar a funçãovaluHand() do exercício anterior:

int evaluateHand(const vector& hand)

{

if (hasFourOfAKind(hand))

return 6;

if (hasFlush(hand))

return 5;

if (hasStraight(hand))

return 4;

if (hasThreeOfAKind(hand))

return 3;

if (hasTwoPairs(hand))

return 2;

if (hasPair(hand))

return 1;

return 0;

}

Agora, vamos criar uma função que chamará corretamente use o valor de avaliação, chame a função para remover os cartões desnecessários e adicione os cartões de substituição.

A função precisará da mão e do baralho das cartas:

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

}

Passo 2

A função retornará 0 quando o baralho não tiver mais cartas desnecessárias. Caso contrário, retorna 1.

Se o valor de avaliação for maior que 3 ou o baralho estiver vazio, retornaremos 0:

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

int val = evaluateHand(hand);

if (val > 3 || !deck.moreCards())

return 0;

...

}

Criaremos um mapa que terá o valor de face como o valor "chave" e contará como o "valor".

Este mapa será usado para determinar as cartas desnecessárias.

Em primeiro lugar, inicialize o mapa para conter todas as faces com os valores de contagem de zero:

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

mapint, int> faces;

for (int i = 0; i Card::numOfFaces; i++)

faces.insert({i, 0});

...

}

Em seguida, itere pela mão, incrementando os valores das faces das cartas encontradas:

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

for (auto i : hand)

faces.find(i.getFace())->second++;

...

}

Se o resultado for 0, todos os cartões são desnecessários, então limpe todo o vetor e adicione 5 novos cartões:

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

if (val == 0)

{

hand.clear();

for (int i = 0; i

hand.push_back(deck.dealCard());

}

...

}

Se a combinação for "três do mesmo tipo", remova todas as cartas que não fazem parte da face que não faz parte da combinação.

Não precisamos nos preocupar em ter uma carta extra com a mesma face, porque isso seria uma combinação "quatro de um tipo".

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

else if (val == 3)

{

for (int i = 0; i hand.size(); i++)

if (faces.find(hand.at(i).getFace())->second

!= 3)

hand.erase(hand.begin() + i);

...

}

...

}

Passo 3

Em seguida, adicione as duas novas cartas. Certifique-se de verificar se o baralho está vazio a cada iteração (é importante após a primeira iteração):

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

else if (val == 3)

{

...

for (int i = 0; i deck.moreCards(); i++)

hand.push_back(deck.dealCard());

}

...

}

Se a combinação for "dois pares" ou "par", retire a carta com a face que não faz parte da combinação (2 cartas com a mesma face).

Certifique-se de diminuir o valor no mapa, para evitar a remoção de cartas que fazem parte da combinação. Por exemplo, se houver 3 cartas com a mesma face, o algoritmo removerá todas as 3 cartas, mesmo que 2 dessas cartas tenham que permanecer para manter a combinação.

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

else if (val == 1 || val == 2)

{

for (int i = 0; i hand.size(); i++)

{

if (faces.find(hand.at(i).getFace())->second

!= 2)

{

hand.erase(hand.begin() + i);

faces.find(hand.at(i)

.getFace())->second--;

}

}

...

}

...

}

Por fim, adicione os cartões de substituição correspondentes ao número de cartões removidos:

int replaceUnneededCards(vector& hand,

DeckOfCards& deck)

{

...

else if (val == 1 || val == 2)

{

...

if (val == 1)

hand.push_back(deck.dealCard());

else

for (int i = 0;

i deck.moreCards();

i++)

hand.push_back(deck.dealCard());

}

return 1;

}

A função do motorista:

int main()

{

vector dealer;

DeckOfCards deck;

deck.shuffle();

for (int i = 0; i deck.moreCards(); i++)

dealer.push_back(deck.dealCard());

cout evaluateHand(dealer) endl;

while (replaceUnneededCards(dealer, deck))

cout evaluateHand(dealer) endl;

}

Resposta

Ver desenvolvimento.