Example #1
0
 def __init__(self, context: Context):
     self.context = context
     self.clues = Clues(context)
     self.knowledge_table = KnowledgeTable(self.context.players,
                                           self.context.cards)
     self.brute_forcer = BruteForcer(self.clues, self.knowledge_table)
     self.deriver = Deriver(self.clues, self.knowledge_table)
Example #2
0
 def test_add_info_from_clues(self):
     clues = Clues(context_fixture)
     clues.add_card(Cards.BLAAUWVANDRAET, tom)
     clues.add_card(Cards.KANDELAAR, tom)
     rumour_cards = [
         Cards.BLAAUWVANDRAET, Cards.KANDELAAR, Cards.GASTENVERBLIJF
     ]
     clues.add_rumour(
         Rumour(menno, rumour_cards, [(menno, Knowledge.FALSE),
                                      (michiel, Knowledge.TRUE)]))
     watson = self.empty_watson
     watson.add_info_from_clues(clues)
     for card in rumour_cards:
         for player in context_fixture.players:
             if (card is Cards.KANDELAAR
                     or card is Cards.BLAAUWVANDRAET) and player is tom:
                 self.assertEqual(
                     Knowledge.TRUE,
                     watson.get_knowledge_table().get(player, card))
             elif card is Cards.GASTENVERBLIJF and player is michiel:
                 self.assertEqual(
                     Knowledge.TRUE,
                     watson.get_knowledge_table().get(player, card))
             else:
                 self.assertEqual(
                     Knowledge.FALSE,
                     watson.get_knowledge_table().get(player, card))
Example #3
0
class Watson:
    def __init__(self, context: Context):
        self.context = context
        self.clues = Clues(context)
        self.knowledge_table = KnowledgeTable(self.context.players,
                                              self.context.cards)
        self.brute_forcer = BruteForcer(self.clues, self.knowledge_table)
        self.deriver = Deriver(self.clues, self.knowledge_table)

    def add_knowledge(self, player: Player, card: Card, knowledge: Knowledge):
        self.clues.add_card(card, player)
        self.deriver.derive_from_new_knowledge(player, card, knowledge)
        self.brute_force_and_derive_from_findings()

    def add_rumour(self, rumour: Rumour) -> None:
        self.clues.add_rumour(rumour)
        self.deriver.derive_from_new_rumour(rumour)
        self.brute_force_and_derive_from_findings()

    def brute_force_and_derive_from_findings(self):
        for player in self.context.players:
            for card in self.context.cards:
                if self.knowledge_table.get(player, card) == Knowledge.MAYBE:
                    knowledge = self.brute_forcer.brute_force_on_card(
                        player, card)
                    if knowledge != Knowledge.MAYBE:
                        self.deriver.derive_from_new_knowledge(
                            player, card, knowledge)

    def add_info_from_clues(self, clues: Clues):
        self._add_cards_from_clues(clues)
        self._add_rumours_from_clues(clues)
        self.brute_force_and_derive_from_findings()

    def _add_cards_from_clues(self, clues):
        for player, cards in clues.cards_seen.items():
            for card in cards:
                self.clues.add_card(card, player)
                self.deriver.derive_from_new_knowledge(player, card,
                                                       Knowledge.TRUE)

    def _add_rumours_from_clues(self, clues):
        for rumour in clues.get_rumours():
            self.clues.add_rumour(rumour)
            self.deriver.derive_from_new_rumour(rumour)

    def display_state(self) -> str:
        formatter = KnowledgeTableFormatter()
        return formatter.format_knowledge_table(self.knowledge_table)

    def get_knowledge_table(self) -> KnowledgeTable:
        return self.knowledge_table

    def get_context(self) -> Context:
        return self.context

    def get_clues(self) -> Clues:
        return self.clues
Example #4
0
def load_clues(filename: str) -> Clues:
    with open(filename, 'r') as file:
        config = json.load(file)

    players_json = config["players"]
    cards_json = config["cards"]
    open_cards_json = config["open_cards"]
    cards_seen_json = config["cards_seen"]
    rumours_json = config["rumours_made"]

    check_if_all_categories_present(cards_json)

    all_cards = retrieve_cards(cards_json)
    players = retrieve_players(players_json)
    open_cards = retrieve_open_cards(all_cards, open_cards_json)

    used_cards = [c for c in all_cards if c not in open_cards]

    cards_seen = retrieve_cards_seen(all_cards, cards_seen_json, players)
    rumours = retrieve_rumours(players, rumours_json, used_cards)
    clues = Clues(Context(players, used_cards, open_cards))

    add_cards_to_clues(cards_seen, clues)
    add_rumours_to_clues(rumours, clues)

    return clues
Example #5
0
 def __init__(self, clues: Clues, knowledge_table: KnowledgeTable):
     self.clues = clues
     self.context = clues.get_context()
     self.knowledge_table = knowledge_table
     self.available_players_for_card = {}
     self.player_hands = {}
     self.start_time = time.time()
Example #6
0
    def setUp(self) -> None:
        context = context_fixture
        self.empty_solution_finder = SolutionFinder(Clues(context),
                                                    KnowledgeTable(context.players, context.cards))

        knowledge_table = KnowledgeTable(context.players, context.cards)
        tom_cards = [Cards.BLAAUWVANDRAET, Cards.BUBBELBAD, Cards.BIJL, Cards.HALTER]
        menno_cards = [Cards.ROODHART, Cards.ZITKAMER, Cards.KNUPPEL, Cards.GASTENVERBLIJF]
        michiel_cards = [Cards.DEWIT, Cards.THEATER, Cards.TOUW]
        for card in tom_cards:
            knowledge_table.set(tom, card, Knowledge.TRUE)
        for card in menno_cards:
            knowledge_table.set(menno, card, Knowledge.TRUE)
        for card in michiel_cards:
            knowledge_table.set(michiel, card, Knowledge.TRUE)
        self.half_full_solution_finder = SolutionFinder(Clues(context), knowledge_table)
Example #7
0
def save_clues_to_file_object(clues: Clues, file_object):
    context = clues.context
    config = {
        "players":
        players_of_context_to_json_object(context.players),
        "cards":
        cards_of_context_to_json_object(context.cards + context.open_cards),
        "open_cards":
        cards_to_json_object(context.open_cards),
        "cards_seen":
        cards_seen_to_json_object(clues.cards_seen),
        "rumours_made":
        rumours_to_json_object(clues.get_rumours())
    }

    json.dump(config, file_object, indent=2)
Example #8
0
 def setUp(self) -> None:
     clues = Clues(context_fixture)
     self.context = clues.get_context()
     self.empty_knowledge_table = KnowledgeTable(self.context.players,
                                                 self.context.cards)
     self.empty_deriver = Deriver(clues, self.empty_knowledge_table)
Example #9
0
def add_rumours_to_clues(rumours: List[Rumour], clues: Clues):
    for r in rumours:
        clues.add_rumour(r)
Example #10
0
def add_cards_to_clues(cards_seen: Dict[Player, List[Card]], clues: Clues):
    for player, cards in cards_seen.items():
        for c in cards:
            clues.add_card(c, player)
Example #11
0
 def setUp(self) -> None:
     self.knowledge_table = KnowledgeTable(context_fixture.players,
                                           context_fixture.cards)
     self.clues = Clues(context_fixture)
     self.empty_brute_forcer = BruteForcer(self.clues, self.knowledge_table)