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()
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags
Download my project scripts
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags
Download my project scripts