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
#2
I've tried to run your app, as I've also built a Blackjack game and wanted to see how your code and game compared. I can't run your app, because of this error:

Error:
_tkinter.TclError: character U+1f0b1 is above the range (U+0000-U+FFFF) allowed by Tcl
It throws this at line 103:

Output:
line 103, in __init__ label['text'] = f'BlackJack {Card(1, Card.Hearts).image} {Card(11,Card.Spades).image}'
Sig:
>>> import this

The UNIX philosophy: "Do one thing, and do it well."

"The danger of computers becoming like humans is not as great as the danger of humans becoming like computers." :~ Konrad Zuse

"Everything should be made as simple as possible, but not simpler." :~ Albert Einstein
Reply
#3
It works on mine. I'm using ubuntu system. Not tried on a windows if that what you using.

This is what I have now. Can't seem to get the ace to do correct. If the total with ace as 11 if below 21 and 1 if the total would be above 21.

import random as rnd
import tkinter as tk

class CheckCards:
    def winner(self, player, dealer):
        if player > 21:
            msg = 'Player Busted!'
        elif dealer > 21:
            msg = 'Dealer Busted!'
        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
        print(val)
        return val


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', cursor='hand2')
        self.deal_btn.grid(column=0, row=0, sticky='new', padx=(2,1))

        self.hit_btn = tk.Button(btn_container, text='Hit Me', cursor='hand2')
        self.hit_btn.grid(column=1, row=0, sticky='new', padx=1)

        self.call_btn = tk.Button(btn_container, text='Call', cursor='hand2')
        self.call_btn.grid(column=2, row=0, sticky='new', padx=(1,2))

        self.msg_label = tk.Label(container, anchor='nw', padx=8)
        self.msg_label['font'] = (None, 12, 'normal')
        self.msg_label['relief'] = 'ridge'
        self.msg_label['fg'] = 'steelblue'
        self.msg_label.grid(column=0 ,row=3, sticky='new', padx=5, pady=5)


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]
        self.player_total = self.check.get_hand(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)


        if self.player_total > 21:
            self.view.msg_label['text'] = f'You Busted! You have a total of {self.player_total}'
            self.view.deal_btn['state'] = 'normal'
            self.view.hit_btn['state'] = 'disabled'
            self.view.call_btn['state'] = 'disabled'


    def call(self):
        self.view.deal_btn['state'] = 'normal'
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['state'] = 'disabled'
        while self.dealer_total < 17:
            self.dealer.append(*self.deck.deal(1))
            self.dealer_total = self.check.get_hand(self.dealer)
            self.dealer_cards = [card[0] for card in self.dealer]
            for i, card in enumerate(self.dealer_cards):
                label = tk.Label(self.view.dealer_card_frame)
                label['text'] = card
                label['font'] = (None, 20, 'bold')
                label.grid(column=i, row=1, sticky='news', padx=2, pady=2)
        self.deck = Deck(True)



        self.view.msg_label['text'] = self.check.winner(self.player_total, self.dealer_total)

    def deal(self):
        self.deck = Deck(True)
        self.view.msg_label['text'] = ''

        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.dealer_card_frame.destroy()
        self.view.dealer_card_frame = tk.Frame(self.view.player_container)
        self.view.dealer_card_frame.grid(column=1, row=1, 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)
        self.dealer = self.deck.deal(2)
        self.player_cards = [card[0] for card in self.player]
        self.dealer_cards = [card[0] for card in self.dealer]

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)

        for i, card in enumerate(self.dealer_cards):
            label = tk.Label(self.view.dealer_card_frame)
            label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=1, sticky='news', padx=2, pady=2)

        self.player_total = self.check.get_hand(self.player)
        self.dealer_total = self.check.get_hand(self.dealer)



if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('800x300+300+300')
    Controller(Deck(True), CheckCards(), View(root))
    root.mainloop()


Here an example

Output:
Output:
20 12 14 24
The first ace should have drooped to a value of 1 (well any ace that would cause it to me more than 21)
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#4
(Sep-06-2022, 05:15 PM)menator01 Wrote: Not tried on a windows if that what you using.

No. I'm running a Linux Mint OS

Not a worry; I just thought you may want to know that your code may not be compatible with all systems.
Sig:
>>> import this

The UNIX philosophy: "Do one thing, and do it well."

"The danger of computers becoming like humans is not as great as the danger of humans becoming like computers." :~ Konrad Zuse

"Everything should be made as simple as possible, but not simpler." :~ Albert Einstein
Reply
#5
(Sep-06-2022, 05:15 PM)menator01 Wrote: Can't seem to get the ace to do correct.

Yes, that was a tricky one to solve for me, also.

What I did was to have a function that assigns a value of eleven to a Ace card (in fact it assigns values to any card), then, when checking the 'hand', I take a note of how many Ace cards are held, and if the total hand is greater than 21, reduce the hand value by 10 for each Ace card held. Of course, there needs to be some code that only does that in order to try and beat the hand of the other player.

Not sure of that makes any sense to you: it's always clear to the person that's doing the explaining.
menator01 likes this post
Sig:
>>> import this

The UNIX philosophy: "Do one thing, and do it well."

"The danger of computers becoming like humans is not as great as the danger of humans becoming like computers." :~ Konrad Zuse

"Everything should be made as simple as possible, but not simpler." :~ Albert Einstein
Reply
#6
This seems to work. Now I need to hide one of the dealers card and re-do the messaging.

This seems to work. Still a few bugs though.



import random as rnd
import tkinter as tk

class CheckCards:
    def winner(self, player, dealer):
        if player > 21:
            msg = 'Player Busted!'
        elif dealer > 21:
            msg = 'Dealer Busted!'
        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
                item = list(card)
                item[1] = 11
                card = tuple(item)
                if val + card[1] > 21:
                    val += 1
                else:
                    val += card[1]
        return val


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', cursor='hand2')
        self.deal_btn.grid(column=0, row=0, sticky='new', padx=(2,1))

        self.hit_btn = tk.Button(btn_container, text='Hit Me', cursor='hand2')
        self.hit_btn.grid(column=1, row=0, sticky='new', padx=1)

        self.call_btn = tk.Button(btn_container, text='Call', cursor='hand2')
        self.call_btn.grid(column=2, row=0, sticky='new', padx=(1,2))

        self.msg_label = tk.Label(container, anchor='nw', padx=8)
        self.msg_label['font'] = (None, 12, 'normal')
        self.msg_label['relief'] = 'ridge'
        self.msg_label['fg'] = 'steelblue'
        self.msg_label.grid(column=0 ,row=3, sticky='new', padx=5, pady=5)


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]
        self.player_total = self.check.get_hand(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)


        if self.player_total > 21:
            self.view.deal_btn['state'] = 'normal'
            self.view.hit_btn['state'] = 'disabled'
            self.view.call_btn['state'] = 'disabled'
            self.view.msg_label['text'] = f'You Busted! You have a total of {self.player_total}'
        else:
            self.view.msg_label['text'] = f'Player has: {self.player_total}'


    def call(self):
        self.view.deal_btn['state'] = 'normal'
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['state'] = 'disabled'
        while self.dealer_total < 17:
            self.dealer.append(*self.deck.deal(1))
            self.dealer_total = self.check.get_hand(self.dealer)
            self.dealer_cards = [card[0] for card in self.dealer]
            
            for i, card in enumerate(self.dealer_cards):
                label = tk.Label(self.view.dealer_card_frame)
                label['text'] = card
                label['font'] = (None, 20, 'bold')
                label.grid(column=i, row=1, sticky='news', padx=2, pady=2)

        self.deck = Deck(True)
        self.view.msg_label['text'] = self.check.winner(self.player_total, self.dealer_total)

    def deal(self):
        self.deck = Deck(True)
        self.view.msg_label['text'] = ''

        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.dealer_card_frame.destroy()
        self.view.dealer_card_frame = tk.Frame(self.view.player_container)
        self.view.dealer_card_frame.grid(column=1, row=1, 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)
        self.dealer = self.deck.deal(2)
        self.player_cards = [card[0] for card in self.player]
        self.dealer_cards = [card[0] for card in self.dealer]

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)

        for i, card in enumerate(self.dealer_cards):
            label = tk.Label(self.view.dealer_card_frame)
            if i == 0:
                label['text'] = chr(0x1f0a0)
            else:
                label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=1, sticky='news', padx=2, pady=2)

        self.player_total = self.check.get_hand(self.player)
        self.dealer_total = self.check.get_hand(self.dealer)
        self.view.msg_label['text'] = f'Player has: {self.player_total}'



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
#7
What is the purpose of the CheckCards class? Neither of the methods on it rely on anything in the class, so both could be free functions. Not everything needs to be in a class in Python and if you want to group related things, you can put them in the same module or package.
Reply
#8
No real purpose. Just the way I wrote it. I usually rewrite code several times before I'm happy with it.
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Blackjack (21) with Python BlazingWarlord 0 2,294 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