Beispiel #1
0
    def make_guess(self, game, drawn_tile, is_optional=False, view=None):
        if view:
            view.canvas.draw_game(game, drawn_tile=drawn_tile)

        # Choose a player
        prompt = "\nOf which player you want to guess a tile?" + (
            "\nType -1 to not guess" if is_optional else "")
        player_name = int(
            self.save_prompt(
                prompt,
                list({str(p.name)
                      for p in game.players} - {str(self.name)}) + ['-1'],
                view.master))
        if is_optional and player_name == -1:
            return None, None, None
        chosen_player = [p for p in game.players if p.name == player_name][0]

        # Choose a tile idx
        prompt = "\nWhat is the idx of the tile? (Starting at 1)"
        tile_idx = int(
            self.save_prompt(
                prompt,
                [str(idx + 1)
                 for idx in range(len(chosen_player.tiles))], view.master)) - 1

        # Choose the tile
        prompt = "\nWhat tile do you think the player has. (Enter as b1 or w2)"
        guess = Tile.from_string(
            self.save_prompt(
                prompt,
                [str(t) for t in Tile.complete_set(game.max_tile_number)],
                view.master))

        return chosen_player, tile_idx, guess
Beispiel #2
0
    def __init__(self,
                 amount_of_players=3,
                 amount_of_starting_tiles=4,
                 max_tile_number=7,
                 player_classes=SimpleRandomPlayer,
                 add_human_player=False):
        if not isinstance(player_classes, list):
            player_classes = [player_classes] * amount_of_players

        self.max_tile_number = max_tile_number
        self.unplayed_tiles = Tile.complete_set(max_number=max_tile_number)

        # random.seed(9)
        random.shuffle(self.unplayed_tiles)

        self.players = []
        for name, player_class in zip(list(range(amount_of_players)),
                                      player_classes):
            p = player_class(self.unplayed_tiles[:amount_of_starting_tiles],
                             name)
            self.unplayed_tiles = self.unplayed_tiles[
                amount_of_starting_tiles:]
            self.players.append(p)

        if add_human_player:
            self.players.append(
                HumanControlledPlayer(
                    self.unplayed_tiles[:amount_of_starting_tiles],
                    len(self.players)))
            self.unplayed_tiles = self.unplayed_tiles[
                amount_of_starting_tiles:]

        self.current_player_idx = 0
Beispiel #3
0
    def make_guess(self, game, drawn_tile, is_optional=False, view=None):
        if is_optional:
            return None, None, None
        possible_tiles = list(
            set(Tile.complete_set(max_number=game.max_tile_number)) -
            self.all_known_tiles(game) - {drawn_tile})

        # Try to get the player with the most invisible tiles
        chosen_player = sorted(
            [p for p in game.players if p.name != self.name],
            key=lambda p: len([t for t in p.tiles if not t.visible]),
            reverse=True)[0]

        # Either choose high or low tile according to invisible tiles of the chosen player
        half_tiles_idx = len(chosen_player.tiles) // 2

        if len([t for t in chosen_player.tiles[:half_tiles_idx] if not t.visible]) > \
                len([t for t in chosen_player.tiles[half_tiles_idx:] if not t.visible]):
            # Choose a low possible tile
            tile_idx, chosen_tile = sorted(
                list(enumerate(chosen_player.tiles)),
                key=lambda p: (p[1].visible, p[0]))[0]
            guess = exponential_random_choice(
                sorted([
                    t for t in possible_tiles if t.color == chosen_tile.color
                ]))
        else:
            # Choose a high possible tile
            tile_idx, chosen_tile = sorted(
                list(enumerate(chosen_player.tiles)),
                key=lambda p: (p[1].visible, -p[0]))[0]
            guess = exponential_random_choice(
                sorted([
                    t for t in possible_tiles if t.color == chosen_tile.color
                ],
                       reverse=True))

        return chosen_player, tile_idx, guess
 def unknown_tiles(self):
     return list(
         set(Tile.complete_set(self.max_tile_number)) -
         set(self.known_tiles))