├── README.md ├── cards ├── Ace of Clubs.png ├── Ace of Diamonds.png ├── Ace of Hearts.png ├── Ace of Spades.png ├── Eight of Clubs.png ├── Eight of Diamonds.png ├── Eight of Hearts.png ├── Eight of Spades.png ├── Five of Clubs.png ├── Five of Diamonds.png ├── Five of Hearts.png ├── Five of Spades.png ├── Four of Clubs.png ├── Four of Diamonds.png ├── Four of Hearts.png ├── Four of Spades.png ├── Jack of Clubs.png ├── Jack of Diamonds.png ├── Jack of Hearts.png ├── Jack of Spades.png ├── King of Clubs.png ├── King of Diamonds.png ├── King of Hearts.png ├── King of Spades.png ├── Nine of Clubs.png ├── Nine of Diamonds.png ├── Nine of Hearts.png ├── Nine of Spades.png ├── Queen of Clubs.png ├── Queen of Diamonds.png ├── Queen of Hearts.png ├── Queen of Spades.png ├── Seven of Clubs.png ├── Seven of Diamonds.png ├── Seven of Hearts.png ├── Seven of Spades.png ├── Six of Clubs.png ├── Six of Diamonds.png ├── Six of Hearts.png ├── Six of Spades.png ├── Ten of Clubs.png ├── Ten of Diamonds.png ├── Ten of Hearts.png ├── Ten of Spades.png ├── Three of Clubs.png ├── Three of Diamonds.png ├── Three of Hearts.png ├── Three of Spades.png ├── Two of Clubs.png ├── Two of Diamonds.png ├── Two of Hearts.png ├── Two of Spades.png ├── default.png ├── default0.png └── default1.png └── texas_holdem_poker.py /README.md: -------------------------------------------------------------------------------- 1 | # Python Poker 2 | Texas Holdem Poker made with Python and TKinter 3 | 4 | module dependencies: PIL 5 | 6 | ![showing gui](https://i.imgur.com/xjsWugc.png) 7 | 8 | The organization of this repository and its branches is a work in progress. ihsansaktia is helping with this effort: https://github.com/ihsansaktia 9 | 10 | 11 | youtube playlist I am making to explain this code: https://youtu.be/0_G9XElINRE 12 | 13 | 14 | the "cards" folder holds all of the card images 15 | 16 | there is an operating version found in master branch called 'texas_holdem_poker.py' 17 | 18 | download the "cards" folder and make sure it is in the same directory where you launch the 'texas_holdem_poker v0.1.py' file. 19 | 20 | All the other files are modulations of all the objects/functions. This is something I should have done in the first place, but I am still learning. 21 | 22 | 23 | 24 | Discord: https://discord.gg/pFbdWx 25 | helped organized by Muhsin7: https://github.com/muhsin7 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | Some information about how I handled scoring, since it is the most complex part of the code IMO: 38 | 39 | # scores for an individual player will look like: 40 | # [score0, score1, score2, score3, score4, score5, score6, score7] 41 | # a score, like score0, will be an integer 42 | # 43 | # I put all scores from all players in a list 44 | # so we will have a list of lists of integers, representing scores from all players 45 | # 46 | # I take advantage of how the max() function works with lists of integers. 47 | # max() looks at the integer at index 0 when provided with multiple lists. 48 | # if the integers at index 0 are the same number for every list, 49 | # it will then look at and compare the integer at the next index 50 | # 51 | # score0 is used to indicate hand rank 52 | # with 0 being lowest (high card) to 9 as highest (royal flush)... 53 | # ranks found at: https://www.cardplayer.com/rules-of-poker/hand-rankings 54 | # or https://www.cardschat.com/poker-hands.php 55 | # 56 | # score0, score1, and score2 are somewhat like score modifiers, 57 | # score1 will tell us the value of the pair or the three of a kind 58 | # if two pair: score2 will tell us the value of the lowest value pair 59 | # or even the value of the pair when there is a full house 60 | # while score3 to score7 are initially set as the value of the five cards in the hand 61 | # in the order from highest value 12 (ace) to lowest value 0 (two) 62 | # 63 | # for example: if a player has no special hand like pairs or a flush, 64 | # all modifier scores will be 0 65 | # the player will have to rely on their highest card 66 | # which will start at score3. 67 | # if any other player has a pair (score0 = 1) 68 | # the max() function used on a list of lists of integers 69 | # will select the player with a pair... 70 | # if no player has a special hand, then the high card will be the deciding factor 71 | # if more than one player has the same high card 72 | # then the max() function will move on to next index 73 | # and the next highest card will be evaluated 74 | 75 | -------------------------------------------------------------------------------- /cards/Ace of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ace of Clubs.png -------------------------------------------------------------------------------- /cards/Ace of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ace of Diamonds.png -------------------------------------------------------------------------------- /cards/Ace of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ace of Hearts.png -------------------------------------------------------------------------------- /cards/Ace of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ace of Spades.png -------------------------------------------------------------------------------- /cards/Eight of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Eight of Clubs.png -------------------------------------------------------------------------------- /cards/Eight of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Eight of Diamonds.png -------------------------------------------------------------------------------- /cards/Eight of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Eight of Hearts.png -------------------------------------------------------------------------------- /cards/Eight of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Eight of Spades.png -------------------------------------------------------------------------------- /cards/Five of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Five of Clubs.png -------------------------------------------------------------------------------- /cards/Five of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Five of Diamonds.png -------------------------------------------------------------------------------- /cards/Five of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Five of Hearts.png -------------------------------------------------------------------------------- /cards/Five of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Five of Spades.png -------------------------------------------------------------------------------- /cards/Four of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Four of Clubs.png -------------------------------------------------------------------------------- /cards/Four of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Four of Diamonds.png -------------------------------------------------------------------------------- /cards/Four of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Four of Hearts.png -------------------------------------------------------------------------------- /cards/Four of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Four of Spades.png -------------------------------------------------------------------------------- /cards/Jack of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Jack of Clubs.png -------------------------------------------------------------------------------- /cards/Jack of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Jack of Diamonds.png -------------------------------------------------------------------------------- /cards/Jack of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Jack of Hearts.png -------------------------------------------------------------------------------- /cards/Jack of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Jack of Spades.png -------------------------------------------------------------------------------- /cards/King of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/King of Clubs.png -------------------------------------------------------------------------------- /cards/King of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/King of Diamonds.png -------------------------------------------------------------------------------- /cards/King of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/King of Hearts.png -------------------------------------------------------------------------------- /cards/King of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/King of Spades.png -------------------------------------------------------------------------------- /cards/Nine of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Nine of Clubs.png -------------------------------------------------------------------------------- /cards/Nine of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Nine of Diamonds.png -------------------------------------------------------------------------------- /cards/Nine of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Nine of Hearts.png -------------------------------------------------------------------------------- /cards/Nine of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Nine of Spades.png -------------------------------------------------------------------------------- /cards/Queen of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Queen of Clubs.png -------------------------------------------------------------------------------- /cards/Queen of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Queen of Diamonds.png -------------------------------------------------------------------------------- /cards/Queen of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Queen of Hearts.png -------------------------------------------------------------------------------- /cards/Queen of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Queen of Spades.png -------------------------------------------------------------------------------- /cards/Seven of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Seven of Clubs.png -------------------------------------------------------------------------------- /cards/Seven of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Seven of Diamonds.png -------------------------------------------------------------------------------- /cards/Seven of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Seven of Hearts.png -------------------------------------------------------------------------------- /cards/Seven of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Seven of Spades.png -------------------------------------------------------------------------------- /cards/Six of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Six of Clubs.png -------------------------------------------------------------------------------- /cards/Six of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Six of Diamonds.png -------------------------------------------------------------------------------- /cards/Six of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Six of Hearts.png -------------------------------------------------------------------------------- /cards/Six of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Six of Spades.png -------------------------------------------------------------------------------- /cards/Ten of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ten of Clubs.png -------------------------------------------------------------------------------- /cards/Ten of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ten of Diamonds.png -------------------------------------------------------------------------------- /cards/Ten of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ten of Hearts.png -------------------------------------------------------------------------------- /cards/Ten of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Ten of Spades.png -------------------------------------------------------------------------------- /cards/Three of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Three of Clubs.png -------------------------------------------------------------------------------- /cards/Three of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Three of Diamonds.png -------------------------------------------------------------------------------- /cards/Three of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Three of Hearts.png -------------------------------------------------------------------------------- /cards/Three of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Three of Spades.png -------------------------------------------------------------------------------- /cards/Two of Clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Two of Clubs.png -------------------------------------------------------------------------------- /cards/Two of Diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Two of Diamonds.png -------------------------------------------------------------------------------- /cards/Two of Hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Two of Hearts.png -------------------------------------------------------------------------------- /cards/Two of Spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/Two of Spades.png -------------------------------------------------------------------------------- /cards/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/default.png -------------------------------------------------------------------------------- /cards/default0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/default0.png -------------------------------------------------------------------------------- /cards/default1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jeremiah9000/Poker-with-Python/c5e38b568e2cf590e7dd0de0731181726c66c245/cards/default1.png -------------------------------------------------------------------------------- /texas_holdem_poker.py: -------------------------------------------------------------------------------- 1 | import random 2 | import itertools 3 | from collections import Counter 4 | from tkinter import * 5 | from PIL import ImageTk, Image # only non_standard dependency you need to DL 6 | import threading 7 | import queue 8 | import time 9 | 10 | 11 | def main(): 12 | class Card(object): 13 | def __init__(self, value, suit): 14 | self.value = value 15 | self.suit = suit 16 | self.showing = True 17 | 18 | def __repr__(self): 19 | value_name = "" 20 | suit_name = "" 21 | if self.showing: 22 | if self.value == 0: 23 | value_name = "Two" 24 | if self.value == 1: 25 | value_name = "Three" 26 | if self.value == 2: 27 | value_name = "Four" 28 | if self.value == 3: 29 | value_name = "Five" 30 | if self.value == 4: 31 | value_name = "Six" 32 | if self.value == 5: 33 | value_name = "Seven" 34 | if self.value == 6: 35 | value_name = "Eight" 36 | if self.value == 7: 37 | value_name = "Nine" 38 | if self.value == 8: 39 | value_name = "Ten" 40 | if self.value == 9: 41 | value_name = "Jack" 42 | if self.value == 10: 43 | value_name = "Queen" 44 | if self.value == 11: 45 | value_name = "King" 46 | if self.value == 12: 47 | value_name = "Ace" 48 | if self.suit == 0: 49 | suit_name = "Diamonds" 50 | if self.suit == 1: 51 | suit_name = "Clubs" 52 | if self.suit == 2: 53 | suit_name = "Hearts" 54 | if self.suit == 3: 55 | suit_name = "Spades" 56 | return value_name + " of " + suit_name 57 | else: 58 | return "[CARD]" 59 | 60 | class StandardDeck(list): 61 | def __init__(self): 62 | super().__init__() 63 | suits = list(range(4)) 64 | values = list(range(13)) 65 | [[self.append(Card(i, j)) for j in suits] for i in values] 66 | 67 | def __repr__(self): 68 | return f"Standard deck of cards\n{len(self)} cards remaining" 69 | 70 | def shuffle(self): 71 | random.shuffle(self) 72 | print("\n\n--deck shuffled--") 73 | 74 | def deal(self, location, times=1): 75 | for i in range(times): 76 | location.cards.append(self.pop(0)) 77 | 78 | def burn(self): 79 | self.pop(0) 80 | 81 | class Player(object): 82 | def __init__(self, name=None): 83 | self.name = name 84 | self.chips = 0 85 | self.stake = 0 86 | self.stake_gap = 0 87 | self.cards = [] 88 | self.score = [] 89 | self.fold = False 90 | self.ready = False 91 | self.all_in = False 92 | self.list_of_special_attributes = [] 93 | self.win = False 94 | 95 | def __repr__(self): 96 | name = self.name 97 | return name 98 | 99 | class Game(object): 100 | def __init__(self): 101 | self.need_raise_info = False 102 | self.game_over = False 103 | self.acting_player = Player() 104 | self.possible_responses = [] 105 | self.round_counter = 0 106 | self.cards = [] 107 | self.pot = 0 108 | self.pot_dict = {} 109 | self.pot_in_play = 0 110 | self.list_of_player_names = [] 111 | self.dealer = Player() 112 | self.small_blind = Player() 113 | self.big_blind = Player() 114 | self.first_actor = Player() 115 | self.winners = [] 116 | self.deck = StandardDeck() 117 | self.list_of_scores_from_eligible_winners = [] 118 | self.setup = ask_app("Start?") 119 | while True: 120 | try: 121 | self.number_of_players = len(self.setup["players"]) 122 | break 123 | except ValueError: 124 | print("Invalid response") 125 | if 1 < self.number_of_players < 11: 126 | pass 127 | else: 128 | print("Invalid number of players") 129 | main() 130 | self.list_of_players = [Player(name) for name in self.setup["players"] if name != ""] 131 | while True: 132 | try: 133 | self.starting_chips = int(self.setup["chips"][0]) 134 | if self.starting_chips > 0: 135 | break 136 | print("Invalid number, try greater than 0") 137 | except ValueError: 138 | print("Invalid response") 139 | continue 140 | for player in self.list_of_players: 141 | player.chips = self.starting_chips 142 | self.ready_list = [] 143 | while True: 144 | try: 145 | self.small_blind_amount = int(self.setup["chips"][1]) 146 | if self.starting_chips > self.small_blind_amount > 0: 147 | break 148 | print("Invalid number: try bigger than zero, smaller than starting chips") 149 | except ValueError: 150 | print("Invalid response") 151 | continue 152 | while True: 153 | try: 154 | self.big_blind_amount = int(self.setup["chips"][2]) 155 | if self.starting_chips > self.big_blind_amount > self.small_blind_amount: 156 | break 157 | print("Invalid number: try bigger than small blind, smaller than starting chips") 158 | except ValueError: 159 | print("Invalid response") 160 | continue 161 | self.winner = None 162 | self.action_counter = 0 163 | self.attribute_list = ["d", "sb", "bb", "fa"] 164 | self.highest_stake = 0 165 | self.fold_list = [] 166 | self.not_fold_list = [] 167 | self.round_ended = False 168 | self.fold_out = False 169 | self.list_of_scores_eligible = [] 170 | self.list_of_players_not_out = list(set(self.list_of_players)) 171 | self.number_of_player_not_out = int(len(list(set(self.list_of_players)))) 172 | 173 | def print_game_info(self): 174 | pass 175 | 176 | def print_round_info(self): 177 | print("\n") 178 | for player in self.list_of_players: 179 | print("\n") 180 | print(f"Name: {player.name}") 181 | print(f"Cards: {player.cards}") 182 | print(f"Player score: {player.score}") 183 | print(f"Chips: {player.chips}") 184 | print(f"Special Attributes: {player.list_of_special_attributes}") 185 | if player.fold: 186 | print(f"Folded") 187 | if player.all_in: 188 | print(f"All-in") 189 | print(f"Stake: {player.stake}") 190 | print(f"Stake-gap: {player.stake_gap}") 191 | print("\n") 192 | print(f"Pot: {self.pot}") 193 | print(f"Community cards: {self.cards}") 194 | print("\n") 195 | 196 | def establish_player_attributes(self): 197 | address_assignment = 0 198 | self.dealer = self.list_of_players_not_out[address_assignment] 199 | self.dealer.list_of_special_attributes.append("dealer") 200 | address_assignment += 1 201 | address_assignment %= len(self.list_of_players_not_out) 202 | self.small_blind = self.list_of_players_not_out[address_assignment] 203 | self.small_blind.list_of_special_attributes.append("small blind") 204 | address_assignment += 1 205 | address_assignment %= len(self.list_of_players_not_out) 206 | self.big_blind = self.list_of_players_not_out[address_assignment] 207 | self.big_blind.list_of_special_attributes.append("big blind") 208 | address_assignment += 1 209 | address_assignment %= len(self.list_of_players_not_out) 210 | self.first_actor = self.list_of_players_not_out[address_assignment] 211 | self.first_actor.list_of_special_attributes.append("first actor") 212 | self.list_of_players_not_out.append(self.list_of_players_not_out.pop(0)) 213 | 214 | def deal_hole(self): 215 | for player in self.list_of_players_not_out: 216 | self.deck.deal(player, 2) 217 | 218 | def deal_flop(self): 219 | self.deck.burn() 220 | self.deck.deal(self, 3) 221 | 222 | def deal_turn(self): 223 | self.deck.burn() 224 | print("\n--card burned--") 225 | self.deck.deal(self, 1) 226 | print(f"\nCommunity Cards: {self.cards}") 227 | 228 | def deal_river(self): 229 | self.deck.burn() 230 | print("\n--card burned--") 231 | self.deck.deal(self, 1) 232 | print(f"\n\nCommunity Cards: {self.cards}") 233 | 234 | def hand_scorer(self, player): 235 | seven_cards = player.cards + self.cards 236 | all_hand_combos = list(itertools.combinations(seven_cards, 5)) 237 | list_of_all_score_possibilities = [] 238 | for i in all_hand_combos: 239 | suit_list = [] 240 | value_list = [] 241 | for j in i: 242 | suit_list.append(j.suit) 243 | value_list.append(j.value) 244 | initial_value_check = list(reversed(sorted(value_list))) 245 | score1 = 0 246 | score2 = 0 247 | score3 = 0 248 | score4 = initial_value_check.pop(0) 249 | score5 = initial_value_check.pop(0) 250 | score6 = initial_value_check.pop(0) 251 | score7 = initial_value_check.pop(0) 252 | score8 = initial_value_check.pop(0) 253 | list_of_pair_values = [] 254 | other_cards_not_special = [] 255 | pair_present = False 256 | pair_value = int 257 | value_counter = dict(Counter(value_list)) 258 | for value_name, count in value_counter.items(): 259 | if count == 2: 260 | pair_present = True 261 | pair_value = value_name 262 | list_of_pair_values.append(value_name) 263 | if pair_present: 264 | for value in value_list: 265 | if value not in list_of_pair_values: 266 | other_cards_not_special.append(value) 267 | other_cards_not_special = list(reversed(sorted(other_cards_not_special))) 268 | if len(set(list_of_pair_values)) == 1: 269 | score1 = 1 270 | score2 = max(list_of_pair_values) 271 | try: 272 | score3 = other_cards_not_special.pop(0) 273 | score4 = other_cards_not_special.pop(0) 274 | score5 = other_cards_not_special.pop(0) 275 | score6 = other_cards_not_special.pop(0) 276 | score7 = other_cards_not_special.pop(0) 277 | score8 = other_cards_not_special.pop(0) 278 | except IndexError: 279 | pass 280 | if len(set(list_of_pair_values)) == 2: 281 | list_of_pair_values = list(reversed(sorted(list_of_pair_values))) 282 | score1 = 2 283 | score2 = list_of_pair_values.pop(0) 284 | score3 = list_of_pair_values.pop(0) 285 | try: 286 | score4 = other_cards_not_special.pop(0) 287 | score5 = other_cards_not_special.pop(0) 288 | score6 = other_cards_not_special.pop(0) 289 | score7 = other_cards_not_special.pop(0) 290 | score8 = other_cards_not_special.pop(0) 291 | except IndexError: 292 | pass 293 | three_of_a_kind_value = int 294 | other_cards_not_special = [] 295 | three_of_a_kind_present = False 296 | for value_name, count in value_counter.items(): 297 | if count == 3: 298 | three_of_a_kind_present = True 299 | three_of_a_kind_value = value_name 300 | if three_of_a_kind_present: 301 | for value in value_list: 302 | if value != three_of_a_kind_value: 303 | other_cards_not_special.append(value) 304 | other_cards_not_special = list(reversed(sorted(other_cards_not_special))) 305 | score1 = 3 306 | score2 = three_of_a_kind_value 307 | try: 308 | score3 = other_cards_not_special.pop(0) 309 | score4 = other_cards_not_special.pop(0) 310 | score5 = other_cards_not_special.pop(0) 311 | score6 = other_cards_not_special.pop(0) 312 | score7 = other_cards_not_special.pop(0) 313 | score8 = other_cards_not_special.pop(0) 314 | except IndexError: 315 | pass 316 | if sorted(value_list) == list(range(min(value_list), max(value_list) + 1)): 317 | score1 = 4 318 | score2 = max(value_list) 319 | if sorted(value_list) == [0, 1, 2, 3, 12]: 320 | score1 = 4 321 | score2 = 3 322 | if len(set(suit_list)) == 1: 323 | score1 = 5 324 | score2 = max(value_list) 325 | if three_of_a_kind_present and pair_present: 326 | score1 = 6 327 | score2 = three_of_a_kind_value 328 | score3 = pair_value 329 | four_of_a_kind_value = int 330 | other_card_value = int 331 | four_of_a_kind = False 332 | for value_name, count in value_counter.items(): 333 | if count == 4: 334 | four_of_a_kind_value = value_name 335 | four_of_a_kind: True 336 | for value in value_list: 337 | if value != four_of_a_kind_value: 338 | other_card_value = value 339 | if four_of_a_kind: 340 | score1 = 7 341 | score2 = four_of_a_kind_value 342 | score3 = other_card_value 343 | if sorted(value_list) == [0, 1, 2, 3, 12] and len(set(suit_list)) == 1: 344 | score1 = 8 345 | score2 = 3 346 | if sorted(value_list) == list(range(min(value_list), max(value_list) + 1)) and len(set(suit_list)) == 1: 347 | score1 = 8 348 | score2 = max(value_list) 349 | if max(value_list) == 12: 350 | score1 = 9 351 | list_of_all_score_possibilities.append([score1, score2, score3, score4, score5, score6, score7, score8]) 352 | best_score = max(list_of_all_score_possibilities) 353 | player.score = best_score 354 | 355 | def score_all(self): 356 | for player in self.list_of_players_not_out: 357 | self.hand_scorer(player) 358 | 359 | def find_winners(self): 360 | if self.fold_out: 361 | for player in list(set(self.winners)): 362 | player.chips += int((self.pot / len(list(set(self.winners))))) 363 | print(f"{player.name} wins {int((self.pot / len(list(set(self.winners)))))} chips!") 364 | else: 365 | list_of_stakes = [] 366 | for player in self.list_of_players_not_out: 367 | list_of_stakes.append(player.stake) 368 | list_of_stakes = list(set(list_of_stakes)) 369 | list_of_stakes = sorted(list_of_stakes) 370 | for stake in list_of_stakes: 371 | print(stake) 372 | for player in self.list_of_players_not_out: 373 | print(player.name) 374 | print(player.stake) 375 | print(self.list_of_players_not_out) 376 | list_of_players_at_stake = [] 377 | list_of_list_of_players_at_stake = [] 378 | for i in range(len(list_of_stakes)): 379 | for player in self.list_of_players_not_out: 380 | if player.stake >= list_of_stakes[i]: 381 | list_of_players_at_stake.append(player) 382 | list_of_list_of_players_at_stake.append(list(set(list_of_players_at_stake))) 383 | list_of_players_at_stake.clear() 384 | print(list_of_list_of_players_at_stake) 385 | list_of_pot_seeds = [] 386 | for i in list_of_stakes: 387 | list_of_pot_seeds.append(i) 388 | list_of_pot_seeds.reverse() 389 | for i in range(len(list_of_pot_seeds)): 390 | try: 391 | list_of_pot_seeds[i] -= list_of_pot_seeds[i + 1] 392 | except IndexError: 393 | pass 394 | list_of_pot_seeds.reverse() 395 | list_of_pots = [] 396 | for i in range(len(list_of_pot_seeds)): 397 | print(len(list_of_list_of_players_at_stake[i])) 398 | for i in range(len(list_of_pot_seeds)): 399 | list_of_pots.append(list_of_pot_seeds[i] * len(list_of_list_of_players_at_stake[i])) 400 | for i in range(len(list_of_pots)): 401 | winners = [] 402 | self.list_of_scores_eligible.clear() 403 | for player in list_of_list_of_players_at_stake[i]: 404 | if player.fold: 405 | pass 406 | else: 407 | self.list_of_scores_eligible.append(player.score) 408 | max_score = max(self.list_of_scores_eligible) 409 | for player in list_of_list_of_players_at_stake[i]: 410 | if player.fold: 411 | pass 412 | else: 413 | if player.score == max_score: 414 | player.win = True 415 | winners.append(player) 416 | prize = int(list_of_pots[i] / len(winners)) 417 | for player in winners: 418 | print(f"{player.name} wins {prize} chips!") 419 | player.chips += prize 420 | self.pot -= prize 421 | for player in self.list_of_players_not_out: 422 | if player.win: 423 | print( 424 | "\n" + player.name + ": " + str( 425 | player.cards) + "\t<-WINNER WINNER WINNER WINNER WINNER WINNER " 426 | "WINNER WINNER" + "\n\t" + score_interpreter(player)) 427 | elif player.fold: 428 | print("\n" + player.name + ": " + str(player.cards) + "\n\t" + "[FOLDED]") 429 | else: 430 | print("\n" + player.name + ": " + str(player.cards) + "\n\t" + score_interpreter(player)) 431 | print(f"\tScoreCode: {player.score}") 432 | print(f"Pot: {self.pot}") 433 | [print(player.name, player.chips) for player in self.list_of_players_not_out] 434 | 435 | def clear_board(self): 436 | self.possible_responses.clear() 437 | self.cards.clear() 438 | self.deck = StandardDeck() 439 | self.deck.shuffle() 440 | self.pot = 0 441 | self.pot_dict.clear() 442 | self.winners.clear() 443 | self.list_of_scores_from_eligible_winners.clear() 444 | self.action_counter = 0 445 | self.highest_stake = 0 446 | self.fold_list.clear() 447 | self.not_fold_list.clear() 448 | self.fold_out = False 449 | self.list_of_scores_eligible.clear() 450 | self.round_ended = False 451 | for player in self.list_of_players: 452 | player.score.clear() 453 | player.cards.clear() 454 | player.stake = 0 455 | player.stake_gap = 0 456 | player.ready = False 457 | player.all_in = False 458 | player.fold = False 459 | player.list_of_special_attributes.clear() 460 | player.win = False 461 | 462 | def end_round(self): 463 | self.list_of_players_not_out = list(set(self.list_of_players_not_out)) 464 | for player in self.list_of_players_not_out: 465 | if player.chips <= 0: 466 | self.list_of_players_not_out.remove(player) 467 | print(f"{player.name} is out of the game!") 468 | self.number_of_player_not_out = len(set(self.list_of_players_not_out)) 469 | if self.number_of_player_not_out == 1: 470 | self.game_over = True 471 | self.winner = self.list_of_players_not_out[0] 472 | print(f"Game is over: {self.winner} wins with {self.winner.chips}!") 473 | quit() 474 | new_round = str(ask_app("Start a new round? (yes/no)")) 475 | if new_round == "yes": 476 | print("\n\n\t\t\t\t--ROUND OVER--") 477 | print("\n\n\t\t\t--STARTING NEW ROUND--\n") 478 | self.round_counter += 1 479 | pass 480 | else: 481 | quit() 482 | time.sleep(0.3) 483 | self.clear_board() 484 | 485 | def answer(self, player): 486 | player.stake_gap = self.highest_stake - player.stake 487 | if player.all_in or player.fold or self.fold_out: 488 | return True 489 | if player.chips <= 0: 490 | print(f"{player.name} is all in!") 491 | player.all_in = True 492 | print(f"Highest stake: {self.highest_stake}") 493 | print(f"Put in at least {player.stake_gap} to stay in.\nDon't Have that much? You'll have to go all-in!") 494 | print(f"Chips available: {player.chips}") 495 | self.possible_responses.clear() 496 | if player.stake_gap > 0: 497 | self.possible_responses.append("fold") 498 | if player.stake_gap == player.chips: 499 | self.possible_responses.append("all_in_exact") 500 | if player.stake_gap > player.chips: 501 | self.possible_responses.append("all_in_partial") 502 | if player.stake_gap < player.chips: 503 | self.possible_responses.append("call_exact") 504 | self.possible_responses.append("call_and_raise") 505 | self.possible_responses.append("call_and_all_in") 506 | if player.stake_gap == 0: 507 | self.possible_responses.append("check") 508 | self.possible_responses.append("raise") 509 | self.possible_responses.append("fold") 510 | self.possible_responses.append("all_in") 511 | while True: 512 | print(self.possible_responses) 513 | response = str(ask_app(f"{player}'s action\n->", self)) 514 | if response not in self.possible_responses: 515 | print("Invalid response") 516 | continue 517 | if response == "all_in_partial": 518 | player.stake += player.chips 519 | self.pot += player.chips 520 | player.stake_gap -= player.chips 521 | player.chips = 0 522 | print(f"{player.name} is all-in!") 523 | player.all_in = True 524 | return True 525 | if response == "all_in_exact": 526 | print(f"{player.name} is all-in!") 527 | player.all_in = True 528 | player.stake += player.stake_gap 529 | self.pot += player.stake_gap 530 | player.chips = 0 531 | player.stake_gap = 0 532 | return True 533 | if response == "fold": 534 | player.fold = True 535 | self.fold_list.append(player) 536 | if len(self.fold_list) == (len(self.list_of_players_not_out) - 1): 537 | for player in self.list_of_players_not_out: 538 | if player not in self.fold_list: 539 | self.fold_out = True 540 | print(f"{player} wins!") 541 | self.winners.append(player) 542 | for player in self.winners: 543 | player.win = True 544 | self.round_ended = True 545 | return True 546 | if response == "call_exact": 547 | player.stake += player.stake_gap 548 | self.pot += player.stake_gap 549 | player.chips -= player.stake_gap 550 | player.stake_gap = 0 551 | return True 552 | if response == "check": 553 | player.stake_gap = 0 554 | return True 555 | if response == "raise": 556 | self.need_raise_info = True 557 | while True: 558 | bet = int( 559 | ask_app(f"How much would {player.name} like to raise? ({player.chips} available)\n->", 560 | self)) 561 | if bet > player.chips or bet <= 0: 562 | print("Invalid response") 563 | continue 564 | if bet == player.chips: 565 | print(f"{player.name} is all-in!") 566 | player.all_in = True 567 | self.need_raise_info = False 568 | player.stake += bet 569 | self.pot += bet 570 | player.chips -= bet 571 | self.highest_stake = player.stake 572 | self.ready_list.clear() 573 | player.stake_gap = 0 574 | return True 575 | if response == "call_and_raise": 576 | self.need_raise_info = True 577 | player.stake += player.stake_gap 578 | self.pot += player.stake_gap 579 | player.chips -= player.stake_gap 580 | player.stake_gap = 0 581 | while True: 582 | try: 583 | bet = int( 584 | ask_app(f"How much would {player.name} like to raise? ({player.chips} available)\n->", 585 | self)) 586 | except ValueError: 587 | continue 588 | if bet > player.chips or bet <= 0: 589 | print("Invalid response") 590 | continue 591 | if bet == player.chips: 592 | print(f"{player.name} is all-in!") 593 | player.all_in = True 594 | self.need_raise_info = False 595 | player.stake += bet 596 | self.pot += bet 597 | player.chips -= bet 598 | self.highest_stake = player.stake 599 | self.ready_list.clear() 600 | return True 601 | if response == "call_and_all_in": 602 | player.stake += player.stake_gap 603 | self.pot += player.stake_gap 604 | player.chips -= player.stake_gap 605 | player.stake_gap = 0 606 | player.stake += player.chips 607 | self.pot += player.chips 608 | player.stake_gap -= player.chips 609 | player.chips = 0 610 | print(f"{player.name} is all-in!") 611 | player.all_in = True 612 | self.highest_stake = player.stake 613 | self.ready_list.clear() 614 | return True 615 | if response == "all_in": 616 | player.stake_gap = 0 617 | player.stake += player.chips 618 | self.pot += player.chips 619 | player.chips = 0 620 | print(f"{player.name} is all-in!") 621 | player.all_in = True 622 | self.highest_stake = player.stake 623 | self.ready_list.clear() 624 | return True 625 | print("Invalid Response") 626 | 627 | def ask_players(self): 628 | self.ready_list.clear() 629 | starting_index = self.list_of_players_not_out.index(self.first_actor) 630 | for player in self.list_of_players_not_out: 631 | player.ready = False 632 | while True: 633 | self.acting_player = self.list_of_players_not_out[starting_index] 634 | player_ready = self.answer(self.list_of_players_not_out[starting_index]) 635 | starting_index += 1 636 | starting_index %= len(self.list_of_players_not_out) 637 | if player_ready: 638 | self.ready_list.append("gogo") 639 | if len(self.ready_list) == len(self.list_of_players_not_out): 640 | break 641 | 642 | def act_one(self): 643 | if self.small_blind_amount > self.small_blind.chips: 644 | self.small_blind.stake += self.small_blind.chips 645 | self.highest_stake = self.small_blind.chips 646 | self.pot += self.small_blind.chips 647 | self.small_blind.chips = 0 648 | print(f"{self.small_blind.name} is all-in!") 649 | self.small_blind.all_in = True 650 | else: 651 | self.small_blind.chips -= self.small_blind_amount 652 | self.small_blind.stake += self.small_blind_amount 653 | self.highest_stake = self.small_blind_amount 654 | self.pot += self.small_blind_amount 655 | if self.big_blind_amount > self.big_blind.chips: 656 | self.big_blind.stake += self.big_blind.chips 657 | self.highest_stake = self.big_blind.chips 658 | self.pot += self.big_blind.chips 659 | self.big_blind.chips = 0 660 | print(f"{self.big_blind} is all-in!") 661 | self.big_blind.all_in = True 662 | else: 663 | self.big_blind.chips -= self.big_blind_amount 664 | self.big_blind.stake += self.big_blind_amount 665 | self.highest_stake = self.big_blind_amount 666 | self.pot += self.big_blind_amount 667 | self.ask_players() 668 | 669 | class App(Tk): 670 | def __init__(self, *args, **kwargs): 671 | Tk.__init__(self, *args, **kwargs) 672 | self.game_object = object 673 | 674 | container = Frame(self) 675 | container.pack(side="top", fill="both", expand=True) 676 | container.grid_rowconfigure(0, weight=1) 677 | container.grid_columnconfigure(0, weight=1) 678 | 679 | self.frames = {} 680 | 681 | list_of_frames = [StartPage, GamePage] 682 | 683 | for F in list_of_frames: 684 | frame = F(container, self) 685 | self.frames[F] = frame 686 | frame.grid(row=0, column=0, sticky="nsew") 687 | 688 | self.fresh = True 689 | self.show_frame(StartPage) 690 | 691 | def show_frame(self, context): 692 | frame = self.frames[context] 693 | print("waiting") 694 | if not self.fresh: 695 | time.sleep(0.1) 696 | frame.update(game_info_q.get()) 697 | self.fresh = False 698 | frame.tkraise() 699 | 700 | class StartPage(Frame): 701 | def __init__(self, parent, controller): 702 | Frame.__init__(self, parent) 703 | 704 | height = 500 705 | width = 800 706 | canvas = Canvas(self, height=height, width=width, bg="light green") 707 | canvas.pack() 708 | 709 | left_frame = Frame(canvas, bg='green', bd=5) 710 | left_frame.place(relx=0, rely=0, relwidth=0.5, relheight=1, anchor='nw') 711 | name_frame = Frame(left_frame, bg="light green", bd=5) 712 | name_frame.place(relx=0.5, rely=0.17, relwidth=0.9, relheight=0.7, anchor="n") 713 | self.entry_p0 = Entry(name_frame, font=("Courier", 12), bd=3) 714 | self.entry_p0.place(relwidth=0.5, relheight=0.2) 715 | self.entry_p1 = Entry(name_frame, font=("Courier", 12), bd=3) 716 | self.entry_p1.place(relx=0.5, rely=0, relwidth=0.5, relheight=0.2) 717 | self.entry_p2 = Entry(name_frame, font=("Courier", 12), bd=3) 718 | self.entry_p2.place(relx=0, rely=0.2, relwidth=0.5, relheight=0.2) 719 | self.entry_p3 = Entry(name_frame, font=("Courier", 12), bd=3) 720 | self.entry_p3.place(relx=0.5, rely=0.2, relwidth=0.5, relheight=0.2) 721 | self.entry_p4 = Entry(name_frame, font=("Courier", 12), bd=3) 722 | self.entry_p4.place(relx=0, rely=0.4, relwidth=0.5, relheight=0.2) 723 | self.entry_p5 = Entry(name_frame, font=("Courier", 12), bd=3) 724 | self.entry_p5.place(relx=0.5, rely=0.4, relwidth=0.5, relheight=0.2) 725 | self.entry_p6 = Entry(name_frame, font=("Courier", 12), bd=3) 726 | self.entry_p6.place(relx=0, rely=0.6, relwidth=0.5, relheight=0.2) 727 | self.entry_p7 = Entry(name_frame, font=("Courier", 12), bd=3) 728 | self.entry_p7.place(relx=0.5, rely=0.6, relwidth=0.5, relheight=0.2) 729 | self.entry_p8 = Entry(name_frame, font=("Courier", 12), bd=3) 730 | self.entry_p8.place(relx=0, rely=0.8, relwidth=0.5, relheight=0.2) 731 | self.entry_p9 = Entry(name_frame, font=("Courier", 12), bd=3) 732 | self.entry_p9.place(relx=0.5, rely=0.8, relwidth=0.5, relheight=0.2) 733 | enter_player_label = Label(left_frame, text="Player Names:", font=("Courier", 12), bd=3) 734 | enter_player_label.place(relx=0.25, rely=0.07, relwidth=0.5, relheight=0.05) 735 | # self.entry.bind("", lambda _: self.button_click(self.entry.get())) 736 | 737 | right_frame = Frame(canvas, bg='green', bd=5) 738 | right_frame.place(relx=1, rely=0, relwidth=0.5, relheight=1, anchor='ne') 739 | self.sc_label = Label(right_frame, text="Starting Chips:", font=("Courier", 12), bd=3) 740 | self.sc_label.place(relx=0.25, rely=0.1, relwidth=0.5, relheight=0.05) 741 | self.sc_entry = Entry(right_frame, font=("Courier"), bd=3) 742 | self.sc_entry.place(relx=0.5, rely=0.17, relwidth=0.5, relheight=0.07, anchor="n") 743 | 744 | self.sb_label = Label(right_frame, text="Small-Blind Chips:", font=("Courier", 12), bd=3) 745 | self.sb_label.place(relx=0.25, rely=0.33, relwidth=0.5, relheight=0.05) 746 | self.sb_entry = Entry(right_frame, font=("Courier"), bd=3) 747 | self.sb_entry.place(relx=0.5, rely=0.4, relwidth=0.5, relheight=0.07, anchor="n") 748 | 749 | self.bb_label = Label(right_frame, text="Big-Blind Chips:", font=("Courier", 12), bd=3) 750 | self.bb_label.place(relx=0.25, rely=0.56, relwidth=0.5, relheight=0.05) 751 | self.bb_entry = Entry(right_frame, font=("Courier"), bd=3) 752 | self.bb_entry.place(relx=0.5, rely=0.63, relwidth=0.5, relheight=0.07, anchor="n") 753 | self.bb_entry.bind("", lambda _: self.button_click(self.entry_p0.get(), self.entry_p1.get(), 754 | self.entry_p2.get(), self.entry_p3.get(), 755 | self.entry_p4.get(), self.entry_p5.get(), 756 | self.entry_p6.get(), 757 | self.entry_p7.get(), self.entry_p8.get(), 758 | self.entry_p9.get(), self.sc_entry.get(), 759 | self.sb_entry.get(), self.bb_entry.get(), 760 | controller)) 761 | 762 | button = Button(right_frame, text="START", font=("Courier", 12), 763 | command=lambda: self.button_click(self.entry_p0.get(), self.entry_p1.get(), 764 | self.entry_p2.get(), self.entry_p3.get(), 765 | self.entry_p4.get(), self.entry_p5.get(), 766 | self.entry_p6.get(), 767 | self.entry_p7.get(), self.entry_p8.get(), 768 | self.entry_p9.get(), self.sc_entry.get(), 769 | self.sb_entry.get(), self.bb_entry.get(), controller)) 770 | button.place(relx=0.5, rely=0.9, relwidth=0.3, relheight=0.1, anchor="n") 771 | 772 | def button_click(self, entry0, entry1, entry2, entry3, entry4, entry5, entry6, entry7, entry8, entry9, entrysc, 773 | entrysb, entrybb, controller): 774 | entry_list = [entry0, entry1, entry2, entry3, entry4, entry5, entry6, entry7, entry8, entry9, entrysc, 775 | entrysb, entrybb] 776 | player_entry_list = [entry0, entry1, entry2, entry3, entry4, entry5, entry6, entry7, entry8, entry9] 777 | print(player_entry_list) 778 | player_entry_list = list(set(player_entry_list)) 779 | for player in player_entry_list: 780 | if player == "": 781 | player_entry_list.remove(player) 782 | print(player_entry_list) 783 | if len(player_entry_list) < 2: 784 | print("not enough players") 785 | return 786 | chip_entry_list = [entrysc, entrysb, entrybb] 787 | for chips in chip_entry_list: 788 | try: 789 | chips = int(chips) 790 | except ValueError: 791 | print("Value Error") 792 | return 793 | if chips == "" or chips <= 0: 794 | print("chip entry error") 795 | return 796 | if not int(entrysc) > int(entrybb) > int(entrysb): 797 | print("chip entry error2 ") 798 | return 799 | setup = { 800 | "players": player_entry_list, 801 | "chips": chip_entry_list 802 | } 803 | response_q.put(setup) 804 | game_event.set() 805 | controller.show_frame(GamePage) 806 | 807 | class GamePage(Frame): 808 | def __init__(self, parent, controller): 809 | Frame.__init__(self, parent) 810 | 811 | self.restart = False 812 | self.responses = [] 813 | self.list_of_button_r = [] 814 | height = 500 815 | width = 800 816 | canvas = Canvas(self, height=height, width=width, bg="light green") 817 | canvas.pack() 818 | 819 | left_frame = Frame(canvas, bg='green', bd=5) 820 | left_frame.place(relx=0, rely=0, relwidth=0.5, relheight=1, anchor='nw') 821 | name_frame = Frame(left_frame, bg="light green", bd=5) 822 | name_frame.place(relx=0.5, rely=0, relwidth=1, relheight=1, anchor="n") 823 | 824 | self.frame_p0 = Frame(name_frame, bd=3, relief="groove") 825 | self.frame_p0.place(relwidth=0.5, relheight=0.2) 826 | self.name_label_p0 = Label(self.frame_p0, font=("Courier", 10), bd=3) 827 | self.name_label_p0.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 828 | self.chips_label_p0 = Label(self.frame_p0, font=("Courier", 10), bd=3) 829 | self.chips_label_p0.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 830 | self.cards_frame_p0 = Frame(self.frame_p0, bd=3, relief="groove") 831 | self.cards_frame_p0.place(relx=0.38, relheight=1, relwidth=0.62) 832 | self.card1_p0 = Label(self.cards_frame_p0) 833 | self.card1_p0.place(relwidth=0.5, relheight=1) 834 | self.card2_p0 = Label(self.cards_frame_p0) 835 | self.card2_p0.place(relx=0.5, relwidth=0.5, relheight=1) 836 | self.stake_label_p0 = Label(self.frame_p0, bd=1, relief="groove") 837 | self.stake_label_p0.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 838 | 839 | self.frame_p1 = Frame(name_frame, bd=3, relief="groove") 840 | self.frame_p1.place(relx=0.5, rely=0, relwidth=0.5, relheight=0.2) 841 | self.name_label_p1 = Label(self.frame_p1, font=("Courier", 10), bd=3) 842 | self.name_label_p1.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 843 | self.chips_label_p1 = Label(self.frame_p1, font=("Courier", 10), bd=3) 844 | self.chips_label_p1.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 845 | self.cards_frame_p1 = Frame(self.frame_p1, bd=3, relief="groove") 846 | self.cards_frame_p1.place(relx=0.38, relheight=1, relwidth=0.62) 847 | self.card1_p1 = Label(self.cards_frame_p1) 848 | self.card1_p1.place(relwidth=0.5, relheight=1) 849 | self.card2_p1 = Label(self.cards_frame_p1) 850 | self.card2_p1.place(relx=0.5, relwidth=0.5, relheight=1) 851 | self.stake_label_p1 = Label(self.frame_p1, bd=1, relief="groove") 852 | self.stake_label_p1.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 853 | 854 | self.frame_p2 = Frame(name_frame, bd=3, relief="groove") 855 | self.frame_p2.place(relx=0, rely=0.2, relwidth=0.5, relheight=0.2) 856 | self.name_label_p2 = Label(self.frame_p2, font=("Courier", 10), bd=3) 857 | self.name_label_p2.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 858 | self.chips_label_p2 = Label(self.frame_p2, font=("Courier", 10), bd=3) 859 | self.chips_label_p2.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 860 | self.cards_frame_p2 = Frame(self.frame_p2, bd=3, relief="groove") 861 | self.cards_frame_p2.place(relx=0.38, relheight=1, relwidth=0.62) 862 | self.card1_p2 = Label(self.cards_frame_p2) 863 | self.card1_p2.place(relwidth=0.5, relheight=1) 864 | self.card2_p2 = Label(self.cards_frame_p2) 865 | self.card2_p2.place(relx=0.5, relwidth=0.5, relheight=1) 866 | self.stake_label_p2 = Label(self.frame_p2, bd=1, relief="groove") 867 | self.stake_label_p2.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 868 | 869 | self.frame_p3 = Frame(name_frame, bd=3, relief="groove") 870 | self.frame_p3.place(relx=0.5, rely=0.2, relwidth=0.5, relheight=0.2) 871 | self.name_label_p3 = Label(self.frame_p3, font=("Courier", 10), bd=3) 872 | self.name_label_p3.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 873 | self.chips_label_p3 = Label(self.frame_p3, font=("Courier", 10), bd=3) 874 | self.chips_label_p3.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 875 | self.cards_frame_p3 = Frame(self.frame_p3, bd=3, relief="groove") 876 | self.cards_frame_p3.place(relx=0.38, relheight=1, relwidth=0.62) 877 | self.card1_p3 = Label(self.cards_frame_p3) 878 | self.card1_p3.place(relwidth=0.5, relheight=1) 879 | self.card2_p3 = Label(self.cards_frame_p3) 880 | self.card2_p3.place(relx=0.5, relwidth=0.5, relheight=1) 881 | self.stake_label_p3 = Label(self.frame_p3, bd=1, relief="groove") 882 | self.stake_label_p3.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 883 | 884 | self.frame_p4 = Frame(name_frame, bd=3, relief="groove") 885 | self.frame_p4.place(relx=0, rely=0.4, relwidth=0.5, relheight=0.2) 886 | self.name_label_p4 = Label(self.frame_p4, font=("Courier", 10), bd=3) 887 | self.name_label_p4.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 888 | self.chips_label_p4 = Label(self.frame_p4, font=("Courier", 10), bd=3) 889 | self.chips_label_p4.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 890 | self.cards_frame_p4 = Frame(self.frame_p4, bd=3, relief="groove") 891 | self.cards_frame_p4.place(relx=0.38, relheight=1, relwidth=0.62) 892 | self.card1_p4 = Label(self.cards_frame_p4) 893 | self.card1_p4.place(relwidth=0.5, relheight=1) 894 | self.card2_p4 = Label(self.cards_frame_p4) 895 | self.card2_p4.place(relx=0.5, relwidth=0.5, relheight=1) 896 | self.stake_label_p4 = Label(self.frame_p4, bd=1, relief="groove") 897 | self.stake_label_p4.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 898 | 899 | self.frame_p5 = Frame(name_frame, bd=3, relief="groove") 900 | self.frame_p5.place(relx=0.5, rely=0.4, relwidth=0.5, relheight=0.2) 901 | self.name_label_p5 = Label(self.frame_p5, font=("Courier", 10), bd=3) 902 | self.name_label_p5.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 903 | self.chips_label_p5 = Label(self.frame_p5, font=("Courier", 10), bd=3) 904 | self.chips_label_p5.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 905 | self.cards_frame_p5 = Frame(self.frame_p5, bd=3, relief="groove") 906 | self.cards_frame_p5.place(relx=0.38, relheight=1, relwidth=0.62) 907 | self.card1_p5 = Label(self.cards_frame_p5) 908 | self.card1_p5.place(relwidth=0.5, relheight=1) 909 | self.card2_p5 = Label(self.cards_frame_p5) 910 | self.card2_p5.place(relx=0.5, relwidth=0.5, relheight=1) 911 | self.stake_label_p5 = Label(self.frame_p5, bd=1, relief="groove") 912 | self.stake_label_p5.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 913 | 914 | self.frame_p6 = Frame(name_frame, bd=3, relief="groove") 915 | self.frame_p6.place(relx=0, rely=0.6, relwidth=0.5, relheight=0.2) 916 | self.name_label_p6 = Label(self.frame_p6, font=("Courier", 10), bd=3) 917 | self.name_label_p6.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 918 | self.chips_label_p6 = Label(self.frame_p6, font=("Courier", 10), bd=3) 919 | self.chips_label_p6.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 920 | self.cards_frame_p6 = Frame(self.frame_p6, bd=3, relief="groove") 921 | self.cards_frame_p6.place(relx=0.38, relheight=1, relwidth=0.62) 922 | self.card1_p6 = Label(self.cards_frame_p6) 923 | self.card1_p6.place(relwidth=0.5, relheight=1) 924 | self.card2_p6 = Label(self.cards_frame_p6) 925 | self.card2_p6.place(relx=0.5, relwidth=0.5, relheight=1) 926 | self.stake_label_p6 = Label(self.frame_p6, bd=1, relief="groove") 927 | self.stake_label_p6.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 928 | 929 | self.frame_p7 = Frame(name_frame, bd=3, relief="groove") 930 | self.frame_p7.place(relx=0.5, rely=0.6, relwidth=0.5, relheight=0.2) 931 | self.name_label_p7 = Label(self.frame_p7, font=("Courier", 10), bd=3) 932 | self.name_label_p7.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 933 | self.chips_label_p7 = Label(self.frame_p7, font=("Courier", 10), bd=3) 934 | self.chips_label_p7.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 935 | self.cards_frame_p7 = Frame(self.frame_p7, bd=3, relief="groove") 936 | self.cards_frame_p7.place(relx=0.38, relheight=1, relwidth=0.62) 937 | self.card1_p7 = Label(self.cards_frame_p7) 938 | self.card1_p7.place(relwidth=0.5, relheight=1) 939 | self.card2_p7 = Label(self.cards_frame_p7) 940 | self.card2_p7.place(relx=0.5, relwidth=0.5, relheight=1) 941 | self.stake_label_p7 = Label(self.frame_p7, bd=1, relief="groove") 942 | self.stake_label_p7.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 943 | 944 | self.frame_p8 = Frame(name_frame, bd=3, relief="groove") 945 | self.frame_p8.place(relx=0, rely=0.8, relwidth=0.5, relheight=0.2) 946 | self.name_label_p8 = Label(self.frame_p8, font=("Courier", 10), bd=3) 947 | self.name_label_p8.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 948 | self.chips_label_p8 = Label(self.frame_p8, font=("Courier", 10), bd=3) 949 | self.chips_label_p8.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 950 | self.cards_frame_p8 = Frame(self.frame_p8, bd=3, relief="groove") 951 | self.cards_frame_p8.place(relx=0.38, relheight=1, relwidth=0.62) 952 | self.card1_p8 = Label(self.cards_frame_p8) 953 | self.card1_p8.place(relwidth=0.5, relheight=1) 954 | self.card2_p8 = Label(self.cards_frame_p8) 955 | self.card2_p8.place(relx=0.5, relwidth=0.5, relheight=1) 956 | self.stake_label_p8 = Label(self.frame_p8, bd=1, relief="groove") 957 | self.stake_label_p8.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 958 | 959 | self.frame_p9 = Frame(name_frame, bd=3, relief="groove") 960 | self.frame_p9.place(relx=0.5, rely=0.8, relwidth=0.5, relheight=0.2) 961 | self.name_label_p9 = Label(self.frame_p9, font=("Courier", 10), bd=3) 962 | self.name_label_p9.place(relx=0, rely=0, relheight=(1 / 3), relwidth=0.38) 963 | self.chips_label_p9 = Label(self.frame_p9, font=("Courier", 10), bd=3) 964 | self.chips_label_p9.place(relx=0, rely=(1 / 3), relheight=(1 / 3), relwidth=0.38) 965 | self.cards_frame_p9 = Frame(self.frame_p9, bd=3, relief="groove") 966 | self.cards_frame_p9.place(relx=0.38, relheight=1, relwidth=0.62) 967 | self.card1_p9 = Label(self.cards_frame_p9) 968 | self.card1_p9.place(relwidth=0.5, relheight=1) 969 | self.card2_p9 = Label(self.cards_frame_p9) 970 | self.card2_p9.place(relx=0.5, relwidth=0.5, relheight=1) 971 | self.stake_label_p9 = Label(self.frame_p9, bd=1, relief="groove") 972 | self.stake_label_p9.place(relx=0, rely=(2 / 3), relheight=(1 / 3), relwidth=0.38) 973 | 974 | # self.entry.bind("", lambda _: self.button_click(self.entry.get())) 975 | 976 | right_frame = Frame(canvas, bg='green', bd=5) 977 | right_frame.place(relx=1, rely=0, relwidth=0.5, relheight=1, anchor='ne') 978 | 979 | self.cc_frame = Frame(right_frame, bd=2, relief="raised") 980 | self.cc_frame.place(relx=0, rely=0, relwidth=1, relheight=0.2) 981 | 982 | self.cc_1 = Label(self.cc_frame, bg="green") 983 | self.cc_1.place(relwidth=(.50 / 3), relheight=1) 984 | card_d1 = ImageTk.PhotoImage( 985 | Image.open("cards\default0.png").resize((55, 85), Image.ANTIALIAS)) 986 | self.cc_1.image = card_d1 987 | self.cc_1.configure(image=card_d1) 988 | 989 | self.cc_2 = Label(self.cc_frame, bg="green") 990 | self.cc_2.place(relx=(.50 / 3), relwidth=(.50 / 3), relheight=1) 991 | card_d2 = ImageTk.PhotoImage( 992 | Image.open("cards\default1.png").resize((55, 85), Image.ANTIALIAS)) 993 | self.cc_2.image = card_d2 994 | self.cc_2.configure(image=card_d2) 995 | 996 | self.cc_3 = Label(self.cc_frame, bg="green") 997 | self.cc_3.place(relx=(.50 / 3) * 2, relwidth=(.50 / 3), relheight=1) 998 | card_d3 = ImageTk.PhotoImage( 999 | Image.open("cards\default1.png").resize((55, 85), Image.ANTIALIAS)) 1000 | self.cc_3.image = card_d3 1001 | self.cc_3.configure(image=card_d3) 1002 | 1003 | self.cc_4 = Label(self.cc_frame, bg="green") 1004 | self.cc_4.place(relx=(.50 / 3) * 3, relwidth=0.25, relheight=1) 1005 | card_d4 = ImageTk.PhotoImage( 1006 | Image.open("cards\default1.png").resize((55, 85), Image.ANTIALIAS)) 1007 | self.cc_4.image = card_d4 1008 | self.cc_4.configure(image=card_d4) 1009 | 1010 | self.cc_5 = Label(self.cc_frame, bg="green") 1011 | self.cc_5.place(relx=((.50 / 3) * 3) + 0.25, relwidth=0.25, relheight=1) 1012 | card_d5 = ImageTk.PhotoImage( 1013 | Image.open("cards\default1.png").resize((55, 85), Image.ANTIALIAS)) 1014 | self.cc_5.image = card_d5 1015 | self.cc_5.configure(image=card_d5) 1016 | 1017 | self.pot_label = Label(right_frame, text="pot: ", font=("Courier", 12), bd=3) 1018 | self.pot_label.place(relx=0, rely=0.2, relwidth=0.5, relheight=0.04) 1019 | 1020 | # self.dealer_label = Label(right_frame, text="dealer: ", font=("Courier", 12), bd=3) 1021 | # self.dealer_label.place(relx=0, rely=0.28, relwidth=0.5, relheight=0.04) 1022 | 1023 | # self.sb_label = Label(right_frame, text="small-blind: ", font=("Courier", 12), bd=3) 1024 | # self.sb_label.place(relx=0, rely=0.33, relwidth=0.5, relheight=0.04) 1025 | 1026 | # self.bb_label = Label(right_frame, text="big-blind: ", font=("Courier", 12), bd=3) 1027 | # self.bb_label.place(relx=0, rely=0.38, relwidth=0.5, relheight=0.04) 1028 | 1029 | self.action_frame = Frame(right_frame, bd=2, relief="raised", bg="green") 1030 | self.action_frame.place(rely=0.5, relwidth=1, relheight=0.5) 1031 | self.action_cover_label = Label(self.action_frame, bg="light green") 1032 | self.action_cover_label.place(relx=0, rely=0, relheight=1, relwidth=1) 1033 | 1034 | self.actor_label = Label(self.action_frame, text="Actor: ", font=("Courier", 12), bd=3) 1035 | self.actor_label.place(relwidth=1, relheight=0.06) 1036 | 1037 | self.new_round_label = Label(self.action_frame, text="New Round?", font=("Courier", 9), bd=3) 1038 | self.new_round_label.place(relx=0.8, rely=0.05, relheight=0.1, relwidth=0.2) 1039 | self.button_y = Button(self.action_frame, text="Yes", command=lambda: self.action_input("yes")) 1040 | self.button_y.place(relx=0.8, rely=0.15, relheight=0.1, relwidth=0.2) 1041 | self.button_n = Button(self.action_frame, text="No", command=lambda: self.action_input("no")) 1042 | self.button_n.place(relx=0.8, rely=0.25, relheight=0.1, relwidth=0.2) 1043 | 1044 | self.raise_entry = Entry(self.action_frame, font=("Courier", 9), bd=3) 1045 | self.raise_entry.place(relx=0, rely=1, relheight=0.12, relwidth=0.22, anchor="sw") 1046 | self.raise_button = Button(self.action_frame, text="RAISE", font=("Courier", 9), bd=3, command=lambda: self.action_input(self.raise_entry.get())) 1047 | self.raise_button.place(relx=0.22, rely=1, relheight=0.12, relwidth=0.22, anchor="sw") 1048 | 1049 | self.winner_label = Label(self.action_frame, font=("Courier", 12), bd=3) 1050 | self.winner_label.place(relx=0, rely=(1/3), relwidth=0.75, relheight=0.3) 1051 | 1052 | 1053 | 1054 | def update(self, game): 1055 | self.new_round_label.lower(self.action_cover_label) 1056 | self.button_y.lower(self.action_cover_label) 1057 | self.button_n.lower(self.action_cover_label) 1058 | self.raise_entry.lower(self.action_cover_label) 1059 | self.raise_button.lower(self.action_cover_label) 1060 | self.winner_label.lower(self.action_cover_label) 1061 | if self.restart: 1062 | card1 = ImageTk.PhotoImage(Image.open(str("cards\default0.png")).resize((55, 85), Image.ANTIALIAS)) 1063 | self.cc_1.image = card1 1064 | self.cc_1.configure(image=card1) 1065 | 1066 | card1 = ImageTk.PhotoImage(Image.open(str("cards\default0.png")).resize((55, 85), Image.ANTIALIAS)) 1067 | self.cc_2.image = card1 1068 | self.cc_2.configure(image=card1) 1069 | 1070 | card1 = ImageTk.PhotoImage(Image.open(str("cards\default0.png")).resize((55, 85), Image.ANTIALIAS)) 1071 | self.cc_3.image = card1 1072 | self.cc_3.configure(image=card1) 1073 | 1074 | card1 = ImageTk.PhotoImage(Image.open(str("cards\default0.png")).resize((55, 85), Image.ANTIALIAS)) 1075 | self.cc_4.image = card1 1076 | self.cc_4.configure(image=card1) 1077 | 1078 | card1 = ImageTk.PhotoImage(Image.open(str("cards\default0.png")).resize((55, 85), Image.ANTIALIAS)) 1079 | self.cc_5.image = card1 1080 | self.cc_5.configure(image=card1) 1081 | self.restart = False 1082 | if game.round_ended: 1083 | time.sleep(0.3) 1084 | self.new_round_label.lift(self.action_cover_label) 1085 | self.button_y.lift(self.action_cover_label) 1086 | self.button_n.lift(self.action_cover_label) 1087 | winners = [] 1088 | scores = [] 1089 | for player in game.list_of_players_not_out: 1090 | if player.win: 1091 | winners.append(player) 1092 | scores.append(player.score) 1093 | print(f"gui thinks winners are: {winners}") 1094 | print(f"and thinks scores are: {scores}") 1095 | if scores == [[]]: 1096 | self.winner_label["text"] = "Winner: " + str(winners) 1097 | else: 1098 | try: 1099 | for player in game.list_of_players_not_out: 1100 | if player.win: 1101 | if player.score == max(scores): 1102 | self.winner_label["text"] = "Winner: " + str(winners) + "\n" + score_interpreter(player) 1103 | except IndexError: 1104 | pass 1105 | self.winner_label.lift(self.action_cover_label) 1106 | 1107 | self.restart = True 1108 | 1109 | return 1110 | if game.need_raise_info: 1111 | self.raise_entry.lift(self.action_cover_label) 1112 | self.raise_button.lift(self.action_cover_label) 1113 | try: 1114 | card1 = ImageTk.PhotoImage( 1115 | Image.open("cards\\" + str(game.cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1116 | self.cc_1.image = card1 1117 | self.cc_1.configure(image=card1) 1118 | 1119 | card1 = ImageTk.PhotoImage( 1120 | Image.open("cards\\" + str(game.cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1121 | self.cc_2.image = card1 1122 | self.cc_2.configure(image=card1) 1123 | 1124 | card1 = ImageTk.PhotoImage( 1125 | Image.open("cards\\" + str(game.cards[2]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1126 | self.cc_3.image = card1 1127 | self.cc_3.configure(image=card1) 1128 | 1129 | card1 = ImageTk.PhotoImage( 1130 | Image.open("cards\\" + str(game.cards[3]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1131 | self.cc_4.image = card1 1132 | self.cc_4.configure(image=card1) 1133 | 1134 | card1 = ImageTk.PhotoImage( 1135 | Image.open("cards\\" + str(game.cards[4]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1136 | self.cc_5.image = card1 1137 | self.cc_5.configure(image=card1) 1138 | except IndexError: 1139 | pass 1140 | try: 1141 | self.name_label_p0["text"] = game.list_of_players[0] 1142 | self.name_label_p1["text"] = game.list_of_players[1] 1143 | self.name_label_p2["text"] = game.list_of_players[2] 1144 | self.name_label_p3["text"] = game.list_of_players[3] 1145 | self.name_label_p4["text"] = game.list_of_players[4] 1146 | self.name_label_p5["text"] = game.list_of_players[5] 1147 | self.name_label_p6["text"] = game.list_of_players[6] 1148 | self.name_label_p7["text"] = game.list_of_players[7] 1149 | self.name_label_p8["text"] = game.list_of_players[8] 1150 | self.name_label_p9["text"] = game.list_of_players[9] 1151 | except IndexError: 1152 | pass 1153 | try: 1154 | self.chips_label_p0["text"] = "Chips:\n" + str(game.list_of_players[0].chips) 1155 | self.chips_label_p1["text"] = "Chips:\n" + str(game.list_of_players[1].chips) 1156 | self.chips_label_p2["text"] = "Chips:\n" + str(game.list_of_players[2].chips) 1157 | self.chips_label_p3["text"] = "Chips:\n" + str(game.list_of_players[3].chips) 1158 | self.chips_label_p4["text"] = "Chips:\n" + str(game.list_of_players[4].chips) 1159 | self.chips_label_p5["text"] = "Chips:\n" + str(game.list_of_players[5].chips) 1160 | self.chips_label_p6["text"] = "Chips:\n" + str(game.list_of_players[6].chips) 1161 | self.chips_label_p7["text"] = "Chips:\n" + str(game.list_of_players[7].chips) 1162 | self.chips_label_p8["text"] = "Chips:\n" + str(game.list_of_players[8].chips) 1163 | self.chips_label_p9["text"] = "Chips:\n" + str(game.list_of_players[9].chips) 1164 | except IndexError: 1165 | pass 1166 | try: 1167 | card1 = ImageTk.PhotoImage( 1168 | Image.open("cards\\" + str(game.list_of_players[0].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1169 | self.card1_p0.image = card1 1170 | self.card1_p0.configure(image=card1) 1171 | 1172 | card1 = ImageTk.PhotoImage( 1173 | Image.open("cards\\" + str(game.list_of_players[1].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1174 | self.card1_p1.image = card1 1175 | self.card1_p1.configure(image=card1) 1176 | 1177 | card1 = ImageTk.PhotoImage( 1178 | Image.open("cards\\" + str(game.list_of_players[2].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1179 | self.card1_p2.image = card1 1180 | self.card1_p2.configure(image=card1) 1181 | 1182 | card1 = ImageTk.PhotoImage( 1183 | Image.open("cards\\" + str(game.list_of_players[3].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1184 | self.card1_p3.image = card1 1185 | self.card1_p3.configure(image=card1) 1186 | 1187 | card1 = ImageTk.PhotoImage( 1188 | Image.open("cards\\" + str(game.list_of_players[4].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1189 | self.card1_p4.image = card1 1190 | self.card1_p4.configure(image=card1) 1191 | 1192 | card1 = ImageTk.PhotoImage( 1193 | Image.open("cards\\" + str(game.list_of_players[5].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1194 | self.card1_p5.image = card1 1195 | self.card1_p5.configure(image=card1) 1196 | 1197 | card1 = ImageTk.PhotoImage( 1198 | Image.open("cards\\" + str(game.list_of_players[6].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1199 | self.card1_p6.image = card1 1200 | self.card1_p6.configure(image=card1) 1201 | 1202 | card1 = ImageTk.PhotoImage( 1203 | Image.open("cards\\" + str(game.list_of_players[7].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1204 | self.card1_p7.image = card1 1205 | self.card1_p7.configure(image=card1) 1206 | 1207 | card1 = ImageTk.PhotoImage( 1208 | Image.open("cards\\" + str(game.list_of_players[8].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1209 | self.card1_p8.image = card1 1210 | self.card1_p8.configure(image=card1) 1211 | 1212 | card1 = ImageTk.PhotoImage( 1213 | Image.open("cards\\" + str(game.list_of_players[9].cards[0]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1214 | self.card1_p9.image = card1 1215 | self.card1_p9.configure(image=card1) 1216 | except IndexError: 1217 | pass 1218 | try: 1219 | card2 = ImageTk.PhotoImage( 1220 | Image.open("cards\\" + str(game.list_of_players[0].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1221 | self.card2_p0.image = card2 1222 | self.card2_p0.configure(image=card2) 1223 | 1224 | card2 = ImageTk.PhotoImage( 1225 | Image.open("cards\\" + str(game.list_of_players[1].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1226 | self.card2_p1.image = card2 1227 | self.card2_p1.configure(image=card2) 1228 | 1229 | card2 = ImageTk.PhotoImage( 1230 | Image.open("cards\\" + str(game.list_of_players[2].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1231 | self.card2_p2.image = card2 1232 | self.card2_p2.configure(image=card2) 1233 | 1234 | card2 = ImageTk.PhotoImage( 1235 | Image.open("cards\\" + str(game.list_of_players[3].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1236 | self.card2_p3.image = card2 1237 | self.card2_p3.configure(image=card2) 1238 | 1239 | card2 = ImageTk.PhotoImage( 1240 | Image.open("cards\\" + str(game.list_of_players[4].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1241 | self.card2_p4.image = card2 1242 | self.card2_p4.configure(image=card2) 1243 | 1244 | card2 = ImageTk.PhotoImage( 1245 | Image.open("cards\\" + str(game.list_of_players[5].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1246 | self.card2_p5.image = card2 1247 | self.card2_p5.configure(image=card2) 1248 | 1249 | card2 = ImageTk.PhotoImage( 1250 | Image.open("cards\\" + str(game.list_of_players[6].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1251 | self.card2_p6.image = card2 1252 | self.card2_p6.configure(image=card2) 1253 | 1254 | card2 = ImageTk.PhotoImage( 1255 | Image.open("cards\\" + str(game.list_of_players[7].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1256 | self.card2_p7.image = card2 1257 | self.card2_p7.configure(image=card2) 1258 | 1259 | card2 = ImageTk.PhotoImage( 1260 | Image.open("cards\\" + str(game.list_of_players[8].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1261 | self.card2_p8.image = card2 1262 | self.card2_p8.configure(image=card2) 1263 | 1264 | card2 = ImageTk.PhotoImage( 1265 | Image.open("cards\\" + str(game.list_of_players[9].cards[1]) + ".png").resize((55, 85), Image.ANTIALIAS)) 1266 | self.card2_p9.image = card2 1267 | self.card2_p9.configure(image=card2) 1268 | except IndexError: 1269 | pass 1270 | try: 1271 | self.stake_label_p0["text"] = "Stake: " + str(game.list_of_players[0].stake) 1272 | self.stake_label_p1["text"] = "Stake: " + str(game.list_of_players[1].stake) 1273 | self.stake_label_p2["text"] = "Stake: " + str(game.list_of_players[2].stake) 1274 | self.stake_label_p3["text"] = "Stake: " + str(game.list_of_players[3].stake) 1275 | self.stake_label_p4["text"] = "Stake: " + str(game.list_of_players[4].stake) 1276 | self.stake_label_p5["text"] = "Stake: " + str(game.list_of_players[5].stake) 1277 | self.stake_label_p6["text"] = "Stake: " + str(game.list_of_players[6].stake) 1278 | self.stake_label_p7["text"] = "Stake: " + str(game.list_of_players[7].stake) 1279 | self.stake_label_p8["text"] = "Stake: " + str(game.list_of_players[8].stake) 1280 | self.stake_label_p9["text"] = "Stake: " + str(game.list_of_players[9].stake) 1281 | except IndexError: 1282 | pass 1283 | self.pot_label["text"] = "Pot: " + str(game.pot) 1284 | if game.game_over: 1285 | self.actor_label["text"] = "Winner!: " + str(game.winner.name) 1286 | return 1287 | print(f"round ended {game.round_ended}") 1288 | 1289 | self.actor_label["text"] = str(game.acting_player.name) 1290 | 1291 | variable = StringVar(self.action_frame) 1292 | variable.initialize("ACTION") 1293 | w = OptionMenu(self.action_frame, variable, *game.possible_responses) 1294 | w.place(relx=0, rely=0.05, relheight=0.1, relwidth=0.3) 1295 | button_go = Button(self.action_frame, text="GO", font=("Courier", 10), command=lambda: self.action_input(variable.get())) 1296 | button_go.place(relx=1, rely=1, relheight=0.3, relwidth=0.3, anchor="se") 1297 | 1298 | 1299 | def action_input(self, entry0): 1300 | 1301 | response_q.put(entry0) 1302 | game_event.set() 1303 | time.sleep(0.1) 1304 | if not game_info_q.empty(): 1305 | self.update(game_info_q.get()) 1306 | 1307 | def score_interpreter(player): 1308 | list_of_hand_types = ["High Card", "One Pair", "Two Pair", "Three of a Kind", "Straight", "Flush", 1309 | "Full House", 1310 | "Four of a Kind", "Straight Flush", "Royal Flush"] 1311 | list_of_values_to_interpret = ["Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", 1312 | "Jack", 1313 | "Queen", 1314 | "King", "Ace"] 1315 | hand_type = list_of_hand_types[player.score[0]] 1316 | mod1 = list_of_values_to_interpret[player.score[1]] 1317 | mod2 = list_of_values_to_interpret[player.score[2]] 1318 | mod3 = list_of_values_to_interpret[player.score[3]] 1319 | if player.score[0] == 0: 1320 | return hand_type + ": " + mod3 1321 | if player.score[0] == 1: 1322 | return hand_type + ": " + mod1 + "s" 1323 | if player.score[0] == 2: 1324 | return hand_type + ": " + mod1 + "s" + " and " + mod2 + "s" 1325 | if player.score[0] == 3: 1326 | return hand_type + ": " + mod1 + "s" 1327 | if player.score[0] == 4: 1328 | return hand_type + ": " + mod1 + " High" 1329 | if player.score[0] == 5: 1330 | return hand_type + ": " + mod1 + " High" 1331 | if player.score[0] == 6: 1332 | return hand_type + ": " + mod1 + "s" + " and " + mod2 + "s" 1333 | if player.score[0] == 7: 1334 | return hand_type + ": " + mod1 + "s" 1335 | if player.score[0] == 8: 1336 | return hand_type + ": " + mod1 + " High" 1337 | if player.score[0] == 9: 1338 | return hand_type 1339 | 1340 | def ask_app(question, game=""): 1341 | print("asking...") 1342 | print(question) 1343 | answer = "" 1344 | if game != "": 1345 | game_info_q.put(game) 1346 | game_event.wait() 1347 | if not response_q.empty(): 1348 | answer = response_q.get() 1349 | game_event.clear() 1350 | 1351 | return answer 1352 | 1353 | def update_gui(game1): 1354 | print("updating gui...") 1355 | print(game1) 1356 | 1357 | def play(game): 1358 | game.deck.shuffle() 1359 | game_info_q.put(game) 1360 | update_gui(game) 1361 | game.establish_player_attributes() 1362 | game.deal_hole() 1363 | game.print_round_info() 1364 | game.act_one() 1365 | game.print_round_info() 1366 | if not game.round_ended: 1367 | game.deal_flop() 1368 | game.print_round_info() 1369 | if not game.round_ended: 1370 | game.ask_players() 1371 | game.print_round_info() 1372 | if not game.round_ended: 1373 | game.deal_turn() 1374 | game.print_round_info() 1375 | if not game.round_ended: 1376 | game.ask_players() 1377 | game.print_round_info() 1378 | if not game.round_ended: 1379 | game.deal_river() 1380 | game.print_round_info() 1381 | if not game.round_ended: 1382 | game.ask_players() 1383 | game.print_round_info() 1384 | if not game.round_ended: 1385 | game.score_all() 1386 | game.print_round_info() 1387 | game.find_winners() 1388 | game_info_q.put(game) 1389 | 1390 | game.print_round_info() 1391 | game.round_ended = True 1392 | print(game.winners, game.winner, [player for player in game.list_of_players_not_out if player.win]) 1393 | game.end_round() 1394 | 1395 | def run_app(): 1396 | app = App() 1397 | app.mainloop() 1398 | 1399 | def run_game_data(): 1400 | game0 = Game() 1401 | while True: 1402 | play(game0) 1403 | 1404 | game_event = threading.Event() 1405 | response_q = queue.Queue() 1406 | game_info_q = queue.Queue() 1407 | end_update = threading.Event() 1408 | t1 = threading.Thread(target=run_app) 1409 | t1.start() 1410 | t2 = threading.Thread(target=run_game_data()) 1411 | t2.start() 1412 | 1413 | 1414 | if __name__ == "__main__": 1415 | main() 1416 | --------------------------------------------------------------------------------