Begin implementing rules
This commit is contained in:
parent
4ad354354d
commit
857b26f4a3
|
@ -0,0 +1,310 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import random
|
||||||
|
|
||||||
|
class NoMoreCards(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Game(object):
|
||||||
|
def __init__(self, deck, rules):
|
||||||
|
self.players = []
|
||||||
|
self.drawdeck = deck
|
||||||
|
self.playdeck = Deck()
|
||||||
|
self.rules = rules
|
||||||
|
|
||||||
|
# Which index player's turn is it?
|
||||||
|
self.player_index = 0
|
||||||
|
print("Created game.")
|
||||||
|
|
||||||
|
def next_turn(self):
|
||||||
|
current_player = self.players[self.current_player]
|
||||||
|
print(f"Current player is {current_player}")
|
||||||
|
if self.player_index == len(self.players):
|
||||||
|
print(f"Reached the end of players: {self.players}, {self.current_player}")
|
||||||
|
self.current_player = 0
|
||||||
|
else:
|
||||||
|
self.current_player += 1
|
||||||
|
print(f"Incrementing current_player: {self.players}, {self.current_player}")
|
||||||
|
|
||||||
|
def add_players(self, *players):
|
||||||
|
for player in players:
|
||||||
|
print(f"Adding player: {player}")
|
||||||
|
self.players.append(player)
|
||||||
|
|
||||||
|
def deal(self):
|
||||||
|
for player in self.players:
|
||||||
|
num_cards = self.rules.initial_cards
|
||||||
|
cards = list(self.drawdeck.draw_num(num_cards))
|
||||||
|
print("Cards", cards)
|
||||||
|
player.deck.put_cards(*cards)
|
||||||
|
if self.rules.flipcard:
|
||||||
|
first_card = self.drawdeck.draw()
|
||||||
|
print(f"First card is: {first_card}")
|
||||||
|
self.playdeck.put(first_card)
|
||||||
|
|
||||||
|
def play_card(self, player, card):
|
||||||
|
print(f"Player {player} attempting to play {card}")
|
||||||
|
last_card = self.playdeck.last_card
|
||||||
|
print(f"Last card {last_card}")
|
||||||
|
is_playable = self.rules.is_playable_on(last_card, card)
|
||||||
|
print("Card is playable", is_playable)
|
||||||
|
#current_card = self.d
|
||||||
|
|
||||||
|
class Player(object):
|
||||||
|
def __init__(self, name):
|
||||||
|
self.name = name
|
||||||
|
self.deck = Hand()
|
||||||
|
print(f"Created player {name}")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return self.__str__()
|
||||||
|
|
||||||
|
class SetOfCards(object):
|
||||||
|
def __init__(self, *cards):
|
||||||
|
self.cards = []
|
||||||
|
if cards:
|
||||||
|
self.cards = [*cards]
|
||||||
|
print(f"Created deck with cards: {self.cards}")
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
card = self.cards.pop()
|
||||||
|
print(f"Drawing {card} from deck")
|
||||||
|
return card
|
||||||
|
|
||||||
|
def draw_num(self, num):
|
||||||
|
for i in range(0, num):
|
||||||
|
yield self.cards.pop()
|
||||||
|
|
||||||
|
def put(self, card):
|
||||||
|
print("Putting card on deck:", card)
|
||||||
|
self.cards.append(card)
|
||||||
|
|
||||||
|
def put_cards(self, *cards):
|
||||||
|
for card in cards:
|
||||||
|
self.put(card)
|
||||||
|
|
||||||
|
class Deck(SetOfCards):
|
||||||
|
def shuffle(self):
|
||||||
|
random.shuffle(self.cards)
|
||||||
|
print(f"Shuffled deck: {self.cards}")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def last_card(self):
|
||||||
|
if self.cards:
|
||||||
|
return self.cards[-1]
|
||||||
|
else:
|
||||||
|
raise NoMoreCards
|
||||||
|
|
||||||
|
class Hand(SetOfCards):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Rules(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.initial_cards = 2 # Number of cards to start with
|
||||||
|
self.flipcard = True # Initially flip a card
|
||||||
|
self.jacks_on_twos = False # Can we play Jacks on 2s?
|
||||||
|
self.jacks_on_eights = False # Can we play Jacks on 8s?
|
||||||
|
|
||||||
|
self.set_power_cards()
|
||||||
|
|
||||||
|
print("Created rules.")
|
||||||
|
|
||||||
|
def set_power_cards(self):
|
||||||
|
# Next player has to pick up two cards if they don't have a
|
||||||
|
# card of the same value
|
||||||
|
self.pick_up_two = Value(2)
|
||||||
|
# Next player has to skip a go if they don't have another
|
||||||
|
self.skip_a_turn = Value(8)
|
||||||
|
|
||||||
|
# How many cards to pick up
|
||||||
|
self.multiple_number = 6
|
||||||
|
pick_up_multiple_suits = [Suit("Spades"), Suit("Clubs")]
|
||||||
|
# Create a BlackJack filter
|
||||||
|
self.pick_up_multiple = Filter(pick_up_multiple_suits, Value("Jack"))
|
||||||
|
self.change_suit = Value("Ace")
|
||||||
|
|
||||||
|
self.specials_all = [self.pick_up_two,
|
||||||
|
self.skip_a_turn,
|
||||||
|
self.pick_up_multiple,
|
||||||
|
self.change_suit]
|
||||||
|
self.specials_power = self.specials_all[:-1]
|
||||||
|
print("Specials all", self.specials_all)
|
||||||
|
print("Power specials", self.specials_power)
|
||||||
|
|
||||||
|
|
||||||
|
def can_play_on_special(bottom_card, card):
|
||||||
|
# If the bottom card is a two
|
||||||
|
if bottom_card == self.pick_up_two:
|
||||||
|
# If the proposed card is not also the same
|
||||||
|
if card == self.pick_up_two:
|
||||||
|
return True
|
||||||
|
if self.jacks_on_twos:
|
||||||
|
if card == self.pick_up_mutiple:
|
||||||
|
return True
|
||||||
|
# We can only play 2s or Jacks if that is enabled
|
||||||
|
return False
|
||||||
|
# if the bottom card is a two
|
||||||
|
if bottom_card == self.skip_a_turn:
|
||||||
|
# if the proposed card is not also the same
|
||||||
|
if card == self.skip_a_turn:
|
||||||
|
return True
|
||||||
|
if self.jacks_on_eights:
|
||||||
|
# If the proposed card is a blackjack
|
||||||
|
if card == self.pick_up_multiple:
|
||||||
|
return True
|
||||||
|
# We can only play 8s or Jacks if that is enabled
|
||||||
|
return False
|
||||||
|
# If the bottom card is a Blackjack
|
||||||
|
if bottom_card == self.pick_up_multiple:
|
||||||
|
# If the card is the other Blackjack
|
||||||
|
if card == self.pick_up_multiple:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_playable_on(bottom_card, card):
|
||||||
|
if bottom_card in self.rules.specials_all:
|
||||||
|
return self.can_play_on_special(bottom_card, card)
|
||||||
|
if card.suit == bottom_card.suit:
|
||||||
|
return True
|
||||||
|
if card.val == buttom_card.val:
|
||||||
|
return True
|
||||||
|
|
||||||
|
class Suit(object):
|
||||||
|
def __init__(self, suit):
|
||||||
|
self.suit = suit
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"#{self.suit}"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return self.__str__()
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return other.suit == self.suit
|
||||||
|
|
||||||
|
class Value(object):
|
||||||
|
def __init__(self, val):
|
||||||
|
self.val = val
|
||||||
|
self.numeric_value = self.get_numeric_value(val)
|
||||||
|
|
||||||
|
def get_numeric_value(self, val):
|
||||||
|
hash_map = {"Jack": 11, "Queen": 12, "King": 13, "Ace": 14}
|
||||||
|
if val in hash_map:
|
||||||
|
return hash_map[val]
|
||||||
|
else:
|
||||||
|
return val
|
||||||
|
|
||||||
|
def __gt__(self, other):
|
||||||
|
return self.numeric_value > other.numeric_value
|
||||||
|
|
||||||
|
def __lt__(self, other):
|
||||||
|
return self.numeric_value < other.numeric_value
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if isinstance(other, Value):
|
||||||
|
return self.numeric_value == other.numeric_value
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f".{str(self.val)}"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return self.__str__()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def multiple(*vals):
|
||||||
|
for val in vals:
|
||||||
|
yield Value(val)
|
||||||
|
|
||||||
|
class Filter(object):
|
||||||
|
def __init__(self, suits, val):
|
||||||
|
self.suits = suits
|
||||||
|
self.val = val
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"|{self.val} of {self.suits}"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return self.__str__()
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
print("Filter EQ called")
|
||||||
|
print("other suit", other.suit)
|
||||||
|
print("our suits", self.suits)
|
||||||
|
print("other val", other.val)
|
||||||
|
print("our val", self.val)
|
||||||
|
if other.suit in self.suits and other.val == self.val:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
class Card(object):
|
||||||
|
def __init__(self, suit=None, val=None):
|
||||||
|
self.suit = Suit(suit)
|
||||||
|
self.val = Value(val)
|
||||||
|
print(f"Created card with suit {suit} and value {self.val}")
|
||||||
|
|
||||||
|
def playable_on(self, card):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"+({self.val} of {self.suit})"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return self.__str__()
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def multiple_suit(val, suits):
|
||||||
|
for suit in suits:
|
||||||
|
card = Card()
|
||||||
|
card.suit = suit
|
||||||
|
card.val = val
|
||||||
|
yield card
|
||||||
|
|
||||||
|
|
||||||
|
mark = Player("Mark")
|
||||||
|
john = Player("John")
|
||||||
|
|
||||||
|
card1 = Card("Spades", "Ace")
|
||||||
|
card2 = Card("Diamonds", "Jack")
|
||||||
|
card4 = Card("Clubs", 3)
|
||||||
|
card5 = Card("Diamonds", 3)
|
||||||
|
card6 = Card("Hearts", 4)
|
||||||
|
|
||||||
|
deck = Deck(card1, card2, card4, card5, card6)
|
||||||
|
deck.shuffle()
|
||||||
|
|
||||||
|
rules = Rules()
|
||||||
|
|
||||||
|
game = Game(deck, rules)
|
||||||
|
game.add_players(mark, john)
|
||||||
|
|
||||||
|
game.deal()
|
||||||
|
|
||||||
|
print("Mark's cards:", mark.deck.cards)
|
||||||
|
|
||||||
|
print("John's cards:", john.deck.cards)
|
||||||
|
|
||||||
|
val1 = Value("Queen")
|
||||||
|
val2 = Value(2)
|
||||||
|
val3 = Value("Queen")
|
||||||
|
assert val1 > val2
|
||||||
|
assert val2 < val1
|
||||||
|
assert val3 == val1
|
||||||
|
|
||||||
|
filter_blackjack = Filter([Suit("Spades"), Suit("Clubs")], Value("Jack"))
|
||||||
|
blackjack1 = Card("Spades", "Jack")
|
||||||
|
blackjack2 = Card("Clubs", "Jack")
|
||||||
|
|
||||||
|
redjack1 = Card("Diamonds", "Jack")
|
||||||
|
redjack2 = Card("Hearts", "Jack")
|
||||||
|
|
||||||
|
assert blackjack1 == filter_blackjack
|
||||||
|
assert blackjack2 == filter_blackjack
|
||||||
|
|
||||||
|
assert redjack1 != filter_blackjack
|
||||||
|
assert redjack2 != filter_blackjack
|
Loading…
Reference in New Issue