Universidad de Chile
Facultad de Ciencias Físicas y Matemáticas
Departamento de Ciencias de la Computación
CC1002 – Introducción a la Programación
Tarea 2: Blackjack
Profesor: Matias Torrealba A.
Auxiliares: Magdalena Álvarez, Angélica Hernández, Vicente Hidalgo,
Konrad Ivelic, Sebastián Mira, Julia Paredes
Recuerde que la tarea es individual y se verificará que así sea.
Todas las funciones DEBEN tener receta de diseño completa: contrato, propósito,
ejemplos y test.
Se le sugiere trabajar con tiempo. NO DEJE LA TAREA PARA EL ÚLTIMO
DÍA. En particular, no se aceptarán entregas fuera de plazo ni entregas por otro
medio distinto a U-Cursos.
Solo puede utilizar el contenido visto en clases, hasta la clase #14 (esto es: variables
y expresiones, funciones, módulos, condiciones, recursión, testing, lista enlazada,
abstracción funcional).
1. Introducción
Para esta tarea, replicaremos un juego de apuestas bastante popular:Blackjack. El blackjack,
también llamado veintiuno, es un juego de cartas, propio de los casinos con una o más barajas
inglesas de 52 cartas sin los comodines, que consiste en sumar un valor lo más próximo a 21 pero
sin pasarse. En un casino cada jugador de la mesa juega únicamente contra el crupier, intentando
conseguir una mejor jugada que este. El crupier está sujeto a reglas fijas (explicadas más adelante).
Las cartas numéricas suman su valor, las figuras suman 10 y el as vale 11 o 1, a elección del jugador.
En el caso del crupier, los ases valen 11 mientras no se pase de 21, y 1 en caso contrario. La mejor
jugada es conseguir 21 con solo dos cartas, esto es con un As más carta de valor 10. Esta jugada
se conoce como Blackjack o 21 natural. Un blackjack gana sobre un 21 conseguido con más de dos
cartas.1
1.1. Reglas
El juego comienza cuando el jugador ingresa su nombre e indica cuál es la cantidad total (saldo)
que tiene para apostar. Posteriormente, debe realizar su apuesta ingresando la cantidad exacta para
ese turno. Si el jugador intenta apostar un número que exceda su saldo o el número no es válido
(menor o igual a 0, por ejemplo), se muestra un mensaje indicando que la apuesta no es válida y se
debe volver a solicitar un monto para apostar.
Una vez realizada la apuesta, el jugador obtendrá su mano con dos cartas. Se tendrán los siguientes
casos:
• Ambas suman 21, es un blackjack y gana automáticamente.
1
[Link]
Tarea 2: Blackjack 1
• Las cartas del jugador no exceden 21, por lo que podrá solicitar una (o más cartas). En caso de
no solicitarlas, será el turno de la casa.
• Se excede 21, el jugador pierde automáticamente.
Una vez finalizado el turno del jugador, será el turno de la casa, que seguirá las siguientes reglas:
• Siempre comenzará con 2 cartas.
• Si ambas cartas suman 21, es un blackjack y gana automáticamente.
• Si la suma de las cartas es menor a 16, debe solicitar una carta extra.
• Si la suma de las cartas es 17 o más, no pedirá ninguna carta extra.
• Una vez determinada la mano final, se debe decidir quien gana: el jugador, la casa o es un
empate.
1.2. Restricciones
Deberá considerar las siguientes restricciones al hacer las apuestas y para calcular el puntaje de
cada jugador:
• La cantidad que se apuesta desde el saldo es la misma que se gana/pierde.
• En caso de obtener blackjack, se gana 1.5 veces la apuesta realizada.
• Dado que la apuesta es un número entero, el monto ganado/perdido también lo debe ser.
• En caso que el jugador empate con la casa, el saldo se mantiene igual que antes de realizar la
apuesta.
• Las cartas disponibles son números del 1 al 10, y las cartas A, J, Q, K.
• El valor de J, Q y K es 10.
• El valor de A puede tomar el valor de 11 o 1, a elección del jugador.
• Deberá crear una estructura “carta”, que contenga número y tipo.
• El tipo de cada carta puede ser (de manera aleatoria) “corazón”, “diamante”, “trébol” o “pica”.
• La mano del jugador será una lista de cartas.
2. Trabajo Pedido
La entrega de esta tarea considera tres archivos: módulo [Link] , que contendrá todas las
funciones a implementar sobre la lógica de las cartas del juego, módulo [Link] que contendrá
todas las funciones a implementar sobre la lógica del juego, y [Link] , que corresponde a la
implementación del juego, componiendo adecuadamente las funciones del módulo anterior.
Tarea 2: Blackjack 2
2.1. Módulo carta
En este archivo debe definir, siguiendo la receta de diseño y testing, la estructura carta,
la cual contenga un “valor” (A, 2–10, J, Q, K) y una “pinta” (C, E, D, T, representando cora-
zón, espadas, diamante y trébol, respectivamente). Junto con esta estructura, debe definir también
todas las funciones necesarias relacionadas a la validación, lógica y funcionamiento de estas. Recuer-
de diseñar una batería de tests adecuados para demostrar el correcto funcionamiento de sus funciones.
Con respecto a la estructura, se le pide definir la siguiente:
• carta :: Atributos –> valor(int), pinta(str) : Representa una carta utilizada en el juego
de BlackJack. Las cartas con valores no numéricos (A, J, Q, K) se representan con un número
asociado (1, 11, 12, 13).
Con respecto a las funciones, se le pide definir AL MENOS las siguientes funciones:
• esCarta(carta) :: carta → bool : Retorna True si el argumento es una carta valida o False
en caso contrario.
• getValor(carta) :: carta → int : Retorna un valor a partir de una carta.
• getPinta(carta) :: carta → str : Retorna la pinta de una carta.
2.2. Módulo jugador
En este archivo debe definir, siguiendo la receta de diseño y testing, la estructura “juga-
dor” la cual contenga un “nombre”, una “mano”(lista de cartas) y “fichas”. Junto con lo anterior,
debe también definir las dependencias entre los conceptos principales del problema e implementar
las funciones necesarias para resolver dicho problema. Diseñe una batería de tests adecuados para
demostrar el correcto funcionamiento de sus funciones.
Con respecto a la estructura, se le pide definir la siguiente:
• jugador :: Atributos –> nombre(str), mano(lista(carta)), fichas(int) : Representa a
un jugador el cual esta participando de una partida.
Con respecto a las funciones, se le pide definir AL MENOS las siguientes funciones:
• esJugador(jugador) :: jugador → bool : Retorna True si el argumento es un jugador va-
lido o False en caso contrario.
• ases(jugador) :: jugador→bool : Indica si hay algún “As” en la mano del jugador.
• puntaje(jugador) :: jugador→int : Suma el puntaje de las cartas del jugador y devuelve
un entero con el resultado.
• mostrarCartas(jugador) :: jugador→str : Ingresa un jugador y devuelve su mano como
un único string, separando cada carta por un espacio.
• pedirCarta(jugador) :: jugador→jugador : Agrega una carta a la mano del jugador y
entrega el jugador con los valores actualizados. Las cartas con valores no numéricos (A, J, Q,
K) se representan con un número asociado (1, 11, 12, 13).
Tarea 2: Blackjack 3
• mano(jugador) :: jugador→lista(str) : Entrega la lista con las cartas del jugador.
Nota: Puede definir cualquier función auxiliar extra que considere necesaria, pero recuerde que
las funciones a revisar serán las indicadas anteriormente.
2.3. Archivo blackjack
Este archivo utilizará el módulo jugador definido anteriormente, debiendo componer adecuada-
mente sus funciones para lograr el comportamiento esperado. Escriba un programa recursivo que
permita simular el juego, es decir, desde que el jugador ingresa su nombre y el saldo disponible hasta
que se quede sin saldo o decida retirarse.
Puede ser creativo y definir los diálogos de la forma que le parezca más correcta, pero cumpliendo
con los siguientes requisitos: (1) mostrar la mano de cartas actual; (2) mostrar en pantalla la mano
obtenida por la casa y (3) indicar quién es el ganador. Como guía, puede utilizar el siguiente ejemplo
que cumple los tres requisitos mencionados anteriormente:
1 Bienvenido al juego "Blackjack"
2 Ingrese su nombre: Bill
3 Ingrese el saldo inicial: 10000
4
5 Su saldo es 10000
6 #Apuesto algo negativo
7 Ingrese una apuesta (0 para terminar): -100
8 La apuesta no es válida
9
10 #Apuesto más de lo que tengo
11 Ingrese una apuesta (0 para terminar): 20000
12 No puedes apostar más que tu saldo actual
13
14 #Casos varios para apuestas válidas
15 Ingrese una apuesta (0 para terminar): 1000
16
17 Sus cartas son A 10
18 Total: 21
19
20 Blackjack! La casa pierde
21
22 Su saldo es 11500
23 Ingrese una apuesta (0 para terminar): 1000
24
25 Sus cartas son J 3
26 Desea otra carta (si/no)?: si
27
28 Sus cartas son J 3 5
29 Desea otra carta (si/no)?: no
30
31 Total: 18
32
33 La casa juega
34 Las cartas de la casa son Q A
35 Total: 21
36
Tarea 2: Blackjack 4
37 Blackjack! La casa gana
38
39 Su saldo es 10500
40 Ingrese una apuesta (0 para terminar): 1000
41
42 Sus cartas son 10 9
43 Desea otra carta (si/no)?: no
44
45 Total: 19
46
47 La casa juega
48 Las cartas de la casa son 7 7 3
49 Total: 17
50
51 La casa pierde!
52
53 Su saldo es 11500
54 Ingrese una apuesta (0 para terminar): 1000
55
56 Sus cartas son 10 9
57 Desea otra carta (si/no)?: no
58
59 Total: 19
60
61 La casa juega
62 Las cartas de la casa son 2 7 K
63 Total: 19
64
65 Empate! Se devuelve la apuesta
66
67 Su saldo es 11500
68 Ingrese una apuesta (0 para terminar): 1000
69
70 Sus cartas son 10 8
71 Desea otra carta (si/no)?: no
72
73 Total: 18
74
75 La casa juega
76 Las cartas de la casa son 2 7 K
77 Total: 19
78
79 La casa gana!
80
81 Su saldo es 10500
82 Ingrese una apuesta (0 para terminar): 1000
83
84 Sus cartas son 10 5
85 Desea otra carta (si/no)?: si
86
87 Sus cartas son 10 5 8
88
89 Total: 23
Tarea 2: Blackjack 5
90
91 Se pasa de 21! La casa gana
92
93 Su saldo es 9500
94 Ingrese una apuesta (0 para terminar): 1000
95
96 Sus cartas son A A
97 Desea otra carta (si/no)?: si
98
99 Sus cartas son A A 8
100 Desea otra carta (si/no)?: no
101
102 Total: 20
103
104 La casa juega
105 Las cartas de la casa son 7 7 9
106 Total: 23
107
108 La casa se pasó de 21! La casa pierde
109
110 Su saldo es 10500
111 Ingrese una apuesta (0 para terminar): 0
112
113 Gracias por jugar. Su saldo final es 10500
3. Entrega de la Tarea
La entrega de la tarea deben ser los archivos [Link] , [Link] y [Link] . Además de
lo anterior, deberá documentar el proceso de diseño y desarrollo de su tarea en un informe de no
más de 3 páginas en formato PDF. Puede considerar lo siguiente:
• Explicar el diseño y test de las funciones programadas
• Explicar qué realizó para llevar a cabo el juego de manera interactiva
Se recibirán entregas únicamente por U-Cursos en el espacio designado para ello. El plazo es hasta
el viernes 20 de octubre a las 18:00 hrs, permitiendo atrasos (sin descuento) únicamente hasta
el domingo 22 de octubre a las 23:59 hrs. Una vez finalizado este plazo, NO se recibirán entregas.
4. Distribución de puntajes
• Módulo carta: 1.5 puntos
• Módulo jugador: 2 puntos
• Archivo blackjack: 1.5 puntos
• Informe: 1 punto
Tarea 2: Blackjack 6