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)]
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
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
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)
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)
def get_player_nodes(p): all_nodes = [] for edge in p.road_edges(): all_nodes.extend(hexgrid.nodes_touching_edge(edge)) return all_nodes