def next_action(self, percept, random_generator): if {"x": 0, "y": 0, "looks_like": "dirt"} in percept["entities"]: return PickUp() targets = set() obstructions = set() for key in self.passable: coords = key[1:-1].split(",") x = int(coords[0]) y = int(coords[1]) if self.passable[key]: for pos in [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]: if str(pos) not in self.passable: targets.add(pos) else: obstructions.add((x, y)) if not targets: return DoNothing() my_x = percept["position"]["x"] my_y = percept["position"]["y"] problem = PathfindingProblem((my_x, my_y), targets, obstructions, []) try: plan = a_star_graph(problem, get_heuristic(problem)) return Move(direction=plan[0]) except NoSolutionError: return DoNothing()
def next_action(self, percept, random_generator): if {"x": 0, "y": 0, "looks_like": "dirt"} in percept["entities"]: return PickUp() if percept["position"]["x"] == 1 and not self.moved: return Move(direction="right") if percept["position"]["x"] == 2 and not self.moved: return Move(direction="left") return DoNothing()
def next_action(self, percept, random_generator): dirt_count = len( [e for e in percept["entities"] if e["looks_like"] == "dirt"]) if {"x": 0, "y": 0, "looks_like": "dirt"} in percept["entities"]: return PickUp() if percept["position"]["x"] == 1 and dirt_count > 0: return Move(direction="right") if percept["position"]["x"] == 2 and dirt_count > 0: return Move(direction="left") return DoNothing()
def test_vanish_pickup(): system = PickUpSystem() pickupper_components = {"pickupper": Pickupper(mode="action")} inventory_components = {} actions = {"pickupper": PickUp()} position_components = PositionDict({ "pickupper": Position(x=0, y=0), "item": Position(x=0, y=0) }) pickup_components = {"item": VanishPickup(kind="vanish")} score_components = {} removed_entities = system.pick_up_items( pickupper_components, actions, position_components, pickup_components, score_components, inventory_components) assert removed_entities == set(["item"])
def test_pickup_item(): system = PickUpSystem() pickupper_components = {"pickupper": Pickupper(mode="action")} inventory_components = {"pickupper": Inventory()} actions = {"pickupper": PickUp()} position_components = PositionDict({ "pickupper": Position(x=0, y=0), "item": Position(x=0, y=0) }) pickup_components = {"item": ItemPickup(kind="item")} score_components = {} removed_entities = system.pick_up_items( pickupper_components, actions, position_components, pickup_components, score_components, inventory_components) assert inventory_components["pickupper"] == Inventory(items=["item"]) assert "item" not in position_components assert removed_entities == set()
def next_action(self, percept, random_generator): if (self.manual_pickup and {"x": 0, "y": 0, "looks_like": "coin"} in percept["entities"]): return PickUp() walls = [(e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "wall"] coins = [(e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "coin"] if not coins: return DoNothing() problem = PathfindingProblem((0, 0), coins, walls, []) try: plan = a_star_graph(problem, get_heuristic(problem)) return Move(direction=plan[0]) except NoSolutionError: return DoNothing()
def next_action(self, percept, random_generator): if not self.plan: return DoNothing() # Parse percept missionaries = set((e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "coin") cannibals = set((e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "evilCoin") grass = set((e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "grass") dirt = set((e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "dirt") empty_shore = (grass | dirt) - missionaries - cannibals walls = set((e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "wall") water = set((e["x"], e["y"]) for e in percept["entities"] if e["looks_like"] == "water") goal = self.plan[0] # First, ensure inventory is correct too_many_missionaries = percept["inventory"].count( "coin") > goal.missionaries too_many_cannibals = percept["inventory"].count( "evilCoin") > goal.cannibals if too_many_missionaries or too_many_cannibals: if (0, 0) in empty_shore: if too_many_missionaries: return Drop(index=percept["inventory"].index("coin")) if too_many_cannibals: return Drop(index=percept["inventory"].index("evilCoin")) problem = PathfindingProblem((0, 0), empty_shore, walls | water, []) return Move( direction=a_star_graph(problem, get_heuristic(problem))[0]) too_few_missionaries = percept["inventory"].count( "coin") < goal.missionaries if too_few_missionaries: if (0, 0) in missionaries: return PickUp() problem = PathfindingProblem((0, 0), missionaries, walls | water, []) return Move( direction=a_star_graph(problem, get_heuristic(problem))[0]) too_few_cannibals = percept["inventory"].count( "evilCoin") < goal.cannibals if too_few_cannibals: if (0, 0) in cannibals: return PickUp() problem = PathfindingProblem((0, 0), cannibals, walls | water, []) return Move( direction=a_star_graph(problem, get_heuristic(problem))[0]) # Then, go to the correct shore if goal.destination == "dirt": problem = PathfindingProblem((0, 0), dirt, walls, []) return Move( direction=a_star_graph(problem, get_heuristic(problem))[0]) else: problem = PathfindingProblem((0, 0), grass, walls, []) return Move( direction=a_star_graph(problem, get_heuristic(problem))[0])
def next_action(self, percept, random_generator): if {"x": 0, "y": 0, "looks_like": "dirt"} in percept["entities"]: return PickUp() direction = random_generator.choice(["up", "down", "left", "right"]) return Move(direction=direction)