import sys import game import deck class Blackjack(game.Game): """Blackjack game implementation. The game implementation enforces rules of the game.""" GameName = 'Blackjack' def __init__(self): self.deck = deck.Deck() self.deck.shuffle() def playHand(self, players, dealer): pList = [] for p in players: gamePlay = p.gamePlay(self) if isinstance(gamePlay, BlackjackPlay): pList.append(p) else: print '%s does not play %s' % (p.name, self.GameName) self.deck.shuffle() for i in range(2): for p in pList: p.draw(self.deck.deal()) dealer.draw(self.deck.deal()) for p in pList: p.show() dealer.show() print goodList = [] for p in pList: pv = self.bestValue(p) if pv == 21: print '%s blackjack!' % p.name elif self.play(p, dealer): goodList.append(p) else: print '%s busted' % p.name if not goodList: return if self.play(dealer, None): dv = self.bestValue(dealer) for p in goodList: pv = self.bestValue(p) if pv > dv: print '%s wins' % p.name elif pv < dv: print '%s loses' % p.name else: print '%s pushes' % p.name else: print 'Dealer busted' for p in goodList: print '%s wins' % p.name def play(self, player, dealer): gamePlay = player.gamePlay(self) player.show(showHoleCard=1) while gamePlay.wantCard(self, player, dealer): player.draw(self.deck.deal()) player.show(showHoleCard=1) if self.busted(player): return 0 return 1 def values(self, player): values = [ 0 ] for c in player.cards: values = self._sum(values, c) return values def _sum(self, values, card): newValues = [] cv = card.value() if type(cv) is type(0): for v in values: nv = v + cv if nv <= 21: newValues.append(nv) else: for v in values: for av in cv: nv = v + av if av <= 21: newValues.append(nv) return newValues def bestValue(self, player): return max(self.values(player)) def busted(self, player): return len(self.values(player)) == 0 class BlackjackPlay(game.GamePlay): """Blackjack play interface (must be overridden).""" GameName = 'Blackjack' def wantCard(self, game, player, dealer): raise SystemError, 'abstract BlackjackPlay class called' class BlackjackPlayDealer(BlackjackPlay): """Blackjack dealer play rules.""" def wantCard(self, game, player, dealer): return game.bestValue(player) < 17 class BlackjackPlayUser(BlackjackPlay): """Blackjack interactive play rules.""" def wantCard(self, game, player, dealer): while 1: sys.stdout.write('[H]it or [S]tay? ') line = sys.stdin.readline() if not line: raise SystemExit, 0 if line[0] in 'sS': return 0 elif line[0] in 'hH': return 1 if __name__ == '__main__': import player names = [ 'Alice', 'Bob', 'Carol' ] pList = map(player.Player, names) pList[0].learn(BlackjackPlayDealer()) pList[1].learn(BlackjackPlayUser()) dealer = player.Dealer() dealer.learn(BlackjackPlayDealer()) game = Blackjack() game.playHand(pList, dealer)