Jogo de craps. Escreva um programa que execute 1000 partidas de craps (sem intervenção humana) e responda a cada uma das perguntas a seguir:
a) Quantos jogos são ganhos no primeiro, no segundo, ..., no vigésimo lançamento e após o vigésimo lançamento?
b) Quantos jogos são perdidos no primeiro, no segundo, ..., no vigésimo lançamento e após o vigésimo lançamento?
c) Quais são as chances de se ganhar no craps? [Nota: você descobrirá que craps é um dos jogos mais honestos do cassino. O que você acha que isso significa?]
d) Qual a média de lançamentos em um jogo de craps?
e) As chances de vencer crescem se o jogo se prolongar?
Passo 1
Fala Galera!!! Tudo certo? Espero que sim!!! Bora para mais um exercício.
Nosso programa terá que simular um dos jogos de azar mais populares conhecido como ‘craps’, que é jogado em cassinos e becos no mundo inteiro. As regras do jogo são simples:
Um jogador lança dois dados. Cada dado tem seis faces. Essas faces contêm 1, 2, 3, 4, 5 e 6 pontos. Depois que os dados param, a soma dos pontos nas duas faces voltadas para cima é calculada. Se a soma for 7 ou 11 na primeira jogada, o jogador vence. Se a soma for 2, 3 ou 12 na primeira jogada (chamado ‘craps’), o jogador perde (ou seja, a ‘casa’ vence). Se a soma for 4, 5, 6, 8, 9 ou 10 na primeira jogada, então a soma se torna o ‘ponto’ do jogador. Para vencer, o jogador precisa continuar lançando os dados até que ‘faça seu ponto’. O jogador perde lançando um 7 antes de fazer o ponto
Passo 2
Agora que já sabemos como o jogo funciona vamos escrever ele. Vamos iniciar incluindo os arquivos de cabeçalho e inicialização da função principal main(), criar as constantes de enumeração que representam status do jogo e os protótipos das funções do nosso programa.
#include
#include
#include
enum Outcome { CONTINUE, WIN, LOSE };
int rollDice( void );
/* protótipo de função */
Passo 3
Dentro da função principal main() vamos criar as variáveis necessárias para o funcionamento do jogo, junto com um gerador de números aleatório que representara as jogadas dos dados.
int main()
{
enum Outcome gameStatus;
/* indicador de status do jogo */
int sum;
/* soma dos dados lançados */
int myPoint;
/* ponto atual */
int i;
/* contador de jogo */
int roll; /* roll counter */
int length = 0;
/* duração média do jogo */
int wins[ 22 ] = { 0 };
/* vitórias por jogada */
int losses[ 22 ] = { 0 };
/* perdas por jogada */
int winSum = 0;
/* vitórias totais */
int loseSum = 0;
/* perdas totais */
srand( time( NULL ) );
/* joga 1000 vezes */
for ( i = 1; i
sum = rollDice();
roll = 1;
/* teste se o jogo ganhou ou perdeu na primeira jogada */
switch ( sum ) {
case 7:
case 11:
gameStatus = WIN;
break; /* exit switch */
case 2:
case 3:
case 12:
gameStatus = LOSE;
break; /* exit switch */
default:
gameStatus = CONTINUE;
myPoint = sum;
break; /* exit switch */
} /* end switch */
/* continua enquanto o jogo não foi ganho ou perdido */
while ( gameStatus == 0 ) {
sum = rollDice();
roll++;
/* ganha no próximo lançamento */
if ( sum == myPoint ) {
gameStatus = WIN;
} /* end if */
else {
/* perde na próxima jogada */
if ( sum == 7 ) {
gameStatus = LOSE;
} /* end if */
} /* end else */
} /* end while */
/* se mais de 21 rolagens forem feitas, defina o número de rolagens para 21 */
if ( roll > 21 ) {
roll = 21;
} /* end if */
/* determina quantos lançamentos foram feitos e incrementa
contador correspondente na matriz de vitórias ou derrotas */
if ( gameStatus == WIN ) {
wins[ roll ]++;
winSum++;
} /* end if */
else {
losses[ roll ]++;
loseSum++;
} /* end else */
} /* end for */
printf("Jogos vencidos ou perdidos após o 20º lançamento\n\n\n" );
/* exibe o número de jogos ganhos e perdidos para cada número de jogadas */
for ( i = 1; i
printf( "%3d jogos ganhos e %3d jogos perdidos no lançamento %d.\n",
wins[ i ], losses[ i ], i );
} /* end for */
/* calcula as chances de ganhar */
printf( "\nAs chances de ganhar são %d/%d = %.2f%%\n", winSum,
winSum + loseSum, 100.0 * winSum / ( winSum + loseSum ) );
/* calcula a duração média do jogo */
for ( i = 1; i
length += wins[ i ] * i + losses[ i ] * i;
} /* end for */
printf( "A duração média do jogo é de %.2f rolagens.\n",
length / 1000.0 );
return 0; /* indicate successful termination */
} /* end main */
Passo 4
Dentro da função principal é feito a verificação de quantos jogos foram ganhos e quantos foram perdidos por lançamento. Para calcular a chances de ganhar é feito através da soma de jogos ganhos divido pela soma de jogadas totais. Todos esses dados são exibidos na tela para o usuário.
Por ultimo agora só precisamos definir a função responsável pelas jogadas do dado:
* função para simular o lançamento de dados */
int rollDice( void )
{
int die1;
/* primeiro dado */
int die2;
/* segundo dado */
int workSum;
/* soma de dados */
die1 = 1 + rand() % 6;
die2 = 1 + rand() % 6;
workSum = die1 + die2;
return workSum;
/* retorna o total de dois dados */
} /* end function rollDice */
Passo 5
A saída do nosso programa será:
E assim nosso programa está finalizado galera. Até o próximo exercício.
Resposta
#include
#include
#include
enum Outcome { CONTINUE, WIN, LOSE };
int rollDice( void );
/* protótipo de função */
int main()
{
enum Outcome gameStatus;
/* indicador de status do jogo */
int sum;
/* soma dos dados lançados */
int myPoint;
/* ponto atual */
int i;
/* contador de jogo */
int roll; /* roll counter */
int length = 0;
/* duração média do jogo */
int wins[ 22 ] = { 0 };
/* vitórias por jogada */
int losses[ 22 ] = { 0 };
/* perdas por jogada */
int winSum = 0;
/* vitórias totais */
int loseSum = 0;
/* perdas totais */
srand( time( NULL ) );
/* joga 1000 vezes */
for ( i = 1; i
sum = rollDice();
roll = 1;
/* teste se o jogo ganhou ou perdeu na primeira jogada */
switch ( sum ) {
case 7:
case 11:
gameStatus = WIN;
break; /* exit switch */
case 2:
case 3:
case 12:
gameStatus = LOSE;
break; /* exit switch */
default:
gameStatus = CONTINUE;
myPoint = sum;
break; /* exit switch */
} /* end switch */
/* continua enquanto o jogo não foi ganho ou perdido */
while ( gameStatus == 0 ) {
sum = rollDice();
roll++;
/* ganha no próximo lançamento */
if ( sum == myPoint ) {
gameStatus = WIN;
} /* end if */
else {
/* perde na próxima jogada */
if ( sum == 7 ) {
gameStatus = LOSE;
} /* end if */
} /* end else */
} /* end while */
/* se mais de 21 rolagens forem feitas, defina o número de rolagens para 21 */
if ( roll > 21 ) {
roll = 21;
} /* end if */
/* determina quantos lançamentos foram feitos e incrementa
contador correspondente na matriz de vitórias ou derrotas */
if ( gameStatus == WIN ) {
wins[ roll ]++;
winSum++;
} /* end if */
else {
losses[ roll ]++;
loseSum++;
} /* end else */
} /* end for */
printf("Jogos vencidos ou perdidos após o 20º lançamento\n\n\n" );
/* exibe o número de jogos ganhos e perdidos para cada número de jogadas */
for ( i = 1; i
printf( "%3d jogos ganhos e %3d jogos perdidos no lançamento %d.\n",
wins[ i ], losses[ i ], i );
} /* end for */
/* calcula as chances de ganhar */
printf( "\nAs chances de ganhar são %d/%d = %.2f%%\n", winSum,
winSum + loseSum, 100.0 * winSum / ( winSum + loseSum ) );
/* calcula a duração média do jogo */
for ( i = 1; i
length += wins[ i ] * i + losses[ i ] * i;
} /* end for */
printf( "A duração média do jogo é de %.2f rolagens.\n",
length / 1000.0 );
return 0; /* indicate successful termination */
} /* end main */
/* função para simular o lançamento de dados */
int rollDice( void )
{
int die1;
/* primeiro dado */
int die2;
/* segundo dado */
int workSum;
/* soma de dados */
die1 = 1 + rand() % 6;
die2 = 1 + rand() % 6;
workSum = die1 + die2;
return workSum;
/* retorna o total de dois dados */
} /* end function rollDice */