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 */