Programming Forums
User Name Password Register
 

RSS Feed
FORUM INDEX | TODAY'S POSTS | UNANSWERED THREADS | ADVANCED SEARCH

Reply
 
Thread Tools Display Modes
Old Feb 19th, 2006, 4:44 AM   #1
UnKnown X
Hobbyist Programmer
 
UnKnown X's Avatar
 
Join Date: Dec 2005
Location: Sandvika, Norway
Posts: 114
Rep Power: 0 UnKnown X is an unknown quantity at this point
Send a message via MSN to UnKnown X
[Python] BlackJack

A BlackJack game!

Possibly my biggest script/programme yet. Not particularly big, but I'm not particularly good either ...

# # # # # # # # # # # # # # # #
# BlackJack game by UnKnown X #
# # # # # # # # # # # # # # # #


import random, time

player_mode, dealer_mode = "normal", "normal"
player_cards, dealer_cards = [], []
deck = []


def confirm(message):
    """Confirm message
    
    Display a message, get yes/no answer from Player.
    Return 1 for yes, 0 for no."""

    print str(message) + "\n"
    while True:
        try:
            answer = raw_input("> ")
        except ValueError:
            print "ValueError exception encountered! Try again."
            continue
        if answer.lower() != "yes" and answer.lower() != "y" and answer.lower() != "no" and answer.lower() != "n":
            print "Invalid answer! Try again."
            continue
        break
    if answer.lower() == "yes" or answer.lower() == "y":
        answer = 1
    else:
        answer = 0
    return answer


def deal_cards(player_dealer, show_hide):
    """Deal cards

    Call with two strings.
    First is "player" or "dealer" for dealing cards to the Player or Dealer respectively.
    Second is "show" or "hide" to have the card's information visible or not.
    Function takes a random card and removes it from the deck,
    adding it to the Player's or Dealer's hand in a list in the format TCS,
    where T is a one-letter representation of the card type, C of the card
    and S for whether or not to show the card ("S" or "H")."""

    while True:
        if deck[0] == [] and deck[1] == [] and deck[2] == [] and deck[3] == []:
            return None
        card_type_num = random.randrange(4)
        card_num = random.randrange(len(deck[card_type_num]))
        card_type = ['Spades', 'Hearts', 'Diamonds', 'Clubs'][card_type_num]
        card = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'][card_num]
        try:
            deck[card_type_num].remove(card)
        except ValueError:
            continue
        card_identifier = str(['Spades', 'Hearts', 'Diamonds', 'Clubs'][card_type_num])[0]
        card_identifier += str(['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'][card_num])[0]
        card_identifier += show_hide[0]
        if player_dealer == "player":
            global player_cards
            player_cards.append(card_identifier)
        elif player_dealer == "dealer":
            global dealer_cards
            dealer_cards.append(card_identifier)
        return [card_type, card, show_hide]


def get_string(message):
    """Get string from Player

    Print message to Player, ask for and return input."""

    print str(message) + "\n"
    while True:
        try:
            the_string = raw_input("> ")
        except ValueError:
            print "ValueError exception encountered! Try again."
            continue
        if the_string == "":
            print "Error! Empty string! Try again."
            continue
        break
    return the_string


def get_wager(message, money):
    """Get wager from Player

    Get and return floating point number from Player."""
    
    print message + "\n"
    while True:
        try:
            wager_try = raw_input("> ")
            wager = float(wager_try)
        except ValueError:
            print "'%s' is not a number! Try again." % wager_try
            continue
        if wager < 0.01 or wager > float(money):
            print "Error! Cannot have %.2f as wager! Try again." % wager
            continue
        break
    return float("%.2f" % wager)


def intro():
    """Intro

    Print an intro."""

    print "* "*30 + "*"
    print "* BlackJack game by UnKnown X (demiblob@gmail.com) (C) 2006 *"
    print "* "*30 + "*\n\n"
    return


def move_choose_dealer():
    """Choose Dealer's move

    "Hit" or "Stand", depending on Dealer's score."""
    
    if score_dealer() < 17:
        return "Hit"
    else:
        return "Stand"


def move_choose_player(start_round):
    """Choose Player's move

    Show available moves for Player, return input when valid."""

    while True:
        if start_round == True:
            print "Available moves: Hit, Stand, Double"
        else:
            print "Available moves: Hit, Stand"
        player_move = get_string("Choose your move.").capitalize()
        if start_round == True:
            if player_move != "S" and player_move != "Stand" and player_move != "H" and player_move != "Hit" and player_move != "D" and player_move != "Double":
                print "Error: Invalid move '%s'! Try again." % player_move
                continue
        else:
            if player_move != "S" and player_move != "Stand" and player_move != "H" and player_move != "Hit":
                print "Error: Invalid move '%s'! Try again." % player_move
        if player_move == "S" or player_move == "Stand":
            return "Stand"
        elif player_move == "H" or player_move == "Hit":
            return "Hit"
        elif player_move == "D" or player_move == "Double":
            return "Double"
        else:
            print "Error: '%s' is not a valid move! Try again." % player_move
            continue


def print_cards(player_name, hide):
    """Print cards

    Print all the cards. See function 'deal_cards' for more info about the cards."""

    print "\n\nDealer's Hand\n"
    dealer_print = ""
    for item in dealer_cards:
        card_type = item[0]
        card = item[1]
        show_hide = item[2]
        if show_hide == "h" and hide == True:
            dealer_print += "*hidden*   "
        else:
            if card == "2":
                dealer_print += "2"
            elif card == "3":
                dealer_print += "3"
            elif card == "4":
                dealer_print += "4"
            elif card == "5":
                dealer_print += "5"
            elif card == "6":
                dealer_print += "6"
            elif card == "7":
                dealer_print += "7"
            elif card == "8":
                dealer_print += "8"
            elif card == "9":
                dealer_print += "9"
            elif card == "1":
                dealer_print += "10"
            elif card == "J":
                dealer_print += "Jack"
            elif card == "Q":
                dealer_print += "Queen"
            elif card == "K":
                dealer_print += "King"
            elif card == "A":
                dealer_print += "Ace"
            dealer_print += " of "
            if card_type == "S":
                dealer_print += "Spades"
            elif card_type == "H":
                dealer_print += "Hearts"
            elif card_type == "D":
                dealer_print += "Diamonds"
            elif card_type == "C":
                dealer_print += "Clubs"
            dealer_print += "   "
    print dealer_print
    if show_hide == "h" and hide == True:
        print "Score: Hidden"
    else:
        print "Score:", score_dealer()
    if player_name[len(player_name)-1].lower() == "s" or player_name[len(player_name)-1].lower() == "x":
        apostrophe = "'"
    else:
        apostrophe = "'s"
    print "\n\n%s%s Hand\n" % (player_name, apostrophe)
    player_print = ""
    for item in player_cards:
        card_type = item[0]
        card = item[1]
        if card == "2":
            player_print += "2"
        elif card == "3":
            player_print += "3"
        elif card == "4":
            player_print += "4"
        elif card == "5":
            player_print += "5"
        elif card == "6":
            player_print += "6"
        elif card == "7":
            player_print += "7"
        elif card == "8":
            player_print += "8"
        elif card == "9":
            player_print += "9"
        elif card == "1":
            player_print += "10"
        elif card == "J":
            player_print += "Jack"
        elif card == "Q":
            player_print += "Queen"
        elif card == "K":
            player_print += "King"
        elif card == "A":
            player_print += "Ace"
        player_print += " of "
        if card_type == "S":
            player_print += "Spades"
        elif card_type == "H":
            player_print += "Hearts"
        elif card_type == "D":
            player_print += "Diamonds"
        elif card_type == "C":
            player_print += "Clubs"
        player_print += "   "
    print player_print
    print "Score:", score_player()
    print "\n\n"
    return


def restock_deck():
    """Restock deck

    Re-initialize the deck, which is a list containing four lists of thirteen strings."""

    spades = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    hearts = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    diamonds = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    clubs = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    global deck
    deck = [spades,hearts,diamonds,clubs]
    return deck


def score_dealer():
    """Dealer's score

    Get and return Dealer's score."""
    
    global dealer_cards
    score = 0
    for item in dealer_cards:
        if item[1] == "2":
            score += 2
        elif item[1] == "3":
            score += 3
        elif item[1] == "4":
            score += 4
        elif item[1] == "5":
            score += 5
        elif item[1] == "6":
            score += 6
        elif item[1] == "7":
            score += 7
        elif item[1] == "8":
            score += 8
        elif item[1] == "9":
            score += 9
        elif item[1] == "1":
            score += 10
        elif item[1] == "J":
            score += 2
        elif item[1] == "Q":
            score += 3
        elif item[1] == "K":
            score += 4
        elif item[1] == "A":
            if score + 11 > 21:
                score += 1
            else:
                score += 11
    return score


def score_player():
    """Player's score

    Get and return Player's score."""

    global player_cards
    score = 0
    for item in player_cards:
        if item[1] == "2":
            score += 2
        elif item[1] == "3":
            score += 3
        elif item[1] == "4":
            score += 4
        elif item[1] == "5":
            score += 5
        elif item[1] == "6":
            score += 6
        elif item[1] == "7":
            score += 7
        elif item[1] == "8":
            score += 8
        elif item[1] == "9":
            score += 9
        elif item[1] == "1":
            score += 10
        elif item[1] == "J":
            score += 2
        elif item[1] == "Q":
            score += 3
        elif item[1] == "K":
            score += 4
        elif item[1] == "A":
            if score + 11 > 21:
                score += 1
            else:
                score += 11
    return score


def time_generate():
    """Generate time

    in the format: Day DDth Month, YYYY at HH:MM:SS."""
    
    timedate = ""
    timedate += time.strftime("%a ", time.localtime())
    timedate += str(time.localtime()[2])
    if time.localtime()[2] % 10 == 1 and time.localtime()[2] % 100 != 11:
        timedate += "st"
    elif time.localtime()[2] % 10 == 2 and time.localtime()[2] % 100 != 12:
        timedate += "nd"
    elif time.localtime()[2] % 10 == 3 and time.localtime()[2] % 100 != 13:
        timedate += "rd"
    else:
        timedate += "th"
    timedate += " "
    if time.localtime()[1] == 1:
        timedate += "January"
    elif time.localtime()[1] == 2:
        timedate += "February"
    elif time.localtime()[1] == 3:
        timedate += "March"
    elif time.localtime()[1] == 4:
        timedate += "April"
    elif time.localtime()[1] == 5:
        timedate += "May"
    elif time.localtime()[1] == 6:
        timedate += "June"
    elif time.localtime()[1] == 7:
        timedate += "July"
    elif time.localtime()[1] == 8:
        timedate += "August"
    elif time.localtime()[1] == 9:
        timedate += "September"
    elif time.localtime()[1] == 10:
        timedate += "October"
    elif time.localtime()[1] == 11:
        timedate += "November"
    elif time.localtime()[1] == 12:
        timedate += "December"
    else:
        timedate += "Unknown month"
    timedate += ", " + str(time.localtime()[0])
    timedate += " at %02d" % time.localtime()[3]
    timedate += ":%02d" % time.localtime()[4]
    timedate += ":%02d" % time.localtime()[5]
    return timedate


def wait(message):
    raw_input(message)


def write_cards(player_name, hide):
    """Write cards to file

    Write all the cards to file.
    See function 'deal_cards' for more info about the cards."""

    f.write("\n\nDealer's Hand on %s\n" % time_generate())
    dealer_print = "-- "
    for item in dealer_cards:
        card_type = item[0]
        card = item[1]
        show_hide = item[2]
        if card == "2":
            dealer_print += "2"
        elif card == "3":
            dealer_print += "3"
        elif card == "4":
            dealer_print += "4"
        elif card == "5":
            dealer_print += "5"
        elif card == "6":
            dealer_print += "6"
        elif card == "7":
            dealer_print += "7"
        elif card == "8":
            dealer_print += "8"
        elif card == "9":
            dealer_print += "9"
        elif card == "1":
            dealer_print += "10"
        elif card == "J":
            dealer_print += "Jack"
        elif card == "Q":
            dealer_print += "Queen"
        elif card == "K":
            dealer_print += "King"
        elif card == "A":
            dealer_print += "Ace"
        dealer_print += " of "
        if card_type == "S":
            dealer_print += "Spades"
        elif card_type == "H":
            dealer_print += "Hearts"
        elif card_type == "D":
            dealer_print += "Diamonds"
        elif card_type == "C":
            dealer_print += "Clubs"
        if show_hide == "h" and hide == True:
            dealer_print += " (hidden)"
        dealer_print += "   "            
    f.write(dealer_print + "\n")
    f.write("-- Score: %s\n\n" % score_dealer())
    if player_name[len(player_name)-1].lower() == "s" or player_name[len(player_name)-1].lower() == "x":
        apostrophe = "'"
    else:
        apostrophe = "'s"
    f.write("%s%s Hand on %s\n" % (player_name, apostrophe, time_generate()))
    player_print = "-- "
    for item in player_cards:
        card_type = item[0]
        card = item[1]
        if card == "2":
            player_print += "2"
        elif card == "3":
            player_print += "3"
        elif card == "4":
            player_print += "4"
        elif card == "5":
            player_print += "5"
        elif card == "6":
            player_print += "6"
        elif card == "7":
            player_print += "7"
        elif card == "8":
            player_print += "8"
        elif card == "9":
            player_print += "9"
        elif card == "1":
            player_print += "10"
        elif card == "J":
            player_print += "Jack"
        elif card == "Q":
            player_print += "Queen"
        elif card == "K":
            player_print += "King"
        elif card == "A":
            player_print += "Ace"
        player_print += " of "
        if card_type == "S":
            player_print += "Spades"
        elif card_type == "H":
            player_print += "Hearts"
        elif card_type == "D":
            player_print += "Diamonds"
        elif card_type == "C":
            player_print += "Clubs"
        player_print += "   "
    f.write(player_print + "\n")
    f.write("-- Score: %s\n" % score_player())
    return  


def main():
    """BlackJack

    Play BlackJack."""

    play = True
    global deck, player_cards, dealer_cards, f, player_mode, dealer_mode
    while play == True:
        player_name = get_string("Please input your name.")
        f.write("BlackJack log for " + player_name + " on " + str(time_generate()) + "\n\n\n\n")
        wins, losses, draws, money = 0, 0, 0, 100.00
        deck = []
        play_player = True
        while play_player == True:
            player_mode, dealer_mode = "normal", "normal"
            f.write("%s\n\n\nStarting round %s on %s with $%s. " % ("-"*80, wins + losses + draws + 1, time_generate(), "%.2f" % money))
            print "\n\nStarting round %d on %s with $%.2f!" % (wins + losses + draws + 1, time_generate(), money), "\n"
            wager = get_wager("Choose wager.", money)
            f.write("Wager: $" + "%.2f" % wager + "\n")
            deck = restock_deck()
            player_cards, dealer_cards = [], []
            deal_cards("player", "show")
            deal_cards("dealer", "show")
            deal_cards("player", "show")
            deal_cards("dealer", "hide")
            print_cards(player_name, True)
            write_cards(player_name, True)
            f.write("\n")
            if score_player() == 21 and score_dealer() != 21:
                print_cards(player_name, False)
                write_cards(player_name, False)
                f.write("\n")
                print "BlackJack!!"
                wager *= 2
                money += wager
                print "\nPayout: $%.2f" % wager
                f.write("\n%s got a BlackJack on %s!\n-- Payout: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                wins += 1
                break
            elif score_player() == 21 and score_dealer() == 21:
                print_cards(player_name, False)
                write_cards(player_name, False)
                f.write("\n")
                print "Draw!"
                f.write("\nThere was a draw on %s.\n-- Money: $%s\n\n" % (time_generate(), "%.2f" % money))
                draws += 1
                break
            start_round = True
            while True:
                if player_mode == "normal":
                    player_move = move_choose_player(start_round)
                    f.write("\n** %s %ss on %s.\n" % (player_name, player_move, time_generate()))
                    if player_move == "Hit":
                        deal_cards("player", "show")
                    elif player_move == "Stand":
                        player_mode = "stand"
                    elif player_move == "Double":
                        deal_cards("player", "show")
                        player_mode = "double"
                        wager *= 2
                else:
                    f.write("\n** %s is standing on %s.\n" % (player_name, time_generate()))
                if dealer_mode == "normal":
                    dealer_move = move_choose_dealer()
                    f.write("** Dealer %ss on %s.\n" % (dealer_move, time_generate()))
                    print "\nDealer %ss." % dealer_move
                    if dealer_move == "Hit":
                        deal_cards("dealer", "hide")
                    elif dealer_move == "Stand":
                        dealer_mode = "stand"
                else:
                    f.write("** Dealer is standing on %s.\n" % (time_generate()))
                    print "\nDealer is standing."
                if score_player() > 21:
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "Busted!"
                    money -= wager
                    print "\nMoney lost: $%.2f" % wager
                    f.write("\n%s lost on %s.\n-- Money lost: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    losses += 1
                    break
                elif score_dealer() > 21:
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "You win!"
                    money += wager
                    print "\nPayout: $%.2f" % wager
                    f.write("\n%s got a BlackJack on %s!\n-- Payout: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    wins += 1
                    break
                elif score_player() == score_dealer() and dealer_mode == "stand" and (player_mode == "stand" or player_mode == "double"):
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "Draw!"
                    f.write("\nThere was a draw on %s.\n-- Money: $%s\n\n" % (time_generate(), "%.2f" % money))
                    draws += 1
                    break
                elif score_player() > score_dealer() and dealer_mode == "stand" and (player_mode == "stand" or player_mode == "double"):
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "You win!"
                    money += wager
                    print "\nPayout: $%.2f" % wager
                    f.write("\n%s got a BlackJack on %s!\n-- Payout: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    wins += 1
                    break
                elif score_player() < score_dealer() and dealer_mode == "stand" and (player_mode == "stand" or player_mode == "double"):
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "You lose!"
                    money -= wager
                    print "\nMoney lost: $%.2f" % wager
                    f.write("\n%s lost on %s.\n-- Money lost: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    losses += 1
                    break
                print_cards(player_name, True)
                write_cards(player_name, True)
                f.write("\n")
                start_round = False
            print "\nMoney: $%.2f" % money
            if money < 0.01:
                print "\nSorry, you don't have enough cash to play!\n"
                f.write("\n")
                break
            play_player = confirm("\n\nPlay again?")
            f.write("\n")
        f.write("%s\n\n\nEnded game on %s.\n-- Wins: %s\n-- Losses: %s\n-- Draws: %s" % ("-"*80, time_generate(), wins, losses, draws))
        print "\n\nWins: %d\nLosses: %d\nDraws: %d\n" % (wins, losses, draws)
        if confirm("\n\nPlay again as another user?") == 1:
            f.close()
            f = open("BlackJack_log-%s_%s_%s_%s_%s_%s.txt" % ("%04d" % time.localtime()[0], "%02d" % time.localtime()[1], "%02d" % time.localtime()[2], "%02d" % time.localtime()[3], "%02d" % time.localtime()[4], "%02d" % time.localtime()[5]), "w")
            continue
        else:
            wait("\n\nExiting...")
            return


if __name__ == "__main__":
    intro()
    f = open("BlackJack_log-%s_%s_%s_%s_%s_%s.txt" % ("%04d" % time.localtime()[0], "%02d" % time.localtime()[1], "%02d" % time.localtime()[2], "%02d" % time.localtime()[3], "%02d" % time.localtime()[4], "%02d" % time.localtime()[5]), "w")
    main()


Edit: Small fix for a problem when the player got BlackJack...

Last edited by UnKnown X; Feb 19th, 2006 at 4:58 AM.
UnKnown X is offline   Reply With Quote
Old Feb 19th, 2006, 7:07 AM   #2
UnKnown X
Hobbyist Programmer
 
UnKnown X's Avatar
 
Join Date: Dec 2005
Location: Sandvika, Norway
Posts: 114
Rep Power: 0 UnKnown X is an unknown quantity at this point
Send a message via MSN to UnKnown X
Oof, forgot about a break in there that made the game exit when you get BlackJack...

Problem solved:

# # # # # # # # # # # # # # # #
# BlackJack game by UnKnown X #
# # # # # # # # # # # # # # # #


import random, time

player_mode, dealer_mode = "normal", "normal"
player_cards, dealer_cards = [], []
deck = []


def confirm(message):
    """Confirm message
    
    Display a message, get yes/no answer from Player.
    Return 1 for yes, 0 for no."""

    print str(message) + "\n"
    while True:
        try:
            answer = raw_input("> ")
        except ValueError:
            print "ValueError exception encountered! Try again."
            continue
        if answer.lower() != "yes" and answer.lower() != "y" and answer.lower() != "no" and answer.lower() != "n":
            print "Invalid answer! Try again."
            continue
        break
    if answer.lower() == "yes" or answer.lower() == "y":
        answer = 1
    else:
        answer = 0
    return answer


def deal_cards(player_dealer, show_hide):
    """Deal cards

    Call with two strings.
    First is "player" or "dealer" for dealing cards to the Player or Dealer respectively.
    Second is "show" or "hide" to have the card's information visible or not.
    Function takes a random card and removes it from the deck,
    adding it to the Player's or Dealer's hand in a list in the format TCS,
    where T is a one-letter representation of the card type, C of the card
    and S for whether or not to show the card ("S" or "H")."""

    while True:
        if deck[0] == [] and deck[1] == [] and deck[2] == [] and deck[3] == []:
            return None
        card_type_num = random.randrange(4)
        card_num = random.randrange(len(deck[card_type_num]))
        card_type = ['Spades', 'Hearts', 'Diamonds', 'Clubs'][card_type_num]
        card = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'][card_num]
        try:
            deck[card_type_num].remove(card)
        except ValueError:
            continue
        card_identifier = str(['Spades', 'Hearts', 'Diamonds', 'Clubs'][card_type_num])[0]
        card_identifier += str(['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'][card_num])[0]
        card_identifier += show_hide[0]
        if player_dealer == "player":
            global player_cards
            player_cards.append(card_identifier)
        elif player_dealer == "dealer":
            global dealer_cards
            dealer_cards.append(card_identifier)
        return [card_type, card, show_hide]


def get_string(message):
    """Get string from Player

    Print message to Player, ask for and return input."""

    print str(message) + "\n"
    while True:
        try:
            the_string = raw_input("> ")
        except ValueError:
            print "ValueError exception encountered! Try again."
            continue
        if the_string == "":
            print "Error! Empty string! Try again."
            continue
        break
    return the_string


def get_wager(message, money):
    """Get wager from Player

    Get and return floating point number from Player."""
    
    print message + "\n"
    while True:
        try:
            wager_try = raw_input("> ")
            wager = float(wager_try)
        except ValueError:
            print "'%s' is not a number! Try again." % wager_try
            continue
        if wager < 0.01 or wager > float(money):
            print "Error! Cannot have %.2f as wager! Try again." % wager
            continue
        break
    return float("%.2f" % wager)


def intro():
    """Intro

    Print an intro."""

    print "* "*30 + "*"
    print "* BlackJack game by UnKnown X (demiblob@gmail.com) (C) 2006 *"
    print "* "*30 + "*\n\n"
    return


def move_choose_dealer():
    """Choose Dealer's move

    "Hit" or "Stand", depending on Dealer's score."""
    
    if score_dealer() < 17:
        return "Hit"
    else:
        return "Stand"


def move_choose_player(start_round):
    """Choose Player's move

    Show available moves for Player, return input when valid."""

    while True:
        if start_round == True:
            print "Available moves: Hit, Stand, Double"
        else:
            print "Available moves: Hit, Stand"
        player_move = get_string("Choose your move.").capitalize()
        if start_round == True:
            if player_move != "S" and player_move != "Stand" and player_move != "H" and player_move != "Hit" and player_move != "D" and player_move != "Double":
                print "Error: Invalid move '%s'! Try again." % player_move
                continue
        else:
            if player_move != "S" and player_move != "Stand" and player_move != "H" and player_move != "Hit":
                print "Error: Invalid move '%s'! Try again." % player_move
                continue
        if player_move == "S" or player_move == "Stand":
            return "Stand"
        elif player_move == "H" or player_move == "Hit":
            return "Hit"
        elif player_move == "D" or player_move == "Double":
            return "Double"
        else:
            print "Error: '%s' is not a valid move! Try again." % player_move
            continue


def print_cards(player_name, hide):
    """Print cards

    Print all the cards. See function 'deal_cards' for more info about the cards."""

    print "\n\nDealer's Hand\n"
    dealer_print = ""
    for item in dealer_cards:
        card_type = item[0]
        card = item[1]
        show_hide = item[2]
        if show_hide == "h" and hide == True:
            dealer_print += "*hidden*   "
        else:
            if card == "2":
                dealer_print += "2"
            elif card == "3":
                dealer_print += "3"
            elif card == "4":
                dealer_print += "4"
            elif card == "5":
                dealer_print += "5"
            elif card == "6":
                dealer_print += "6"
            elif card == "7":
                dealer_print += "7"
            elif card == "8":
                dealer_print += "8"
            elif card == "9":
                dealer_print += "9"
            elif card == "1":
                dealer_print += "10"
            elif card == "J":
                dealer_print += "Jack"
            elif card == "Q":
                dealer_print += "Queen"
            elif card == "K":
                dealer_print += "King"
            elif card == "A":
                dealer_print += "Ace"
            dealer_print += " of "
            if card_type == "S":
                dealer_print += "Spades"
            elif card_type == "H":
                dealer_print += "Hearts"
            elif card_type == "D":
                dealer_print += "Diamonds"
            elif card_type == "C":
                dealer_print += "Clubs"
            dealer_print += "   "
    print dealer_print
    if show_hide == "h" and hide == True:
        print "Score: Hidden"
    else:
        print "Score:", score_dealer()
    if player_name[len(player_name)-1].lower() == "s" or player_name[len(player_name)-1].lower() == "x":
        apostrophe = "'"
    else:
        apostrophe = "'s"
    print "\n\n%s%s Hand\n" % (player_name, apostrophe)
    player_print = ""
    for item in player_cards:
        card_type = item[0]
        card = item[1]
        if card == "2":
            player_print += "2"
        elif card == "3":
            player_print += "3"
        elif card == "4":
            player_print += "4"
        elif card == "5":
            player_print += "5"
        elif card == "6":
            player_print += "6"
        elif card == "7":
            player_print += "7"
        elif card == "8":
            player_print += "8"
        elif card == "9":
            player_print += "9"
        elif card == "1":
            player_print += "10"
        elif card == "J":
            player_print += "Jack"
        elif card == "Q":
            player_print += "Queen"
        elif card == "K":
            player_print += "King"
        elif card == "A":
            player_print += "Ace"
        player_print += " of "
        if card_type == "S":
            player_print += "Spades"
        elif card_type == "H":
            player_print += "Hearts"
        elif card_type == "D":
            player_print += "Diamonds"
        elif card_type == "C":
            player_print += "Clubs"
        player_print += "   "
    print player_print
    print "Score:", score_player()
    print "\n\n"
    return


def restock_deck():
    """Restock deck

    Re-initialize the deck, which is a list containing four lists of thirteen strings."""

    spades = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    hearts = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    diamonds = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    clubs = ['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace']
    global deck
    deck = [spades,hearts,diamonds,clubs]
    return deck


def score_dealer():
    """Dealer's score

    Get and return Dealer's score."""
    
    global dealer_cards
    score = 0
    for item in dealer_cards:
        if item[1] == "2":
            score += 2
        elif item[1] == "3":
            score += 3
        elif item[1] == "4":
            score += 4
        elif item[1] == "5":
            score += 5
        elif item[1] == "6":
            score += 6
        elif item[1] == "7":
            score += 7
        elif item[1] == "8":
            score += 8
        elif item[1] == "9":
            score += 9
        elif item[1] == "1":
            score += 10
        elif item[1] == "J":
            score += 2
        elif item[1] == "Q":
            score += 3
        elif item[1] == "K":
            score += 4
        elif item[1] == "A":
            if score + 11 > 21:
                score += 1
            else:
                score += 11
    return score


def score_player():
    """Player's score

    Get and return Player's score."""

    global player_cards
    score = 0
    for item in player_cards:
        if item[1] == "2":
            score += 2
        elif item[1] == "3":
            score += 3
        elif item[1] == "4":
            score += 4
        elif item[1] == "5":
            score += 5
        elif item[1] == "6":
            score += 6
        elif item[1] == "7":
            score += 7
        elif item[1] == "8":
            score += 8
        elif item[1] == "9":
            score += 9
        elif item[1] == "1":
            score += 10
        elif item[1] == "J":
            score += 2
        elif item[1] == "Q":
            score += 3
        elif item[1] == "K":
            score += 4
        elif item[1] == "A":
            if score + 11 > 21:
                score += 1
            else:
                score += 11
    return score


def time_generate():
    """Generate time

    in the format: Day DDth Month, YYYY at HH:MM:SS."""
    
    timedate = ""
    timedate += time.strftime("%a ", time.localtime())
    timedate += str(time.localtime()[2])
    if time.localtime()[2] % 10 == 1 and time.localtime()[2] % 100 != 11:
        timedate += "st"
    elif time.localtime()[2] % 10 == 2 and time.localtime()[2] % 100 != 12:
        timedate += "nd"
    elif time.localtime()[2] % 10 == 3 and time.localtime()[2] % 100 != 13:
        timedate += "rd"
    else:
        timedate += "th"
    timedate += " "
    if time.localtime()[1] == 1:
        timedate += "January"
    elif time.localtime()[1] == 2:
        timedate += "February"
    elif time.localtime()[1] == 3:
        timedate += "March"
    elif time.localtime()[1] == 4:
        timedate += "April"
    elif time.localtime()[1] == 5:
        timedate += "May"
    elif time.localtime()[1] == 6:
        timedate += "June"
    elif time.localtime()[1] == 7:
        timedate += "July"
    elif time.localtime()[1] == 8:
        timedate += "August"
    elif time.localtime()[1] == 9:
        timedate += "September"
    elif time.localtime()[1] == 10:
        timedate += "October"
    elif time.localtime()[1] == 11:
        timedate += "November"
    elif time.localtime()[1] == 12:
        timedate += "December"
    else:
        timedate += "Unknown month"
    timedate += ", " + str(time.localtime()[0])
    timedate += " at %02d" % time.localtime()[3]
    timedate += ":%02d" % time.localtime()[4]
    timedate += ":%02d" % time.localtime()[5]
    return timedate


def wait(message):
    raw_input(message)


def write_cards(player_name, hide):
    """Write cards to file

    Write all the cards to file.
    See function 'deal_cards' for more info about the cards."""

    f.write("\n\nDealer's Hand on %s\n" % time_generate())
    dealer_print = "-- "
    for item in dealer_cards:
        card_type = item[0]
        card = item[1]
        show_hide = item[2]
        if card == "2":
            dealer_print += "2"
        elif card == "3":
            dealer_print += "3"
        elif card == "4":
            dealer_print += "4"
        elif card == "5":
            dealer_print += "5"
        elif card == "6":
            dealer_print += "6"
        elif card == "7":
            dealer_print += "7"
        elif card == "8":
            dealer_print += "8"
        elif card == "9":
            dealer_print += "9"
        elif card == "1":
            dealer_print += "10"
        elif card == "J":
            dealer_print += "Jack"
        elif card == "Q":
            dealer_print += "Queen"
        elif card == "K":
            dealer_print += "King"
        elif card == "A":
            dealer_print += "Ace"
        dealer_print += " of "
        if card_type == "S":
            dealer_print += "Spades"
        elif card_type == "H":
            dealer_print += "Hearts"
        elif card_type == "D":
            dealer_print += "Diamonds"
        elif card_type == "C":
            dealer_print += "Clubs"
        if show_hide == "h" and hide == True:
            dealer_print += " (hidden)"
        dealer_print += "   "            
    f.write(dealer_print + "\n")
    f.write("-- Score: %s\n\n" % score_dealer())
    if player_name[len(player_name)-1].lower() == "s" or player_name[len(player_name)-1].lower() == "x":
        apostrophe = "'"
    else:
        apostrophe = "'s"
    f.write("%s%s Hand on %s\n" % (player_name, apostrophe, time_generate()))
    player_print = "-- "
    for item in player_cards:
        card_type = item[0]
        card = item[1]
        if card == "2":
            player_print += "2"
        elif card == "3":
            player_print += "3"
        elif card == "4":
            player_print += "4"
        elif card == "5":
            player_print += "5"
        elif card == "6":
            player_print += "6"
        elif card == "7":
            player_print += "7"
        elif card == "8":
            player_print += "8"
        elif card == "9":
            player_print += "9"
        elif card == "1":
            player_print += "10"
        elif card == "J":
            player_print += "Jack"
        elif card == "Q":
            player_print += "Queen"
        elif card == "K":
            player_print += "King"
        elif card == "A":
            player_print += "Ace"
        player_print += " of "
        if card_type == "S":
            player_print += "Spades"
        elif card_type == "H":
            player_print += "Hearts"
        elif card_type == "D":
            player_print += "Diamonds"
        elif card_type == "C":
            player_print += "Clubs"
        player_print += "   "
    f.write(player_print + "\n")
    f.write("-- Score: %s\n" % score_player())
    return  


def main():
    """BlackJack

    Play BlackJack."""

    play = True
    global deck, player_cards, dealer_cards, f, player_mode, dealer_mode
    while play == True:
        player_name = get_string("Please input your name.")
        f.write("BlackJack log for " + player_name + " on " + str(time_generate()) + "\n\n\n\n")
        wins, losses, draws, money = 0, 0, 0, 100.00
        deck = []
        play_player = True
        while play_player == True:
            player_mode, dealer_mode = "normal", "normal"
            f.write("%s\n\n\nStarting round %s on %s with $%s. " % ("-"*80, wins + losses + draws + 1, time_generate(), "%.2f" % money))
            print "\n\nStarting round %d on %s with $%.2f!" % (wins + losses + draws + 1, time_generate(), money), "\n"
            wager = get_wager("Choose wager.", money)
            f.write("Wager: $" + "%.2f" % wager + "\n")
            deck = restock_deck()
            player_cards, dealer_cards = [], []
            deal_cards("player", "show")
            deal_cards("dealer", "show")
            deal_cards("player", "show")
            deal_cards("dealer", "hide")
            print_cards(player_name, True)
            write_cards(player_name, True)
            f.write("\n")
            blackjack = False
            if score_player() == 21 and score_dealer() != 21:
                print_cards(player_name, False)
                write_cards(player_name, False)
                f.write("\n")
                print "BlackJack!!"
                wager *= 2
                money += wager
                print "\nPayout: $%.2f" % wager
                f.write("\n%s got a BlackJack on %s!\n-- Payout: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                wins += 1
                blackjack = True
            elif score_player() == 21 and score_dealer() == 21:
                print_cards(player_name, False)
                write_cards(player_name, False)
                f.write("\n")
                print "Draw!"
                f.write("\nThere was a draw on %s.\n-- Money: $%s\n\n" % (time_generate(), "%.2f" % money))
                draws += 1
                blackjack = True
            start_round = True
            while blackjack != True:
                if player_mode == "normal":
                    player_move = move_choose_player(start_round)
                    f.write("\n** %s %ss on %s.\n" % (player_name, player_move, time_generate()))
                    if player_move == "Hit":
                        deal_cards("player", "show")
                    elif player_move == "Stand":
                        player_mode = "stand"
                    elif player_move == "Double":
                        deal_cards("player", "show")
                        player_mode = "double"
                        wager *= 2
                else:
                    f.write("\n** %s is standing on %s.\n" % (player_name, time_generate()))
                if dealer_mode == "normal":
                    dealer_move = move_choose_dealer()
                    f.write("** Dealer %ss on %s.\n" % (dealer_move, time_generate()))
                    print "\nDealer %ss." % dealer_move
                    if dealer_move == "Hit":
                        deal_cards("dealer", "hide")
                    elif dealer_move == "Stand":
                        dealer_mode = "stand"
                else:
                    f.write("** Dealer is standing on %s.\n" % (time_generate()))
                    print "\nDealer is standing."
                if score_player() > 21:
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "Busted!"
                    money -= wager
                    print "\nMoney lost: $%.2f" % wager
                    f.write("\n%s lost on %s.\n-- Money lost: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    losses += 1
                    break
                elif score_dealer() > 21:
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "You win!"
                    money += wager
                    print "\nPayout: $%.2f" % wager
                    f.write("\n%s got a BlackJack on %s!\n-- Payout: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    wins += 1
                    break
                elif score_player() == score_dealer() and dealer_mode == "stand" and (player_mode == "stand" or player_mode == "double"):
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "Draw!"
                    f.write("\nThere was a draw on %s.\n-- Money: $%s\n\n" % (time_generate(), "%.2f" % money))
                    draws += 1
                    break
                elif score_player() > score_dealer() and dealer_mode == "stand" and (player_mode == "stand" or player_mode == "double"):
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "You win!"
                    money += wager
                    print "\nPayout: $%.2f" % wager
                    f.write("\n%s got a BlackJack on %s!\n-- Payout: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    wins += 1
                    break
                elif score_player() < score_dealer() and dealer_mode == "stand" and (player_mode == "stand" or player_mode == "double"):
                    print_cards(player_name, False)
                    write_cards(player_name, False)
                    f.write("\n")
                    print "You lose!"
                    money -= wager
                    print "\nMoney lost: $%.2f" % wager
                    f.write("\n%s lost on %s.\n-- Money lost: $%s\n-- Money: $%s\n\n" % (player_name, time_generate(), "%.2f" % wager, "%.2f" % money))
                    losses += 1
                    break
                print_cards(player_name, True)
                write_cards(player_name, True)
                f.write("\n")
                start_round = False
            print "\nMoney: $%.2f" % money
            if money < 0.01:
                print "\nSorry, you don't have enough cash to play!\n"
                f.write("\n")
                break
            play_player = confirm("\n\nPlay again?")
            f.write("\n")
        f.write("%s\n\n\nEnded game on %s.\n-- Wins: %s\n-- Losses: %s\n-- Draws: %s" % ("-"*80, time_generate(), wins, losses, draws))
        print "\n\nWins: %d\nLosses: %d\nDraws: %d\n" % (wins, losses, draws)
        if confirm("\n\nPlay again as another user?") == 1:
            f.close()
            f = open("BlackJack_log-%s_%s_%s_%s_%s_%s.txt" % ("%04d" % time.localtime()[0], "%02d" % time.localtime()[1], "%02d" % time.localtime()[2], "%02d" % time.localtime()[3], "%02d" % time.localtime()[4], "%02d" % time.localtime()[5]), "w")
            continue
        else:
            wait("\n\nExiting...")
            return


if __name__ == "__main__":
    intro()
    f = open("BlackJack_log-%s_%s_%s_%s_%s_%s.txt" % ("%04d" % time.localtime()[0], "%02d" % time.localtime()[1], "%02d" % time.localtime()[2], "%02d" % time.localtime()[3], "%02d" % time.localtime()[4], "%02d" % time.localtime()[5]), "w")
    main()