示例#1
0
 def __buildable_nodes(self, player: Player.Player, pre_game: bool = False) -> List[int]:
     player_nodes = set()
     if pre_game:
         return [node for node in hexgrid.legal_node_coords() if self.__is_distant_node(node)]
     else:
         for edge_id in player.road_edges():
             for node in hexgrid.nodes_touching_edge(edge_id):
                 if self.board().nodes().get(node) is None:
                     player_nodes.add(node)
         return [node for node in player_nodes if self.__is_distant_node(node)]
示例#2
0
 def _player_has_port(self, player, port):
     edge_coord = hexgrid.edge_coord_in_direction(port.tile_id, port.direction)
     for node in hexgrid.nodes_touching_edge(edge_coord):
         pieces = self.board.get_pieces((catan.pieces.PieceType.settlement, catan.pieces.PieceType.city), node)
         if len(pieces) < 1:
             continue
         elif len(pieces) > 1:
             raise Exception("Probably a bug, num={} pieces found on node={}".format(len(pieces), node))
         assert len(pieces) == 1  # will be asserted by previous if/elif combo
         piece = pieces[0]
         if piece.owner == player:
             return True
     return False
示例#3
0
文件: game.py 项目: kvudata/catan-py
 def _player_has_port(self, player, port):
     edge_coord = hexgrid.edge_coord_in_direction(port.tile_id,
                                                  port.direction)
     for node in hexgrid.nodes_touching_edge(edge_coord):
         pieces = self.board.get_pieces((catan.pieces.PieceType.settlement,
                                         catan.pieces.PieceType.city), node)
         if len(pieces) < 1:
             continue
         elif len(pieces) > 1:
             raise Exception(
                 'Probably a bug, num={} pieces found on node={}'.format(
                     len(pieces), node))
         assert len(
             pieces) == 1  # will be asserted by previous if/elif combo
         piece = pieces[0]
         if piece.owner == player:
             return True
     return False
示例#4
0
    def road_len(self, player: Player) -> int:
        graph = {}
        for edge in player.road_edges():
            node1, node2 = hexgrid.nodes_touching_edge(edge)
            if node1 not in graph:
                graph[node1] = set()
            if node2 not in graph:
                graph[node2] = set()
            graph[node1].add(node2)
            graph[node2].add(node1)
        # print(player)
        # for n, vals in graph.items():
        #     print(hex(n), [hex(v) for v in vals])
        # print('NODES')
        # for n, vals in self.nodes().items():
        #     print(hex(n), vals.player())

        return self.__calc_road_len(player, graph)
示例#5
0
    def __buildable_edges(self, player: Player.Player) -> List[int]:
        player_nodes = set()
        for road_edge in player.road_edges():
            for node in hexgrid.nodes_touching_edge(road_edge):
                player_nodes.add(node)

        adj_edges = set()
        for node in player_nodes:
            for edge_id in self.board().get_adj_edges_to_node(node):
                adj_edges.add(edge_id)

        for existing_edge in player.road_edges():
            if existing_edge in adj_edges:
                adj_edges.remove(existing_edge)

        to_remove = []
        for edge in adj_edges:
            if edge not in hexgrid.legal_edge_coords() or self.board().edges().get(edge) is not None:
                to_remove.append(edge)

        for edge in to_remove:
            adj_edges.remove(edge)

        return list(adj_edges)
示例#6
0
 def get_player_nodes(p):
     all_nodes = []
     for edge in p.road_edges():
         all_nodes.extend(hexgrid.nodes_touching_edge(edge))
     return all_nodes