def test_filter_can_get_a_copy(self): supply = Supply(2, FIRST_GAME) filtered_supply = supply.filter([lambda card, num: card == COPPER]) filtered_supply.take(COPPER) self.assertEquals(59, filtered_supply.get_number_of_cards(COPPER)) self.assertEquals(60, supply.get_number_of_cards(COPPER)) self.assertEquals([COPPER], filtered_supply.get_cards())
def test_can_get_empty_piles(self): supply = Supply(2, FIRST_GAME) for _ in range(10): supply.take(MOAT) supply.take(REMODEL) supply.take(MARKET) self.assertEquals(3, supply.get_number_of_empty_piles())
def __init__(self, players, game_set): self.players = players self.set_up_listeners() self.supply = Supply(len(players), game_set) for number, player in enumerate(players, start=1): try: send_player_info(player, number, 1) except: raise Exception( "Player {} did not respond correctly".format(number)) self.deal_starting_cards(player) broadcast_message( players, CommandGenerator().create_game_info_message( [p.name for p in players], self.supply.get_kingdom_cards()))
def test_cant_take_card_not_if_pile_is_empty(self): supply = Supply(2, FIRST_GAME) for _ in range(8): supply.take(DUCHY) with self.assertRaisesRegexp(PileEmptyException, "duchy's pile is empty"): supply.take(DUCHY)
def test_first_set_four_players(self): supply = Supply(4, FIRST_GAME) self.check_first_set_kingdom_and_treasure_cards(supply) self.assertEquals(24, supply.get_number_of_cards(ESTATE)) self.assertEquals(12, supply.get_number_of_cards(DUCHY)) self.assertEquals(12, supply.get_number_of_cards(PROVINCE)) self.assertEquals(30, supply.get_number_of_cards(CURSE))
def test_can_get_kingdom_cards(self): supply = Supply(2, FIRST_GAME) self.assertEquals((CELLAR, MARKET, MILITIA, MINE, MOAT, REMODEL, SMITHY, VILLAGE, WOODCUTTER, WORKSHOP), supply.get_kingdom_cards())
def test_no_piles_are_empty_to_start(self): supply = Supply(2, FIRST_GAME) self.assertEquals(0, supply.get_number_of_empty_piles())
def test_cant_take_card_not_in_supply(self): supply = Supply(2, FIRST_GAME) with self.assertRaisesRegexp(CardNotInSupplyException, "feast is not in the supply"): supply.take(FEAST)
def test_take_card_decreases_supply_appropriately(self): supply = Supply(2, FIRST_GAME) supply.take(PROVINCE) self.assertEquals(7, supply.get_number_of_cards(PROVINCE))
class DominionEngine(object): def __init__(self, players, game_set): self.players = players self.set_up_listeners() self.supply = Supply(len(players), game_set) for number, player in enumerate(players, start=1): try: send_player_info(player, number, 1) except: raise Exception( "Player {} did not respond correctly".format(number)) self.deal_starting_cards(player) broadcast_message( players, CommandGenerator().create_game_info_message( [p.name for p in players], self.supply.get_kingdom_cards())) def deal_starting_cards(self, player): for _ in range(3): self.supply.take(ESTATE) player.gain_cards([ESTATE]) for _ in range(7): self.supply.take(COPPER) player.gain_cards([COPPER]) player.draw_cards(5) def set_up_listeners(self): for number, player in enumerate(self.players, start=1): listener = EventListener(number, self.players) player.add_event_listener(listener) def run_until_game_end(self): max_number_of_turns = 500 * len(self.players) for player in islice(cycle(self.players), max_number_of_turns): if self.is_game_over(): break send_supply_info(player, self.supply) try: send_turn_request(player, self.supply) except: #bot messed up, turn skipped pass player.mark_turn_taken() scores = [p.get_score() for p in self.players] winners = [ "player{}".format(i) for i, p in enumerate(self.players, start=1) if p in self.get_winners() ] broadcast_message( self.players, CommandGenerator().create_game_end_message(scores, winners)) def is_game_over(self): return self.supply.get_number_of_empty_piles( ) >= 3 or self.supply.get_number_of_cards(Identifiers.PROVINCE) == 0 def get_winners(self): winning_players = [] highest_score = max([player.get_score() for player in self.players]) highest_score_players = [ player for player in self.players if player.get_score() == highest_score ] lowest_turns = min([ player.get_number_of_turns_taken() for player in highest_score_players ]) winners = [ player for player in highest_score_players if player.get_number_of_turns_taken() == lowest_turns ] return winners