diff --git a/Exercise1.py b/Exercise1.py new file mode 100644 index 0000000..27f3045 --- /dev/null +++ b/Exercise1.py @@ -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.") + + + diff --git a/Exercise2.py b/Exercise2.py new file mode 100644 index 0000000..1182afa --- /dev/null +++ b/Exercise2.py @@ -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 to exit.") diff --git a/Exercise3.py b/Exercise3.py new file mode 100644 index 0000000..576a63d --- /dev/null +++ b/Exercise3.py @@ -0,0 +1,214 @@ +# Exercise3, Chapter 9 +# Author: Alton Stillwell +# Date: 3/4/15 +############### +# Blackjack v1.2 +# From 1 to 7 players compete against a dealer +# New Update added the ability to bet +##################################### +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.") + self.bankroll += (self.bet * 2) + def push(self): + print(self.name, "pushes.") + self.bankroll += (self.bet) +############################################# +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, startingBankroll): + self.players = [] + for name in names: + player = BJ_Player(name) + self.players.append(player) + player.bankroll = startingBankroll + 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): + # place bets + for player in self.players: + print("Player", player,", has",player.bankroll,"chips left!") + bet = games.ask_number("How much do you want to bet? (1 - 40): ", low = 1, high = 41) + temp = player.bankroll - bet + while temp < 0: + print("Invalid amount!") + bet = games.ask_number("How much do you want to bet? (1 - 40): ", low = 1, high = 41) + temp = player.bankroll - bet + player.bet = bet + player.bankroll = temp + # 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() + # remove players if they have no chips + for player in self.players: + if player.bankroll == 0: + self.players.remove(player) + # 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) + startingBankroll = games.ask_number("What is the player's starting bankroll? (10 - 1000): ", low = 10, high = 1001) + 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, startingBankroll) + + 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.") diff --git a/__pycache__/cards.cpython-32.pyc b/__pycache__/cards.cpython-32.pyc new file mode 100644 index 0000000..d68cf49 Binary files /dev/null and b/__pycache__/cards.cpython-32.pyc differ diff --git a/__pycache__/games.cpython-32.pyc b/__pycache__/games.cpython-32.pyc new file mode 100644 index 0000000..b71fd89 Binary files /dev/null and b/__pycache__/games.cpython-32.pyc differ