|
from typing import List, Tuple |
|
|
|
import streamlit as st |
|
from treys import Card, Deck |
|
from treys import Evaluator |
|
|
|
from models import Hand, SC |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def app(): |
|
placeholder = st.empty() |
|
|
|
st.title('Poker play') |
|
if 'count' not in st.session_state: |
|
st.session_state.count = 0 |
|
st.session_state.sc = SC(st) |
|
|
|
|
|
|
|
st.session_state.count += 1 |
|
placeholder.write('INIT:') |
|
st.write('Count of screen refresh = ', st.session_state.count) |
|
|
|
|
|
btn_shuffle_cards = st.button('shuffle cards') |
|
if btn_shuffle_cards: |
|
_sc: SC = st.session_state.sc |
|
_sc.deck = Deck() |
|
_sc.isTableSet = True |
|
placeholder.write('INIT:TableSet') |
|
|
|
btnTablePreflop = st.button('Table : preFlop') |
|
if btnTablePreflop: |
|
print('-btn preFlop') |
|
_sc: SC = st.session_state.sc |
|
|
|
|
|
for index, player in enumerate(_sc.players_dict.values()): |
|
player.hand.card1 = _sc.deck.draw(1) |
|
for index, player in enumerate(_sc.players_dict.values()): |
|
player.hand.card2 = _sc.deck.draw(1) |
|
|
|
st.session_state.isPreFlop = True |
|
placeholder.write('INIT:TableSet:PreFlop') |
|
|
|
btn_flop = st.button('Table : flop') |
|
if btn_flop: |
|
print('-btn Flop') |
|
_sc: SC = st.session_state.sc |
|
_sc.board_flop = _sc.deck.draw(3) |
|
_sc.isFlop = True |
|
print('-btn Flop done') |
|
placeholder.write('INIT:TableSet:PreFlop:Flop') |
|
|
|
btn_turn = st.button('Table : turn') |
|
if btn_turn: |
|
_sc: SC = st.session_state.sc |
|
_sc.board_turn = _sc.deck.draw(1) |
|
_sc.isTurn = True |
|
placeholder.write('INIT:TableSet:PreFlop:Flop:Turn') |
|
|
|
btn_river = st.button('Table : river') |
|
if btn_river: |
|
_sc: SC = st.session_state.sc |
|
_sc.board_river = _sc.deck.draw(1) |
|
_sc.isRiver = True |
|
placeholder.write('INIT:TableSet:PreFlop:Flop:Turn:River') |
|
|
|
btn_show = st.button('Table : show') |
|
if btn_show: |
|
placeholder.write('INIT:TableSet:PreFlop:Flop:Turn:River===showing') |
|
layTable(st.session_state.sc) |
|
|
|
|
|
def eval_print(msg: str, player_num: int, player_hand: Hand, rankDesc: str, score: int): |
|
st.write(msg, 'Player ', player_num, ' hand is ' |
|
, Card.print_pretty_cards([player_hand.card1, player_hand.card2]) |
|
, 'desc:', rankDesc |
|
, 'score:', score |
|
) |
|
st.write(' ') |
|
|
|
|
|
def eval_player(board: List[Card], hand: Hand, evaluator: Evaluator) -> Tuple[int, str]: |
|
eval_score = evaluator.evaluate(board, [hand.card1, hand.card2]) |
|
rank_class = evaluator.get_rank_class(eval_score) |
|
descClass = evaluator.class_to_string(rank_class) |
|
return eval_score, descClass |
|
|
|
|
|
def layTable(sc: SC): |
|
_board = None |
|
if sc.isFlop: |
|
st.write('Flop = ', Card.print_pretty_cards(sc.board_flop)) |
|
_board = sc.board_flop.copy() |
|
if sc.isTurn: |
|
st.write('Turn = ', Card.print_pretty_card(sc.board_turn)) |
|
_board.append(sc.board_turn) |
|
if sc.isRiver: |
|
st.write('River = ', Card.print_pretty_card(sc.board_river)) |
|
_board.append(sc.board_river) |
|
|
|
|
|
evaluator = Evaluator() |
|
|
|
for index, player in enumerate(sc.players_dict.values()): |
|
tuple2 = eval_player(_board, player.hand, evaluator) |
|
player.score_abs = tuple2[0] |
|
player.score_desc = tuple2[1] |
|
|
|
from collections import OrderedDict |
|
|
|
orderd = OrderedDict(sorted(sc.players_dict.items(), key=lambda x: x[1].score_abs)) |
|
|
|
winner = next(iter(orderd.items())) |
|
|
|
for index, (k, player) in enumerate(sc.players_dict.items()): |
|
if k == winner[0]: |
|
|
|
eval_print('winner', player.pos, player.hand, player.score_desc, player.score_abs) |
|
else: |
|
eval_print(' - ', player.pos, player.hand, player.score_desc, player.score_abs) |
|
|
|
|
|
|
|
|
|
st.write('game ended') |
|
|
|
|
|
|
|
app() |
|
|