blacker jacks
This commit is contained in:
parent
27cff67006
commit
d015932f42
6 changed files with 121 additions and 118 deletions
|
@ -6,15 +6,9 @@ def main():
|
||||||
global kill
|
global kill
|
||||||
global screen
|
global screen
|
||||||
global num_decks
|
global num_decks
|
||||||
deck = Deck()
|
global deck
|
||||||
game = GameMaster()
|
game = GameMaster()
|
||||||
|
|
||||||
if num_decks == 'q':
|
|
||||||
game.active = False
|
|
||||||
|
|
||||||
if deck.count_below(4):
|
|
||||||
deck.shuffle(num_decks)
|
|
||||||
|
|
||||||
for player in game.players:
|
for player in game.players:
|
||||||
for _ in range(2):
|
for _ in range(2):
|
||||||
player.hand.append(deck.draw())
|
player.hand.append(deck.draw())
|
||||||
|
@ -23,7 +17,10 @@ def main():
|
||||||
player = game.player
|
player = game.player
|
||||||
|
|
||||||
while game.active:
|
while game.active:
|
||||||
screen.update(game.players)
|
screen.update(game)
|
||||||
|
if player.blackjack():
|
||||||
|
game.active = False
|
||||||
|
print('Blackjack!')
|
||||||
|
|
||||||
if game.active:
|
if game.active:
|
||||||
user_input = input(str(deck.count()) + ' cards left in deck.\n[H]it or [S]tand? ')
|
user_input = input(str(deck.count()) + ' cards left in deck.\n[H]it or [S]tand? ')
|
||||||
|
@ -41,19 +38,23 @@ def main():
|
||||||
game.active = False
|
game.active = False
|
||||||
case 'h':
|
case 'h':
|
||||||
player.hand.append(deck.draw())
|
player.hand.append(deck.draw())
|
||||||
|
if player.bust(game):
|
||||||
|
game.active = False
|
||||||
case 's':
|
case 's':
|
||||||
while dealer.score() < 17:
|
game.active = False
|
||||||
|
while dealer.score(game) < 17:
|
||||||
dealer.hand.append(deck.draw())
|
dealer.hand.append(deck.draw())
|
||||||
|
|
||||||
screen.update(game.players)
|
screen.update(game)
|
||||||
game.score()
|
|
||||||
|
|
||||||
if not game.active:
|
if not game.active:
|
||||||
|
game.score()
|
||||||
user_input = input('Play again? [Y/n] ')
|
user_input = input('Play again? [Y/n] ')
|
||||||
|
|
||||||
kill = False
|
kill = False
|
||||||
screen = Screen()
|
screen = Screen()
|
||||||
print(screen.show_intro())
|
print(screen.intro)
|
||||||
num_decks = input('How many decks? (1-8): ')
|
num_decks = input('How many decks? (1-8): ')
|
||||||
|
deck = Deck(num_decks)
|
||||||
while not kill:
|
while not kill:
|
||||||
main()
|
main()
|
|
@ -1,72 +0,0 @@
|
||||||
class CardPrinter:
|
|
||||||
def make_card(self, vs, style):
|
|
||||||
deck = '''\
|
|
||||||
┌────────┐┐┐┐┐┐
|
|
||||||
│░░░░░░░░││││││
|
|
||||||
│░░░░░░░░││││││
|
|
||||||
│░░░░░░░░││││││
|
|
||||||
│░░░░░░░░││││││
|
|
||||||
│░░░░░░░░││││││
|
|
||||||
└────────┘┘┘┘┘┘'''
|
|
||||||
card_rest = f'''\
|
|
||||||
──────┐
|
|
||||||
│
|
|
||||||
│
|
|
||||||
│
|
|
||||||
│
|
|
||||||
│
|
|
||||||
──────┘'''
|
|
||||||
hidden_part = f'''\
|
|
||||||
┌──
|
|
||||||
│░░
|
|
||||||
│░░
|
|
||||||
│░░
|
|
||||||
│░░
|
|
||||||
│░░
|
|
||||||
└──'''
|
|
||||||
hidden_rest = f'''\
|
|
||||||
──────┐
|
|
||||||
░░░░░░│
|
|
||||||
░░░░░░│
|
|
||||||
░░░░░░│
|
|
||||||
░░░░░░│
|
|
||||||
░░░░░░│
|
|
||||||
──────┘'''
|
|
||||||
value = vs[0]
|
|
||||||
value = '10' if value == '0' else value + ' '
|
|
||||||
suit = vs[1] + ' '
|
|
||||||
# request text (not emoji) render of preceeding glyph but can break some fonts
|
|
||||||
# suit += '\uFE0E'
|
|
||||||
card_part = f'''\
|
|
||||||
┌──
|
|
||||||
│{value}
|
|
||||||
│{suit}
|
|
||||||
│
|
|
||||||
│
|
|
||||||
│
|
|
||||||
└──'''
|
|
||||||
match style:
|
|
||||||
case 'deck':
|
|
||||||
return deck
|
|
||||||
case 'card_rest':
|
|
||||||
return card_rest
|
|
||||||
case 'hidden_part':
|
|
||||||
return hidden_part
|
|
||||||
case 'hidden_rest':
|
|
||||||
return hidden_rest
|
|
||||||
case 'card_part':
|
|
||||||
return card_part
|
|
||||||
|
|
||||||
def print_hand(self, player):
|
|
||||||
player_cards = [self.make_card(card,'card_part') for card in player.hand]
|
|
||||||
if player == 'Dealer' and game_active:
|
|
||||||
player_cards[0] = self.make_card('na','hidden_part')
|
|
||||||
player_cards.append(self.make_card('na','card_rest'))
|
|
||||||
card_slices = [str(card).splitlines() for card in player_cards]
|
|
||||||
for i in range(7):
|
|
||||||
clist = [card_slice[i] for card_slice in card_slices]
|
|
||||||
carriage = ''
|
|
||||||
for chunk in clist:
|
|
||||||
carriage += chunk
|
|
||||||
print(carriage)
|
|
||||||
|
|
12
src/deck.py
12
src/deck.py
|
@ -1,7 +1,9 @@
|
||||||
import random
|
import random
|
||||||
|
|
||||||
class Deck:
|
class Deck:
|
||||||
cards = []
|
def __init__(self, n_decks):
|
||||||
|
self.cards = []
|
||||||
|
self.n_decks = n_decks
|
||||||
|
|
||||||
def count(self):
|
def count(self):
|
||||||
return len(self.cards)
|
return len(self.cards)
|
||||||
|
@ -17,9 +19,11 @@ class Deck:
|
||||||
self.cards += [card + suit for card in cards for suit in suits]
|
self.cards += [card + suit for card in cards for suit in suits]
|
||||||
n_decks -= 1
|
n_decks -= 1
|
||||||
|
|
||||||
def count_below(self, n):
|
def check(self):
|
||||||
if self.count() < n:
|
if self.count() < 4:
|
||||||
return True
|
self.shuffle(self.n_decks)
|
||||||
|
|
||||||
def draw(self):
|
def draw(self):
|
||||||
|
self.check()
|
||||||
return self.cards.pop(random.choice(range(self.count())))
|
return self.cards.pop(random.choice(range(self.count())))
|
||||||
|
|
||||||
|
|
|
@ -10,18 +10,18 @@ class GameMaster:
|
||||||
def score(self):
|
def score(self):
|
||||||
status = 'Error'
|
status = 'Error'
|
||||||
|
|
||||||
if self.dealer.score() == self.player.score():
|
if self.dealer.score(self) == self.player.score(self):
|
||||||
self.active = False
|
self.active = False
|
||||||
status = 'Push.'
|
status = 'Push.'
|
||||||
elif self.dealer.score() > self.player.score():
|
elif self.dealer.score(self) > self.player.score(self):
|
||||||
self.active = False
|
self.active = False
|
||||||
status = 'House wins.'
|
status = 'House wins.'
|
||||||
elif self.dealer.score() < self.player.score():
|
elif self.dealer.score(self) < self.player.score(self):
|
||||||
self.active = False
|
self.active = False
|
||||||
status = 'You win!'
|
status = 'You win!'
|
||||||
|
|
||||||
for player in self.players:
|
for player in self.players:
|
||||||
if player.score() > 21:
|
if player.score(self) > 21:
|
||||||
self.active = False
|
self.active = False
|
||||||
status = player.name + ' Bust!'
|
status = player.name + ' Bust!'
|
||||||
print(status)
|
print(status)
|
||||||
|
|
|
@ -2,8 +2,6 @@ class Player:
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.hand = []
|
self.hand = []
|
||||||
self.blackjack = False
|
|
||||||
self.bust = False
|
|
||||||
|
|
||||||
def tally_hand(self):
|
def tally_hand(self):
|
||||||
cards = [card[0] for card in self.hand]
|
cards = [card[0] for card in self.hand]
|
||||||
|
@ -11,21 +9,21 @@ class Player:
|
||||||
scores = [10 if card in 'JQK0' else int(card) for card in cards]
|
scores = [10 if card in 'JQK0' else int(card) for card in cards]
|
||||||
return scores
|
return scores
|
||||||
|
|
||||||
def score(self):
|
def score(self, game):
|
||||||
|
if self.name == 'Dealer' and game.active:
|
||||||
|
score = sum(self.tally_hand()[1:])
|
||||||
|
else:
|
||||||
score = sum(self.tally_hand())
|
score = sum(self.tally_hand())
|
||||||
|
|
||||||
if score > 21 and 11 in self.tally_hand():
|
if score > 21 and 11 in self.tally_hand():
|
||||||
return score - 10
|
return score - 10
|
||||||
else:
|
else:
|
||||||
return score
|
return score
|
||||||
|
|
||||||
def bust(self):
|
def bust(self, game):
|
||||||
if self.score() > 21:
|
if self.score(game) > 21:
|
||||||
self.bust = True
|
return True
|
||||||
|
|
||||||
def blackjack(self):
|
def blackjack(self):
|
||||||
if self.tally_hand() in [[10,11],[11,10]]:
|
if self.tally_hand() in [[10,11],[11,10]]:
|
||||||
self.blackjack = True
|
return True
|
||||||
|
|
||||||
def check(self):
|
|
||||||
self.bust()
|
|
||||||
self.blackjack()
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
from src.cardprinter import CardPrinter
|
|
||||||
printer = CardPrinter()
|
|
||||||
|
|
||||||
class Screen:
|
class Screen:
|
||||||
title = '''\
|
def __init__(self):
|
||||||
|
self.title = '''\
|
||||||
|
|
||||||
.oPYo. 8 8 o 8
|
.oPYo. 8 8 o 8
|
||||||
8 `8 8 8 8 8
|
8 `8 8 8 8 8
|
||||||
|
@ -13,15 +11,89 @@ o8YooP' 8 .oPYo. .oPYo. 8 .o 8 .oPYo. .oPYo. 8 .o
|
||||||
:......:..:.....::.....:..::......::.....::.....:..::...
|
:......:..:.....::.....:..::......::.....::.....:..::...
|
||||||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::'''
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::'''
|
||||||
|
self.clear = '\033c'
|
||||||
|
self.intro = self.clear + self.title
|
||||||
|
self.deck = '''\
|
||||||
|
┌────────┐┐┐┐┐┐
|
||||||
|
│░░░░░░░░││││││
|
||||||
|
│░░░░░░░░││││││
|
||||||
|
│░░░░░░░░││││││
|
||||||
|
│░░░░░░░░││││││
|
||||||
|
│░░░░░░░░││││││
|
||||||
|
└────────┘┘┘┘┘┘'''
|
||||||
|
self.hidden_part = f'''\
|
||||||
|
┌──
|
||||||
|
│░░
|
||||||
|
│░░
|
||||||
|
│░░
|
||||||
|
│░░
|
||||||
|
│░░
|
||||||
|
└──'''
|
||||||
|
self.hidden_rest = f'''\
|
||||||
|
──────┐
|
||||||
|
░░░░░░│
|
||||||
|
░░░░░░│
|
||||||
|
░░░░░░│
|
||||||
|
░░░░░░│
|
||||||
|
░░░░░░│
|
||||||
|
──────┘'''
|
||||||
|
self.card_rest = f'''\
|
||||||
|
──────┐
|
||||||
|
│
|
||||||
|
│
|
||||||
|
│
|
||||||
|
│
|
||||||
|
│
|
||||||
|
──────┘'''
|
||||||
|
|
||||||
def update(self, player_list):
|
def make_card(self, vs, style):
|
||||||
print('\033c', end='')
|
value = vs[0]
|
||||||
|
value = '10' if value == '0' else value + ' '
|
||||||
|
suit = vs[1] + ' '
|
||||||
|
# request text (not emoji) render of preceeding glyph but can break some fonts
|
||||||
|
# suit += '\uFE0E'
|
||||||
|
|
||||||
|
card_part = f'''\
|
||||||
|
┌──
|
||||||
|
│{value}
|
||||||
|
│{suit}
|
||||||
|
│
|
||||||
|
│
|
||||||
|
│
|
||||||
|
└──'''
|
||||||
|
|
||||||
|
match style:
|
||||||
|
case 'deck':
|
||||||
|
return self.deck
|
||||||
|
case 'card_rest':
|
||||||
|
return self.card_rest
|
||||||
|
case 'hidden_part':
|
||||||
|
return self.hidden_part
|
||||||
|
case 'hidden_rest':
|
||||||
|
return self.hidden_rest
|
||||||
|
case 'card_part':
|
||||||
|
return card_part
|
||||||
|
|
||||||
|
def print_hand(self, player, game):
|
||||||
|
player_cards = [self.make_card(card,'card_part') for card in player.hand]
|
||||||
|
|
||||||
|
if player.name == 'Dealer' and game.active:
|
||||||
|
player_cards[0] = self.make_card('na','hidden_part')
|
||||||
|
|
||||||
|
player_cards.append(self.make_card('na','card_rest'))
|
||||||
|
card_slices = [str(card).splitlines() for card in player_cards]
|
||||||
|
|
||||||
|
for i in range(7):
|
||||||
|
clist = [card_slice[i] for card_slice in card_slices]
|
||||||
|
carriage = ''
|
||||||
|
for chunk in clist:
|
||||||
|
carriage += chunk
|
||||||
|
print(carriage)
|
||||||
|
|
||||||
|
def update(self, game):
|
||||||
|
print(self.clear)
|
||||||
print(self.title)
|
print(self.title)
|
||||||
for player in player_list:
|
for player in game.players:
|
||||||
print(' '+player.name,
|
print(' '+player.name,
|
||||||
'\t\t\t\t Score:',player.score())
|
'\t\t\t\t Score:',player.score(game))
|
||||||
printer.print_hand(player)
|
self.print_hand(player, game)
|
||||||
|
|
||||||
def show_intro(self):
|
|
||||||
print('\033c', end='')
|
|
||||||
print(self.title)
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue