Escriba un programa en Python que permita simular el comportamiento de una partida de cartas de poker modalidad TEXAS HOLDEM utilizando técnicas de programación orientada a objetos.
Propuesta de módulos y clases por módulo:
├── test_poker.py
├── game.py
│ └── Game
├── cards.py
│ ├── Card
│ ├── Deck
│ └── Hand
└── roles.py
├── Dealer
└── Player
- Datos:
- Deck
- Players
- Dealer
- Responsabilidades:
- Crear un mazo
- Crear los jugadores
- Crear el dealer
- Comenzar la partida (repartir cartas, buscar mejor combinación)
- Finalizar la partida (mostrar el ganador y su mano)
- Datos:
- Mazo
- Jugadores
- Responsabilidades:
- Destapar cartas comunes
- Dar cartas a los jugadores
- Ver la mejor mano de cada jugador
- Dictaminar la mejor mano
- Datos:
- Nombre
- 2 cartas propias
- 5 cartas comunes
- Responsabilidades:
- Encontrar su mejor combinación de cartas
- Datos:
- Número de la carta
- Palo de la carta
- Responsabilidades:
- Saber si una carta es menor que otra
- Representar la carta
- Datos:
- 52 cartas
- Responsabilidades:
- Dar cartas aleatorias
- Datos:
- 5 cartas
- Responsabilidades:
- Descubrir la categoría de la mano
- Asignar una puntuación a la categoría
- Saber si una mano es mejor que otra
Debe existir una función game.get_winner()
con la siguiente definición:
def get_winner(
players: list[Player],
common_cards: list[Card],
private_cards: list[list[Card]],
) -> tuple[Player | None, Hand]:
Esta función debe retornar el jugador ganador y la mano ganadora. En caso de empate, el jugador será valor None
pero la mano ganadora sí tendrá un valor.
→ Puedes descargar aquí el fichero de tests para pytest.
- Se debe poder construir un objecto
Player
pasando el nombre del jugador. Ejemplos:Player('Player 1'), Player('Player 2')
- Se debe poder construir un objecto
Card
desde una cadena de texto. Ejemplos:Card('Q♠'), Card('7♣'), Card('A♠')
- El objeto
Hand
debe contener un atributocat
que represente la categoría de la mano, con una de las siguientes constantes: - El objeto
Hand
debe contener un atributocat
que identifique la categoría de la mano así como un atributocat_rank
que almacene el "ranking" de su categoría. En la mayoría de casos es la carta más alta, pero no siempre. Ejemplos:
hand.cat |
hand.cat_rank |
Explicación |
---|---|---|
Hand.HIGH_CARD |
'J' |
Carta más álta |
Hand.ONE_PAIR |
'5' |
Carta más álta |
Hand.TWO_PAIR |
('10', '7') |
Tupla con cartas más altas (de mayor a menor) |
Hand.THREE_OF_A_KIND |
'K' |
Carta más álta |
Hand.STRAIGTH |
'9' |
Carta más álta |
Hand.FLUSH |
'Q' |
Carta más álta |
Hand.FULL_HOUSE |
('3', 'J') |
Tupla con carta del trío y carta de la pareja |
Hand.FOUR_OF_A_KIND |
'Q' |
Carta más álta |
Hand.STRAIGHT_FLUSH |
'7' |
Carta más álta |
El fichero helpers.py contiene funciones de apoyo al desarrollo del proyecto.
Genera un valor entero aleatorio entre a
y b
incluidos:
>>> import helpers
>>> helpers.randint(1, 52)
8
>>> helpers.randint(1, 4)
2
Si sólo se pasa un argumento, devolverá un valor aleatorio entre 0 y el argumento pasado:
>>> helpers.randint(10)
1
>>> helpers.randint(10)
6
Baraja los elementos que hay en items
. No devuelve nada. La modificación queda en items
:
>>> cards = ['A', 'J', 'K', 'Q']
>>> helpers.shuffle(cards)
>>> cards
['Q', 'A', 'K', 'J']
Genera todas las combinaciones posibles de values
de tamaño n
:
>>> list(helpers.combinations((1, 2, 3, 4, 5), n=3))
[(1, 2, 3),
(1, 2, 4),
(1, 2, 5),
(1, 3, 4),
(1, 3, 5),
(1, 4, 5),
(2, 3, 4),
(2, 3, 5),
(2, 4, 5),
(3, 4, 5)]
💡 El parámetro
n
debe pasarse por nombre.