Python Forum
BlackJack with tkinter
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
BlackJack with tkinter
#1
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

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


Reply


Messages In This Thread
BlackJack with tkinter - by menator01 - Sep-05-2022, 05:06 AM
RE: BlackJack with tkinter - by rob101 - Sep-06-2022, 01:14 PM
RE: BlackJack with tkinter - by menator01 - Sep-06-2022, 05:15 PM
RE: BlackJack with tkinter - by rob101 - Sep-06-2022, 05:29 PM
RE: BlackJack with tkinter - by rob101 - Sep-06-2022, 06:01 PM
RE: BlackJack with tkinter - by menator01 - Sep-06-2022, 07:01 PM
RE: BlackJack with tkinter - by ndc85430 - Sep-11-2022, 08:07 AM
RE: BlackJack with tkinter - by menator01 - Sep-11-2022, 08:37 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Blackjack (21) with Python BlazingWarlord 0 2,335 May-29-2021, 05:07 AM
Last Post: BlazingWarlord

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020