Blackjack is a simple, popular card game that is played in many casinos. Cards in Blackjack have the following values: an ace may be valued as either 1 or 11 (player's choice), face cards (kings, queens and jacks) are valued at 10 and the value of the remaining cards corresponds to their number. During a round of Blackjack, the players plays against a dealer with the goal of building a hand (a collection of cards) whose cards have a total value that is higher than the value of the dealer's hand, but not over 21. (A round of Blackjack is also sometimes referred to as a hand.)
The game logic for my simplified version of Blackjack is as follows. The player and the dealer are each dealt two cards initially with one of the dealer's cards being dealt faced down (his hole card). The player may then ask for the dealer to repeatedly "hit" his hand by dealing him another card. If, at any point, the value of the player's hand exceeds 21, the player is "busted" and loses immediately. At any point prior to busting, the player may "stand" and the dealer will then hit his hand until the value of his hand is 17 or more. (For the dealer, aces count as 11 unless it causes the dealer's hand to bust). If the dealer busts, the player wins. Otherwise, the player and dealer then compare the values of their hands and the hand with the higher value wins. The dealer wins ties in my version.The code is written on Codeskulptor and Game URL is givwn below:
Blackjack Game
Blackjack Game Source Code:
import simpleguiimport random# load card sprite - 949x392 - source: jfitz.comCARD_SIZE = (73, 98)CARD_CENTER = (36.5, 49)card_images = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/cards.jfitz.png")CARD_BACK_SIZE = (71, 96)CARD_BACK_CENTER = (35.5, 48)card_back = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/card_back.png")# initialize global variablesin_play = Falsemessage = ""outcome = ""score = 0popped = []player = []dealer = []deck = []# define globals for cardsSUITS = ('C', 'S', 'H', 'D')RANKS = ('A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K')VALUES = {'A':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'T':10, 'J':10, 'Q':10, 'K':10}# Card class. Hand class calls this draw method for rendering card images onto canvasclass Card:def __init__(self, suit, rank):if (suit in SUITS) and (rank in RANKS):self.suit = suitself.rank = rankelse:self.suit = Noneself.rank = Nonedef __str__(self):return self.suit + self.rankdef get_suit(self):return self.suitdef get_rank(self):return self.rankdef draw(self, canvas, pos):card_loc = (CARD_CENTER[0] + CARD_SIZE[0] * RANKS.index(self.rank),CARD_CENTER[1] + CARD_SIZE[1] * SUITS.index(self.suit))canvas.draw_image(card_images, card_loc, CARD_SIZE, [pos[0] + CARD_CENTER[0], pos[1] + CARD_CENTER[1]], CARD_SIZE)# Hand class used for adding card objects from Deck() and for getting the value of handsclass Hand:def __init__(self):self.player_hand = []def __str__(self):s = ''for c in self.player_hand:s = s + str(c) + ' 'return sdef add_card(self, card):self.player_hand.append(card)return self.player_handdef get_value(self):value = 0for card in self.player_hand:rank = card.get_rank()value = value + VALUES[rank]for card in self.player_hand:rank = card.get_rank()if rank == 'A' and value <= 11:value += 10return valuedef draw(self, canvas, p):pos = pfor card in self.player_hand:card.draw(canvas, p)pos[0] = pos[0] + 90if in_play == True:canvas.draw_image(card_back, CARD_BACK_CENTER, CARD_BACK_SIZE, [115.5,229], CARD_BACK_SIZE)# Deck class used for re-shuffling between hands and giving card objects to Hand as calledclass Deck:def __init__(self):popped = []self.cards = [Card(suit, rank) for suit in SUITS for rank in RANKS]self.shuffle()def __str__(self):s = ''for c in self.cards:s = s + str(c) + ' 'return sdef shuffle(self):random.shuffle(self.cards)def deal_card(self):popped = self.cards.pop(0)return poppeddef deal():# deal function deals initial hands and adjusts message.global in_play, player, dealer, deck, message, score, outcomeif in_play == True:# if player clicks Deal button during a hand, player loses hand in progressmessage = "Okay, here is a new hand"score -= 1deck = Deck()player = Hand()dealer = Hand()player.add_card(deck.deal_card())dealer.add_card(deck.deal_card())player.add_card(deck.deal_card())dealer.add_card(deck.deal_card())if in_play == False:# starts a new handdeck = Deck()player = Hand()dealer = Hand()player.add_card(deck.deal_card())dealer.add_card(deck.deal_card())player.add_card(deck.deal_card())dealer.add_card(deck.deal_card())message = "New Hand. Hit or Stand?"in_play = Trueoutcome = ""def hit():# deals player a new hand and ends hand if it causes a bust.global in_play, score, messageif in_play == True:player.add_card(deck.deal_card())message = "Hit or Stand?"if player.get_value() > 21:in_play = Falsemessage = "Player has busted! Play again?"score -= 1outcome = "Dealer: " + str(dealer.get_value()) + " Player: " + str(player.get_value())def stand():# hits dealer until >=17 or busts. Determines winner of hand and adjusts score, game state, and messagesglobal in_play, score, message, outcomeif in_play == False:message = "That hand is already over. Deal again."else:while dealer.get_value() < 17:dealer.add_card(deck.deal_card())if dealer.get_value() > 21:message = "Dealer busted. You win! Play again?"score += 1in_play = Falseelif dealer.get_value() >= player.get_value():message = "Dealer wins. Play again?"score -= 1in_play = Falseelif dealer.get_value() < player.get_value():message = "You win! Play again?"score += 1in_play = Falseoutcome = "Dealer: " + str(dealer.get_value()) + " Player: " + str(player.get_value())# draw handlerdef draw(canvas):canvas.draw_text("Blackjack", [40,80], 48, "White")canvas.draw_text("Score: " + str(score), [450,80], 36, "Black")canvas.draw_text("Dealer", [80,160], 30, "Black")canvas.draw_text("Player", [80,430], 30, "Black")canvas.draw_text(message, [200,355], 24, "Black")canvas.draw_text(outcome, [350,160], 24, "Black")player.draw(canvas, [80,450])dealer.draw(canvas, [80,180])# initialization frameframe = simplegui.create_frame("Blackjack", 700, 600)frame.set_canvas_background("Green")# buttons and canvas callbackframe.add_button("Deal", deal, 200)frame.add_button("Hit", hit, 200)frame.add_button("Stand", stand, 200)frame.set_draw_handler(draw)# deals initial handdeal()# get things rollingframe.start()
No comments:
Post a Comment