Juego de Craps

3
en donde a es el valor de cambio (el cual es igual al primer número del rango deseado de enteros consecuti- vos), y b es el factor de escalamiento (que es igual a la longitud del rango deseado de enteros consecutivos). En los ejercicios, veremos que es posible elegir enteros de manera aleatoria a partir de conjuntos de valores diferentes a los rangos consecutivos de enteros. Error común de programación 5.11 Usar srand en un lugar de rand para generar números aleatorios. 5.10 Ejemplo: Un juego de azar Uno de los juegos de azar más populares es el juego de dados conocido como “craps”, el cual se juega en casi- nos y patios traseros alrededor del mundo. Las reglas del juego son simples. El jugador tira dos dados. Cada dado tiene seis caras. Estas caras contienen 1, 2, 3, 4, 5 y 6 puntos. Una vez que los dados caen, se calcula la suma de los puntos que se encuentran en las caras que ven hacia arriba. Si la su- ma es igual a 7 u 11 en el primer tiro, el jugador gana. Si la suma es 2, 3 o 12 en el primer tiro (llamado “craps”), el jugador pierde (es decir, la “casa” gana). Si la suma es 4, 5, 6, 8, 9, o 10 en el primer tiro, entonces la suma se convierte en el “punto” del jugador. Para ganar, usted debe continuar tirando los dados hasta que “haga su punto”. El jugador pierde si tira un 7 antes de hacer su punto. La figura 5.10 simula el juego de craps, y la figura 5.11 muestra varias ejecuciones de ejemplo. Capítulo 5 Funciones en C 143 01 /* Figura 5.10: fig05_10.c 02 Craps */ 03 #include <stdio.h> 04 #include <stdlib.h> 05 #include <time.h> /* contiene el prototipo de la función time */ 06 07 /* constantes de enumeración que representan el estado del juego */ 08 enum Estatus { CONTINUA, GANA, PIERDE }; 09 10 int tiraDados( void ); /* prototipo de la función */ 11 12 /* la función main comienza la ejecución del programa */ 13 int main() 14 { 15 int suma; /* suma del tiro de datos */ 16 int miPunto; /* punto ganado */ 17 18 enum Estatus estatusJuego /* puede contener CONTINUA, GANA o PIERDE */ 19 20 /* randomiza el generador de números aleatorios mediante la función time */ 21 srand( time( NULL ) ); 22 23 suma = tiraDados(); /* primer tiro de los dados */ 24 25 /* determina el estado del juego basado en la suma de los dados */ 26 switch( suma ) { 27 28 /* gana en el primer tiro */ 29 case 7: 30 case 11: 31 estatusJuego = GANA; Figura 5.10 Programa para simular el juego de craps. (Parte 1 de 3.)

Transcript of Juego de Craps

Page 1: Juego de Craps

en donde a es el valor de cambio (el cual es igual al primer número del rango deseado de enteros consecuti-vos), y b es el factor de escalamiento (que es igual a la longitud del rango deseado de enteros consecutivos).En los ejercicios, veremos que es posible elegir enteros de manera aleatoria a partir de conjuntos de valoresdiferentes a los rangos consecutivos de enteros.

Error común de programación 5.11Usar srand en un lugar de rand para generar números aleatorios.

5.10 Ejemplo: Un juego de azarUno de los juegos de azar más populares es el juego de dados conocido como “craps”, el cual se juega en casi-nos y patios traseros alrededor del mundo. Las reglas del juego son simples.

El jugador tira dos dados. Cada dado tiene seis caras. Estas caras contienen 1, 2, 3, 4, 5 y 6 puntos. Una vez quelos dados caen, se calcula la suma de los puntos que se encuentran en las caras que ven hacia arriba. Si la su-ma es igual a 7 u 11 en el primer tiro, el jugador gana. Si la suma es 2, 3 o 12 en el primer tiro (llamado “craps”),el jugador pierde (es decir, la “casa” gana). Si la suma es 4, 5, 6, 8, 9, o 10 en el primer tiro, entonces la sumase convierte en el “punto” del jugador. Para ganar, usted debe continuar tirando los dados hasta que “haga supunto”. El jugador pierde si tira un 7 antes de hacer su punto.

La figura 5.10 simula el juego de craps, y la figura 5.11 muestra varias ejecuciones de ejemplo.

Capítulo 5 Funciones en C 143

01 /* Figura 5.10: fig05_10.c02 Craps */03 #include <stdio.h>04 #include <stdlib.h>05 #include <time.h> /* contiene el prototipo de la función time */0607 /* constantes de enumeración que representan el estado del juego */08 enum Estatus { CONTINUA, GANA, PIERDE };0910 int tiraDados( void ); /* prototipo de la función */1112 /* la función main comienza la ejecución del programa */13 int main()14 { 15 int suma; /* suma del tiro de datos */16 int miPunto; /* punto ganado */1718 enum Estatus estatusJuego /* puede contener CONTINUA, GANA o PIERDE */1920 /* randomiza el generador de números aleatorios mediante la función time */21 srand( time( NULL ) );2223 suma = tiraDados(); /* primer tiro de los dados */2425 /* determina el estado del juego basado en la suma de los dados */26 switch( suma ) {2728 /* gana en el primer tiro */29 case 7: 30 case 11: 31 estatusJuego = GANA;

Figura 5.10 Programa para simular el juego de craps. (Parte 1 de 3.)

Page 2: Juego de Craps

144 Funciones en C Capítulo 5

32 break;3334 /* pierde en el primer tiro */35 case 2: 36 case 3: 37 case 12: 38 estatusJuego = PIERDE;39 break;4041 /* recuerda el punto */42 default: 43 estatusJuego = CONTINUA;44 miPunto = suma;45 printf( “Su punto es %d\n”, miPunto );46 break; /* opcional */47 } /* fin de switch */4849 /* mientras el juego no se complete */50 while ( estatusJuego == CONTINUA ) { 51 suma = tiraDados(); /* tira de nuevo los dados */5253 /* determina el estatus del juego */54 if ( suma == miPunto ) { /* gana por punto */55 estatusJuego = GANA; /* fin del juego, el jugador gana */56 } /* fin de if */57 else {5859 if ( suma == 7 ) { /* pierde al tirar 7 */60 estatusJuego = PIERDE; /* termina el juego, el jugador pierde */61 } /* fin de if */6263 } /* fin de else */6465 } /* fin de while */6667 /* despliega mensaje de triunfo o derrota */68 if ( estatusJuego == GANA ) { /* ¿Ganó el jugador? */69 printf( “El jugador gana \n” );70 } /* fin de if */71 else { /* el jugador pierde */ 72 printf( “El jugador pierde\n” );73 } /* fin de else */7475 return 0; /* indica terminación exitosa */7677 } /* fin de main */7879 /* tiro de dados, calcula la suma y despliega los resultados */80 int tiraDados( void )81 {82 int dado1; /* primer dado */83 int dado2; /* segundo dado */84 int sumaTemp; /* suma de los dados */

Figura 5.10 Programa para simular el juego de craps. (Parte 2 de 3.)

Page 3: Juego de Craps

En las reglas del juego, observe que el jugador debe tirar dos dados en el primer tiro, y también lo debehacer en los demás tiros subsecuentes. Definimos una función llamada tiraDados para lanzar los dados ycalcular e imprimir la suma. La función tiraDados se define una sola vez, pero se invoca desde dos ubica-ciones diferentes en el programa (líneas 23 y 51). De manera interesante, tiraDados no toma argumentos,así que indicamos void dentro de la lista de parámetros (línea 80). La función tiraDados devuelve la sumade los dos dados, por lo que indicamos el tipo de retorno int en el encabezado de la función.

El juego es razonablemente complicado. El jugador puede ganar o perder en el primer tiro, o puede ganaro perder en cualquier tiro subsiguiente. La variable estatusJuego, definida para que sea de un nuevo tipoenum Estatus, almacena el estado actual. La línea 8 crea un tipo definido por el programador llamada enu-meración. Una enumeración, definida mediante la palabra reservada enum, es un conjunto de constantes enterasrepresentadas por medio de identificadores. En ocasiones, a las constantes de enumeración se les llama cons-tantes simbólicas; esto es, constantes representadas por medio de símbolos. Los valores en una enumeracióncomienzan en 0 y se incrementan en 1. En la línea 8, la constante CONTINUA tiene el valor 0. GANA tiene elvalor 1 y PIERDE tiene el valor 2. También, en un enum, es posible asignar un valor entero a cada identifica-dor (revise el capítulo 13). Los identificadores de una enumeración deben ser únicos, pero los valores puedenestar duplicados.

Capítulo 5 Funciones en C 145

8586 dado1 = 1 + ( rand() % 6 ); /* toma el aleatorio para el dado1 */87 dado2 = 1 + ( rand() % 6 ); /* toma el aleatorio para el dado2 */88 sumaTemp = dado1 + dado2; /* suma el dado1 y el dado2 */8990 /* despliega los resultados de este tiro */91 printf( “El jugador tiro %d + %d = %d\n”, dado1, dado2, sumaTemp );9293 return sumaTemp; /* devuelve la suma de los dados */9495 } /* fin de la función tiraDados */

Figura 5.10 Programa para simular el juego de craps. (Parte 3 de 3.)

El jugador tiro 1 + 5 = 6Su punto es 6

El jugador tiro 2 + 1 = 3El jugador tiro 2 + 6 = 8El jugador tiro 2 + 3 = 5El jugador tiro 6 + 2 = 8El jugador tiro 4 + 2 = 6El jugador gana

El jugador tiro 1 + 1 = 2El jugador pierde

El jugador tiro 5 + 3 = 8Su punto es 8El jugador tiro 2 + 4 = 6El jugador tiro 5 + 4 = 9El jugador tiro 5 + 3 = 8El jugador gana

Figura 5.11 Ejemplo de ejecuciones del juego Craps.