Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 201 additions & 0 deletions Exercise1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
# Exercise1 Chapter 9
# Author: Alton Stillwell
# Date: 3/4/15
###############
# Blackjack v1.1
# From 1 to 7 players compete against a dealer
# New Update added error checking and deck repopulating
#####################################
import cards, games
##########################################
class BJ_Card(cards.Card):
""" A Blackjack Card. """
ACE_VALUE = 1

@property
def value(self):
if self.is_face_up:
v = BJ_Card.RANKS.index(self.rank) + 1
if v > 10:
v = 10
else:
v = None
return v
##########################################
class BJ_Deck(cards.Deck):
""" A Blackjack Deck. """
def populate(self):
for suit in BJ_Card.SUITS:
for rank in BJ_Card.RANKS:
self.cards.append(BJ_Card(rank, suit))
##########################################
class BJ_Hand(cards.Hand):
""" A Blackjack Hand. """
def __init__(self, name):
super(BJ_Hand, self).__init__()
self.name = name

def __str__(self):
rep = self.name + ":\t" + super(BJ_Hand, self).__str__()
if self.total:
rep += "(" + str(self.total) + ")"
return rep

@property
def total(self):
# if a card in the hand has value of None, then total is None
for card in self.cards:
if not card.value:
return None

# add up card values, treat each Ace as 1
t = 0
for card in self.cards:
t += card.value

# determine if hand contains an Ace
contains_ace = False
for card in self.cards:
if card.value == BJ_Card.ACE_VALUE:
contains_ace = True

# if hand contains Ace and total is low enough, treat Ace as 11
if contains_ace and t <= 11:
# add only 10 since we've already added 1 for the Ace
t += 10

return t

def is_busted(self):
return self.total > 21
##################################################
class BJ_Player(BJ_Hand):
""" A Blackjack Player. """
def is_hitting(self):
response = games.ask_yes_no("\n" + self.name + ", do you want a hit? (Y/N): ")
return response == "y"

def bust(self):
print(self.name, "busts.")
self.lose()

def lose(self):
print(self.name, "loses.")

def win(self):
print(self.name, "wins.")

def push(self):
print(self.name, "pushes.")
#############################################
class BJ_Dealer(BJ_Hand):
""" A Blackjack Dealer. """
def is_hitting(self):
return self.total < 17

def bust(self):
print(self.name, "busts.")

def flip_first_card(self):
first_card = self.cards[0]
first_card.flip()
#########################################
class BJ_Game(object):
""" A Blackjack Game. """
def __init__(self, names):
self.players = []
for name in names:
player = BJ_Player(name)
self.players.append(player)

self.dealer = BJ_Dealer("Dealer")

self.deck = BJ_Deck()
self.deck.populate()
self.deck.shuffle()

@property
def still_playing(self):
sp = []
for player in self.players:
if not player.is_busted():
sp.append(player)
return sp

def __additional_cards(self, player):
while not player.is_busted() and player.is_hitting():
self.deck.deal([player])
print(player)
if player.is_busted():
player.bust()

def play(self):
# deal initial 2 cards to everyone
self.deck.deal(self.players + [self.dealer], per_hand = 2)
self.dealer.flip_first_card() # hide dealer's first card
for player in self.players:
print(player)
print(self.dealer)

# deal additional cards to players
for player in self.players:
self.__additional_cards(player)

self.dealer.flip_first_card() # reveal dealer's first

if not self.still_playing:
# since all players have busted, just show the dealer's hand
print(self.dealer)
else:
# deal additional cards to dealer
print(self.dealer)
self.__additional_cards(self.dealer)

if self.dealer.is_busted():
# everyone still playing wins
for player in self.still_playing:
player.win()
else:
# compare each player still playing to dealer
for player in self.still_playing:
if player.total > self.dealer.total:
player.win()
elif player.total < self.dealer.total:
player.lose()
else:
player.push()

# remove everyone's cards
for player in self.players:
player.clear()
self.dealer.clear()

# resets the deck
self.deck = BJ_Deck()
self.deck.populate()
self.deck.shuffle()
#############################################
def main():
print("\t\tWelcome to Blackjack!\n")

names = []
number = games.ask_number("How many players? (1 - 7): ", low = 1, high = 8)
for i in range(number):
name = input("Enter player name: ")
while name == "":
name = input("Enter different player name: ")
names.append(name)
print()

game = BJ_Game(names)

again = None
while again != "n":
game.play()
again = games.ask_yes_no("\nDo you want to play again?: ")
#############################################
main()
input("\n\nPress the enter key to exit.")



106 changes: 106 additions & 0 deletions Exercise2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Exercise2 Chapter 9
# Author: Alton Stillwell
# Date: 3/4/15
#######################
# One-Card War
# Each player will get a single card,
# player with highest value card wins
#######################
import cards, games
#######################
class CW_Card(cards.Card):
ACE_VALUE = 1
@property
def value(self):
v = CW_Card.RANKS.index(self.rank) + 1
if v > 10:
v = 10
return v
#######################
class CW_Hand(cards.Hand):
def __init__(self,name):
super(CW_Hand,self).__init__()
self.name = name
def __str__(self):
rep = self.name + ":\t" + super(CW_Hand,self).__str__()
if self.total:
rep += "(" + str(self.total) + ")"
return rep
@property
def total(self):
for card in self.cards:
if not card.value:
return None
t = 0
for card in self.cards:
t += card.value
contains_ace = False
for card in self.cards:
if card.value == CW_Card.ACE_VALUE:
contains_ace = True
if contains_ace:
t = 11
return t
#######################
class CW_Deck(cards.Deck):
def populate(self):
for suit in CW_Card.SUITS:
for rank in CW_Card.RANKS:
self.cards.append(CW_Card(rank,suit))
#######################
class CW_Player(CW_Hand):
def lose(self):
print(self.name,"loses.")
def win(self):
print(self.name,"wins.")
def push(self):
print(self.name,"pushes.")
####################
class CW_Game(object):
def __init__(self,names):
self.players = []
for name in names:
player = CW_Player(name)
self.players.append(player)
self.deck = CW_Deck()
self.deck.populate()
self.deck.shuffle()
def play(self):
self.deck.deal(self.players, per_hand = 1)
for player in self.players:
print(player)
# finds top score
topPlayerScore = 0
for player in self.players:
v = player.total
if v > topPlayerScore:
topPlayerScore = v
topPlayer = player
print("~~~~~~~~~~~~~~~")
print(topPlayer,"is the winner!")
print("With a final score of:",topPlayerScore)
# resets the game
for player in self.players:
player.clear()
self.deck = CW_Deck()
self.deck.populate()
self.deck.shuffle()
#######################
def main():
print("\t\tWelcome to One-Card War!\n")
names = []
number = games.ask_number("How many players? (1 - 7): ", low = 1, high = 8)
for i in range(number):
name = input("Enter player name: ")
while name == "":
name = input("Enter different player name: ")
names.append(name)
print()
game = CW_Game(names)
again = None
while again != "n":
game.play()
again = games.ask_yes_no("\nDo you want to play again?: ")
#########################################
main()
input("Press <enter> to exit.")
Loading