Projeto: embaralhar e distribuir cartas. Use as funções desenvolvidas no Exercício 7.12 para escrever um programa que trate duas mãos de pôquer com cinco cartas; avalie cada mão e determine qual é a melhor.
Passo 1
Beleza pessoal¿! Espero que todos aqui estejam bem e super dispostos hoje pois esse exercício que iremos fazer é MUITO grande e requer MUITA atenção, sem mais delongas vamos começar!!!!
Vamos escrever um programa que faça o seguinte:
Distribua duas mãos de pôquer de cinco cartas do baralho de cartas embaralhadas.
Avalie as duas mãos de poker e mostre qual é a melhor mão.
Observe que consideraremos as regras de um jogo de pôquer para determinar qual mão é a melhor. Para fazer isso, seguiremos as regras do poker onde a melhor mão é determinada de acordo com suas classificações. Ou seja, quem tiver a mão de poker mais alta ganha o jogo. A classificação das mãos de poker é mostrada abaixo (10 sendo a melhor mão e 1 sendo a pior mão).
Para escrever este programa, primeiro declararemos os seguintes arquivos de cabeçalho.
#include
#include
#include
Em seguida, vamos declarar os seguintes protótipos de função.
Passo 2
A função shuffle aceita uma matriz de baralho vazia e inicializa as cartas nesse baralho procurando aleatoriamente por um slot vazio no baralho. Assim, produzindo cartas embaralhadas no baralho.
A função de distribuição aceita o baralho, a face, o naipe e a matriz de duas mãos como parâmetros e distribui as duas mãos de pôquer de cinco cartas do baralho. Neste caso, teremos que distribuir cada carta alternadamente para os dois jogadores.
Agora, vamos começar a escrever as definições das funções auxiliares que serão usadas para determinar as mãos de poker.
A função getTotalPairs é uma função auxiliar que aceita a mão do jogador como parâmetro e retorna o número de pares na mão do jogador, ou zero se não houver pares encontrados. Observe que os pares são considerados como cartas que têm o mesmo valor de face. Por exemplo, dois valetes são considerados um par.
Passo 3
A função getSameKinds é uma função auxiliar que aceita a mão do jogador como parâmetro e retorna o número de cartas na mão do jogador que possuem 3 ou 4 valores de face iguais. Caso contrário, retorna 0. Por exemplo, se houver três jacks, retorna 3.
A função hasFlush é uma função auxiliar que aceita a mão do jogador como parâmetro e retorna true se a mão tiver um flush. Caso contrário, retorna falso. Observe que um flush são as cartas que têm os mesmos valores de naipe. Por exemplo, se todas as cinco cartas forem Diamantes, ele retornará verdadeiro.
A função hasStraight é uma função auxiliar que aceita a mão do jogador como parâmetro e retorna true se a mão contiver uma sequência. Caso contrário, retorna falso. Observe que straight são cinco cartas de valores de face consecutivos. Temos dois casos para isso.
(Caso Normal) Se a mão contém valores de face como: Ás, Dois, Três, Quatro, Cinco.
(Caso Hierárquico - já que Ás é o valor mais alto no poker). Se a mão contém valores de face como: Ás, Rei, Dama, Valete, Dez.
Passo 4
Vamos agora definir as funções que determinarão a mão de poker.
A função onePair aceita a mão do jogador como parâmetro e retorna true se a mão tiver apenas um par e o restante das cartas estiverem em valores de face diferentes. Caso contrário, retorna falso.
A função twoPairs aceita a mão do jogador como parâmetro e retorna true se a mão tiver dois pares. Caso contrário, retorna falso.
A função threeOfAKind aceita a mão do jogador como parâmetro e retorna true se a mão tiver apenas três cartas com o mesmo valor de face enquanto as outras duas cartas estiverem com valores de face diferentes. Caso contrário, retorna falso.
A função fourOfAKind aceita a mão do jogador como parâmetro e retorna true se a mão tiver apenas quatro cartas com o mesmo valor de face. Caso contrário, retorna falso.
A função flush aceita a mão do jogador como parâmetro e retorna true se todas as cinco cartas estiverem no mesmo naipe, mas não em ordem consecutiva (não em sequência). Caso contrário, retorna falso.
A função straight aceita a mão do jogador como parâmetro e retorna true se todas as cinco cartas estiverem em ordem consecutiva, mas não do mesmo naipe. Caso contrário, retorna falso.
A função fullHouse aceita a mão do jogador como parâmetro e retorna true se a mão contiver uma trinca e um par. Caso contrário, retorna falso.
A função straightFlush aceita a mão do jogador como parâmetro e retorna true se todas as cinco cartas estiverem em ordem consecutiva, do mesmo naipe, mas não um royal flush. Caso contrário, retorna falso.
A função royalFlush aceita a mão do jogador como parâmetro e retorna true se todas as cinco cartas forem uma sequência que contenha apenas as cartas "Ás, Rei, Dama, Valete, Dez". Caso contrário, retorna falso.
Passo 5
Vamos então definir uma função chamada checkHand que verifica a mão do jogador e exibe sua mão de pôquer equivalente invocando as funções acima.
Vamos então definir a função auxiliar que retorna a carta de maior valor na mão do jogador. No pôquer, a carta de maior valor é o Ás, seguido pelo Rei, Dama, Valete, depois 10 para 2.
Passo 6
Vamos agora avaliar as duas mãos de poker de cinco cartas e verificar qual é a melhor mão. Nesse caso, criaremos uma função que executa o seguinte:
Aceita as mãos dos dois jogadores como parâmetros.
Determina a classificação de acordo com as mãos de poker.
Compara as classificações para determinar a melhor mão.
Mostra qual jogador tem a melhor mão.
Ao determinar a melhor mão, devemos considerar os seguintes casos.
Quem tiver a classificação mais alta é a melhor mão.
No caso de ambas as mãos terem o mesmo valor, também consideraremos o seguinte (o maior valor nominal ganha):
Todos os valores de face são os mesmos para ambas as mãos: "Empate".
Royal Flush: "Empate".
Um par: Determine qual tem o par de valor de face mais alto. Se ambos tiverem o mesmo par de valor de face, compare a face mais alta entre as cartas paralelas. Se eles ainda tiverem a mesma carta de maior valor nominal, compare a próxima carta de maior valor. Se ainda for o mesmo, compare as cartas laterais.
Dois pares: Determine qual tem o par de valor de face mais alto. Se o par mais alto for o mesmo, compare o próximo par. Se ainda for o mesmo, compare as cartas laterais.
Trinca ou Full House: Compare a trinca mais alta.
Four of a kind: Compare as quatro mais altas de um tipo.
Straight ou StraightFlush: Compare o valor de face mais alto.
Flush ou HighCard: Compare o valor nominal mais alto. Se ambos forem iguais, compare o próximo valor mais alto e assim por diante.
Observe que para escrever esta função, também usaremos algumas funções auxiliares que serão discutidas mais adiante.
Vamos agora descrever e definir as funções usadas pela função checkBetterHand para determinar a melhor mão.
A função getRank aceita a mão do jogador como parâmetro e retorna a classificação dessa mão de acordo com sua mão de pôquer correspondente.
A função getCard aceita a mão e sua mão de pôquer correspondente como parâmetros. Em seguida, ele retorna o valor nominal do par, da trinca ou da quadra, dependendo da mão de pôquer passada no parâmetro.
A função compareHighCards aceita as cartas de maior valor nominal dos dois jogadores e retorna qual jogador tem a carta de maior valor nominal. Considere que no pôquer, a carta de maior valor é o Ás, seguido pelo Rei, Dama, Valete e depois 10 para 2.
A função de descarte aceita a mão do jogador e uma carta de valor facial como parâmetros. Em seguida, ele remove a carta da mão colocando -1 em seu local. Esta função é usada pelo checkBetterHand ao comparar as próximas cartas de valor de face mais alto dos dois jogadores no caso de terem repetidamente os mesmos valores de face mais altos.
A função compareKickers aceita as mãos atuais dos dois jogadores como parâmetros. Em seguida, ele compara as cartas de maior valor nominal entre as cartas laterais (kickers) para determinar qual jogador tem a melhor mão. Esta função é usada pelo checkBetterHand ao comparar as próximas cartas de valor de face mais alto dos dois jogadores no caso de terem repetidamente os mesmos valores de face mais altos.
Por fim, usaremos a função main para executar os requisitos do programa.
Resposta
Ver o desenvolvimento!!!