Sep-05-2022, 05:06 AM
This is my go at BlackJack. It's far from finished and I will rewrite and clean the code up when everything is working.
Just wanted to share the current project.
I took some code snippets and smushed them together and added tkinter frame work. I feel I should give credit where credit is due and list the references. At some point I will optimize and cleanup the code adding my own style.
The Card class:
https://slott56.github.io/building-skill..._shoe.html
The Deck class:
from deanhystad
https://python-forum.io/thread-35860-pos...#pid151315
The check_hand function:
https://pythonalgos.com/level-1-python-blackjack/
I did not see a rumble in the video widget so, I posted the link. Hope that's ok.
Video Link:
https://rumble.com/v1ipib0-tkinter-pytho...kjack.html
Just wanted to share the current project.
I took some code snippets and smushed them together and added tkinter frame work. I feel I should give credit where credit is due and list the references. At some point I will optimize and cleanup the code adding my own style.
The Card class:
https://slott56.github.io/building-skill..._shoe.html
The Deck class:
from deanhystad
https://python-forum.io/thread-35860-pos...#pid151315
The check_hand function:
https://pythonalgos.com/level-1-python-blackjack/
I did not see a rumble in the video widget so, I posted the link. Hope that's ok.
Video Link:
https://rumble.com/v1ipib0-tkinter-pytho...kjack.html
import random as rnd from dataclasses import dataclass import tkinter as tk class CheckCards: def winner(self, player, dealer): if player > 21: msg = 'Player Busted! Dealer Wins' elif dealer > 21 and player < 21: msg = 'Dealer Busted! Player Wins' elif player > dealer: msg = 'Player Wins!' elif dealer > player: msg = 'Dealer Wins!' else: msg = 'Tie Game' return msg def get_hand(self, hand): val = 0 for card in hand: if card[1] in Card.face_cards.keys(): val += 10 else: val += card[1] if card[0] in [chr(0x1F0A1), chr(0x1F0B1), chr(0x1F0C1), chr(0x1F0D1)]: val -= 1 if val + 11 > 21: val +=1 else: val += 11 return val # @dataclass class Card: Clubs = u'\N{BLACK CLUB SUIT}' Diamonds = u'\N{BLACK DIAMOND SUIT}' Hearts = u'\N{BLACK HEART SUIT}' Spades = u'\N{BLACK SPADE SUIT}' Jack = 11 Queen = 12 King = 13 Ace = 1 Card_back = chr(0x1f0a0) face_cards = { 11: 'Jack', 12: 'Queen', 13: 'King', } def __init__(self, rank: int, suit: str) -> None: assert suit in (Card.Clubs, Card.Diamonds, Card.Hearts, Card.Spades) assert 1 <= rank < 14 self.rank = rank self.suit = suit self.order = rank @property def image(self) -> str: suit = { Card.Spades: 0x1F0A0, Card.Hearts: 0x1F0B0, Card.Diamonds: 0x1F0C0, Card.Clubs: 0x1F0D0, }[self.suit] rank = self.rank if self.rank < 12 else self.rank + 1 return chr(suit+rank) class Deck(Card): def __init__(self, shuffle=False): suits = [Card.Clubs, Card.Spades, Card.Hearts, Card.Diamonds] self.cards = [(Card(i, suit).image,i) for i in range(1, 14) for suit in suits] if shuffle: rnd.shuffle(self.cards) def __len__(self): return len(self.cards) def deal(self, count): cards = self.cards[:count] self.cards = self.cards[count:] return cards class View: def __init__(self, parent): parent.columnconfigure(0, weight=1) parent.rowconfigure(0, weight=1) container = tk.Frame(parent) container.grid(column=0, row=0, sticky='news') container.grid_columnconfigure(0, weight=3) self.player_container = tk.Frame(container, height=50) self.player_container['borderwidth'] = 0 self.player_container['highlightcolor'] = 'black' self.player_container['highlightbackground'] = 'black' self.player_container['highlightthickness'] = 1 self.player_container.grid(column=0, row=1, sticky='news', padx=5, pady=5) label = tk.Label(container, pady=12, relief='ridge') label['text'] = f'BlackJack {Card(1, Card.Hearts).image} {Card(11,Card.Spades).image}' label['font'] = (None, 25, 'bold') label['bg'] = 'antiquewhite' label.grid(column=0, row=0, sticky='new', padx=5, pady=5) player = tk.Label(self.player_container, text='Player', bg='lightsteelblue', pady=5) player['font'] = (None, 16, 'bold') player.grid(column=0, row=0, sticky='new', pady=5, ipadx=100) dealer = tk.Label(self.player_container, text='Dealer', bg='gray', pady=5) dealer['font'] = (None, 16, 'bold') dealer.grid(column=0, row=1, sticky='new', pady=5, ipadx=100) self.player_card_frame = tk.Frame(self.player_container) self.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5) self.dealer_card_frame = tk.Frame(self.player_container) self.dealer_card_frame.grid(column=1, row=1, sticky='new', padx=5, pady=5) btn_container = tk.Frame(container) btn_container.grid(column=0, row=2, sticky='new', padx=5, pady=5) for i in range(3): btn_container.grid_columnconfigure(i, weight=3, uniform='button') self.deal_btn = tk.Button(btn_container, text='Deal') self.deal_btn.grid(column=0, row=0, sticky='new', padx=(2,1)) self.hit_btn = tk.Button(btn_container, text='Hit Me') self.hit_btn.grid(column=1, row=0, sticky='new', padx=1) self.call_btn = tk.Button(btn_container, text='Call') self.call_btn.grid(column=2, row=0, sticky='new', padx=(1,2)) class Controller: def __init__(self, deck, check, view): self.deck = deck self.check = check self.view = view # Buttons self.view.deal_btn['command'] = self.deal self.view.hit_btn['command'] = self.hitme self.view.hit_btn['state'] = 'disabled' self.view.call_btn['command'] = self.call self.view.call_btn['state'] = 'disabled' def hitme(self): self.player.append(*self.deck.deal(1)) self.player_cards = [card[0] for card in self.player] for i, card in enumerate(self.player_cards): label = tk.Label(self.view.player_card_frame) label['text'] = card label['font'] = (None, 18, 'bold') label.grid(column=i, row=0, sticky='news', padx=2, pady=2) def call(self): self.view.deal_btn['state'] = 'normal' self.view.hit_btn['state'] = 'disabled' self.view.call_btn['state'] = 'disabled' def deal(self): self.view.player_card_frame.destroy() self.view.player_card_frame = tk.Frame(self.view.player_container) self.view.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5) self.view.deal_btn['state'] = 'disabled' self.view.hit_btn['state'] = 'normal' self.view.call_btn['state'] = 'normal' self.player = self.deck.deal(2) dealer = self.deck.deal(2) self.player_cards = [card[0] for card in self.player] dealer_cards = [card[0] for card in dealer] for i, card in enumerate(self.player_cards): label = tk.Label(self.view.player_card_frame) label['text'] = card label['font'] = (None, 18, 'bold') label.grid(column=i, row=0, sticky='news', padx=2, pady=2) for i, card in enumerate(dealer_cards): label = tk.Label(self.view.dealer_card_frame) label['text'] = card label['font'] = (None, 18, 'bold') label.grid(column=i, row=1, sticky='news', padx=2, pady=2) if __name__ == '__main__': root = tk.Tk() root.geometry('800x300+300+300') Controller(Deck(True), CheckCards(), View(root)) root.mainloop()