Balatro
Implementa un programa que detecte y asigne puntos a una mano de cartas estilo póker, dándole más puntos a combinaciones más raras.
$ ./balatro
Card #1: 9H
Card #2: TH
Card #3: JH
Card #4: QH
Card #5: KH
Points for play: 5000
Contexto
En juegos como Balatro o Poker, las combinaciones de cartas no solo dependen del azar, sino de reconocer patrones complejos entre manos posibles. Mientras que una carta alta tiene poco valor, una escalera real es extremadamente rara y valiosa.Este sistema de puntuación por rareza hace que la estrategia y la probabilidad entren en juego. En este ejercicio, simularás una mano de poker y determinarás su valor utilizando lógica en C. Este problema te permitirá practicar structs, arreglos, cadenas de caracteres, validación de entrada, y sobre todo, el diseño modular por funciones.
A diferencia de sistemas como elecciones por mayoría de votos, aquí no hay ganadores por cantidad, sino por la calidad (rareza) de las combinaciones. Tu objetivo es hacer un programa que detecte combinaciones de poker y asigne puntos como si se tratara de una partida de Balatro
- El valor: 2–9, T (10), J, Q, K, A
- El palo: H (Corazones), D (Diamantes), S (Picas), C (Tréboles)
A continuación la tabla representando que jugada marca cuantos puntos:

Empezando
Abre VS Code
Comienza haciendo click dentro de la ventana de tu terminal, luego ejecuta
cd
por sí mismo.
$
Haz clic dentro de esa ventana de terminal y luego escribe
wget https://raw.githubusercontent.com/sea2horses/balatro-cs50-y25c1/main/balatro.zip
seguido de Enter para descargar un ZIP llamado balatro.zip
en su espacio
de código.
Ahora ejecuta
unzip balatro.zip
para crear una carpeta llamada balatro
. Ya no necesita el archivo ZIP,
por lo que puede ejecutar
rm balatro.zip
y responda con "y" seguido de Enter en el aviso para eliminar el archivo ZIP que descargó.
Ahora escribe
cd balatro
para moverte hacia (es decir, abrir) ese directorio. Tu terminal debería parecerse a lo siguiente.
balatro/ $
Si todo salió bien, debes ejecutar.
ls
y ver un archivo llamado balatro.c
. La ejecución
code balatro.c
debería abrir el archivo donde escribirá su código para
este conjunto de problemas.
Comprendiendo
Echémosle un vistazo a balatro.c
. Se define una constante llamada
HAND_SIZE
, que representa el número total de cartas en una mano de póker
(en este caso, 5). Luego, encontramos una estructura card
, que modela una
carta del mazo. Cada carta tiene un valor entero value
, que representa su
rango (del 2 al 14, donde T = 10, J = 11, Q = 12, K = 13 y A = 14), y un carácter
suit
que indica su palo: 'S'
para espadas, 'H'
para corazones, 'C'
para tréboles y 'D'
para diamantes.
El arreglo global cards
de tipo card
guarda las cinco cartas
que el jugador va ingresando. En la función main
, se solicita al usuario
que introduzca una a una las 5 cartas. Para cada entrada, se llama a la función
validate_card
, que debe verificar que la carta ingresada tenga un formato
válido (por ejemplo, "9H"
o "AD"
) y que no se repita.
Luego de validar la entrada, se crea una nueva carta. Su valor se determina con la
función get_value_from_letter
, que debe traducir letras como
'T'
, 'Q'
, 'A'
, etc., a su valor numérico
correspondiente. Esa carta se almacena en el arreglo cards
.
Una vez registradas todas las cartas, el programa llama a la función
calculate_points
, que debe evaluar la mejor combinación de póker entre las
cinco cartas ingresadas y retornar el puntaje correspondiente. Dentro de esta función,
ya se proporciona una estructura que cuenta cuántas veces aparece cada valor y cuántas
veces aparece cada palo, lo cual es útil para determinar combinaciones como par, trío,
color, etc. Finalmente, se imprime en pantalla la cantidad de puntos obtenidos por esa
jugada.
Más abajo en el archivo verás que las funciones get_value_from_letter
,
validate_card
, y calculate_points
aún no están completas. ¡Te
toca a ti implementarlas! Tu objetivo es asegurarte de que el programa pueda detectar
combinaciones de póker como pares, escaleras, full house o incluso escalera real, y que
devuelva correctamente su puntaje en base a la rareza de cada jugada.
Implementación
Completa la implementación del programa para que analice una mano de póker de
5
cartas introducidas por el usuario, valide su formato, y calcule
correctamente los puntos obtenidos según la rareza de la jugada (como pares, tríos, full
house, etc.).
No debes modificar la función main
. Solo debes implementar las siguientes
funciones:
get_value_from_letter
: Dado un caracter por ejemplo T, lo convierte a 10, o dado un caracter númerico como 8, devuelve 8. Sin embargo, si hay un carácter no permitido como 1 o Z se devuelve -1 para indicar que está fuera del rango permitido.
validate_card
: Verifica que la carta ingresada tenga un valor y palo
válidos. Por ejemplo, TH
sería válido (T = 10, H = corazones), mientras que
1Z
no lo sería.
calculate_points
: Analiza el arreglo global de cartas ya válidas y devuelve
la puntuación correspondiente según las reglas del póker. Por ejemplo, un par puede
valer 1 punto, una escalera 4, y una mano con cinco cartas del mismo palo 5 o más,
dependiendo de la implementación.
Uso
Tu programa debería comportarse como los ejemplos siguientes:$ ./balatro
Card #1: AH
Card #2: KH
Card #3: QH
Card #4: JH
Card #5: TH
Points for play: 10000
$ ./balatro
Card #1: 2D
Card #2: 3H
Card #3: 4S
Card #4: 5C
Card #5: 6D
Points for play: 1000
$ ./balatro
Card #1: 9C
Card #2: 9D
Card #3: 9H
Card #4: 9S
Card #5: 2D
Points for play: 3000
Probando
- Validar el valor (2-9 o T J Q K A) y palo de la carta
- Validar el tamaño de la carta (exactamente 2 caracteres)
- Verificar que no existan cartas repetidas
- Calcular correctamente la mano y el puntaje por jugada
check50
.
¡Pero asegúrate de compilarlo y probarlo por ti mismo también!
check50 sea2horses/balatro-cs50-y25c1/main/check
Ejecuta lo siguiente para evaluar el estilo de su código usando style50
.
style50 balatro.c
¿Cómo entregarlo?
Debido a problemas actuales con GitHub y submit50, no hay un comando para enviarlo, pero si quieres enviamelo a sea2horses@gmail.com
Registro de cambios
- 29-07-2025
- Versión Inicial