Sunday, 8 April 2018

Python - import challenge - blackjack game - Day 23


  • if we directly import the module it will execute w/o users control..ie it will execute immediately after the import statement which is not intended..
  • here few changes are made to run the module from other code..ie by importing it and calling the functionality whenever needed
  • we can make use of the __name__ to do this

  •   
    #this is extension of blackjack game to include the new game button and shuffle button
    
    import tkinter as tkinter
    import random
    
    try:
        import tkinter
    except ImportError:  # python 2
        import Tkinter as tkinter
    def load_images(card_images):
        suits=['heart','club','diamond','spade']
        face_cards=['jack','queen','king']
    
        if tkinter.TkVersion >= 8.6:
            extension = 'png'
        else:
            extension = 'ppm'
        #for each suit retrieve the image for the cards
        for suit in suits:
            #first the number cards 1 to 10
            for card in range(1,11):
                name = 'cards/{}_{}.{}'.format(str(card),suit,'png')
                image = tkinter.PhotoImage(file = name)
                card_images.append((card,image))
            #next the Face Cards
            for card in face_cards:
                name = 'cards/{}_{}.{}'.format(str(card),suit,'png')
                image = tkinter.PhotoImage(file = name)
                card_images.append((10,image))
    
    def deal_card(frame):
        #pop the next card of the top of the deck
        next_card= deck.pop(0)
        #if the player keeps on playing new game then all the cards will be used so
        deck.append(next_card)
        #add the image to the label and display the label
        tkinter.Label(frame,image=next_card[1],relief = 'raised').pack(side = 'left')
        #now return the cards face value
        return next_card
    
    
    def score_hand(hand):
        # Calculate the total score of all cards in the list.
        # Only one ace can have the value 11, and this will be reduce to 1 if the hand would bust.
        score = 0
        ace = False
        for next_card in hand:
            card_value = next_card[0]
            if card_value == 1 and not ace:
                ace = True
                card_value = 11
            # score += card_value
            score = score + card_value
            # if we would bust, check if there is an ace and subtract 10
            if score > 21 and ace:
                # score -= 10
                score = score - 10
                ace = False
        return score
    
    def deal_dealer():
        dealer_score= score_hand(dealer_hand)
        while 0 < dealer_score <17:
            dealer_hand.append(deal_card(dealer_card_frame))
            dealer_score= score_hand(dealer_hand)
            dealer_score_label.set(dealer_score)
    
        player_score = score_hand(player_hand)
        if player_score>21:
            resulttext.set('Dealer Wins!')
        elif dealer_score > 21 or dealer_score player_score:
            resulttext.set('Dealer Wins!')
        else:
            resulttext.set('Draw!')
    
        # player_score_label.set(player_score)
        # if player_score>21:
        #     resulttext.set ('Dealer Wins')
    
    
    # def deal_player():
    #     deal_card(player_card_frame)
    
    def deal_player():
        player_hand.append(deal_card(player_card_frame))
        player_score= score_hand(player_hand)
    
        player_score_label.set(player_score)
        if player_score>21:
            resulttext.set ('Dealer Wins')
        # global player_score
        # global player_ace
        # card_value = deal_card(player_card_frame)[0]
        # if card_value ==1 and not player_ace:
        #     player_ace = True
        #     card_value = 11
        # player_score = player_score + card_value
        # # if we would bust,check if there is an ace and subtract
        # if player_score>21 and player_ace:
        #     player_score = player_score - 10
        #     player_ace = False
        # player_score_label.set(player_score)
        # if player_score>21:
        #     resulttext.set("Dealer Wins")
        # print(locals())
    
    def new_game():
        global dealer_card_frame
        global player_card_frame
        global dealer_hand
        global player_hand
        # embedded frame to hold the card images
        dealer_card_frame.destroy()
        dealer_card_frame = tkinter.Frame(card_frame, background='green')
        dealer_card_frame.grid(row=0, column=1, sticky='ew', rowspan=2)
        # embedded frame to hold the card images
        player_card_frame.destroy()
        player_card_frame = tkinter.Frame(card_frame, background="green")
        player_card_frame.grid(row=2, column=1, sticky='ew', rowspan=2)
    
        resulttext.set("")
    
        # Create the list to store the dealer's and player's hands
        dealer_hand = []
        player_hand = []
    
        deal_player()
        dealer_hand.append(deal_card(dealer_card_frame))
        dealer_score_label.set(score_hand(dealer_hand))
        deal_player()
    
    def shuffle():
        random.shuffle(deck)
    
    
    
    def play():
        deal_player()
        dealer_hand.append(deal_card(dealer_card_frame))
        dealer_score_label.set(score_hand(dealer_hand))
        deal_player()
        mainwindow.mainloop()
    
    
    mainwindow = tkinter.Tk()
    #setup the screens and frame for the dealer and the player
    mainwindow.title("blackjack")
    mainwindow.geometry("640x480")
    mainwindow.configure(background = "green")
    
    resulttext = tkinter.StringVar()
    result = tkinter.Label(mainwindow,textvariable = resulttext)
    result.grid(row=0,column=0,columnspan=3)
    
    card_frame= tkinter.Frame(mainwindow,relief = 'sunken',borderwidth = 1,background = 'green')
    card_frame.grid(row=1,column=0,sticky = 'ew',columnspan = 3,rowspan=2)
    
    dealer_score_label = tkinter.IntVar()
    tkinter.Label(card_frame,text = 'Dealer',background ='green',fg='white').grid(row=0,column=0)
    tkinter.Label(card_frame,textvariable = dealer_score_label,background ='green',fg='white').grid(row=1,column=0)
    
    #embedded Frame hold the card images
    dealer_card_frame=tkinter.Frame(card_frame,background = 'green')
    dealer_card_frame.grid(row=0,column=1,sticky='ew',rowspan=2)
    
    
    player_score_label = tkinter.IntVar()
    tkinter.Label(card_frame,text = 'Player',background ='green',fg='white').grid(row=2,column=0)
    tkinter.Label(card_frame,textvariable = player_score_label,background ='green',fg='white').grid(row=3,column=0)
    #embedded Frame hold the card images
    player_card_frame=tkinter.Frame(card_frame,background = 'green')
    player_card_frame.grid(row=2,column=1,sticky='ew',rowspan=2)
    
    button_frame = tkinter.Frame(mainwindow)
    button_frame.grid(row=3,column=0,columnspan = 3,sticky = 'w')
    
    dealer_button=tkinter.Button(button_frame,text = 'Dealer',command = deal_dealer)
    dealer_button.grid(row=0,column=0)
    
    player_button=tkinter.Button(button_frame,text = 'Player',command = deal_player)
    player_button.grid(row=0,column=1)
    
    new_game_button=tkinter.Button(button_frame,text = 'New Game',command = new_game)
    new_game_button.grid(row=0,column=2)
    
    shuffle_button = tkinter.Button(button_frame, text="Shuffle", command=shuffle)
    shuffle_button.grid(row=0, column=3)
    
    #load cards
    cards = []
    load_images(cards)
    # print(cards)
    # print(id(cards))
    #create a new deck of cards and shuffle them
    deck = list(cards) + list(cards) + list(cards)
    shuffle()
    
    # Create the list to store the dealer's and player's hands
    dealer_hand = []
    player_hand = []
    
    if __name__ == '__main__':
        play()
    
    
     
    
  • we can import by using the code like below one
  •   
    import blackjacktest1
    print (__name__)
    blackjacktest1.play()
     
    

    No comments:

    Post a Comment