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

Cada carta es representada por dos caracteres:
  • El valor: 2–9, T (10), J, Q, K, A
  • El palo: H (Corazones), D (Diamantes), S (Picas), C (Tréboles)
Ejemplo: "AH" significa As de Corazones o "9H" significa 9 de Corazones. En ese caso, 10 de Picas por ejemplo, se representaría como "10S", pero para simplificar el ejercicio, el 10 se representará con la letra T (entonces 10 de Picas es "TS").

A continuación la tabla representando que jugada marca cuantos puntos:
Tabla de Jugadas

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
(Escalera Real)
$ ./balatro
Card #1: 2D
Card #2: 3H
Card #3: 4S
Card #4: 5C
Card #5: 6D
Points for play: 1000
(Escalera)
$ ./balatro
Card #1: 9C
Card #2: 9D
Card #3: 9H
Card #4: 9S
Card #5: 2D
Points for play: 3000
(Póker)

Probando

Asegúrate de probar tu código y que no haya ningún error. Garantiza que tu código cumpla con las siguientes especificaciones:
  • 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
Ejecuta lo siguiente para evaluar la exactitud de tu código usando 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