Пример #1
0
 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())
Пример #2
0
 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())
Пример #3
0
 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()))
Пример #4
0
 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)
Пример #5
0
    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))
Пример #6
0
 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())
Пример #7
0
 def test_no_piles_are_empty_to_start(self):
     supply = Supply(2, FIRST_GAME)
     self.assertEquals(0, supply.get_number_of_empty_piles())
Пример #8
0
 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)
Пример #9
0
 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))
Пример #10
0
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