package org.teachingextensions.logo.utils.PuzzleUtils; import java.util.HashSet; import java.util.List; import java.util.Queue; import java.util.Set; /** * A player solves puzzles using a certain style. */ public abstract class PuzzlePlayer { private final Puzzle puzzle; private final Set<PuzzleState> visited = new HashSet<>(); private final Queue<PuzzleState> frontier; public PuzzlePlayer(Puzzle puzzle, Queue<PuzzleState> frontier) { this.puzzle = puzzle; this.frontier = frontier; } protected Set<PuzzleState> getVisited() { return visited; } protected Queue<PuzzleState> getFrontier() { return frontier; } protected Puzzle getPuzzle() { return puzzle; } public PuzzleState solve() { PuzzleState state = new PuzzleState(this.getPuzzle()); do { getVisited().add(state); if (!state.isSolution()) { this.search(state); if (getFrontier().isEmpty()) { throw new IllegalStateException("Cannot solve puzzle."); } state = getFrontier().remove(); } } while (!state.isSolution()); return state; } protected void search(PuzzleState state) { List<PuzzleState> branches = state.getBranches(); for (PuzzleState b : branches) { if (!getVisited().contains(b)) { getFrontier().add(b); } } } }