package org.teachingextensions.logo.utils.PuzzleUtils; import javax.swing.SwingUtilities; /** * Animates a puzzle from its initial state to its solution. */ public class PuzzleAnimation implements Runnable { private final PuzzleBoard board; public PuzzleAnimation(PuzzleBoard board) { this.board = board; } private static void update(PuzzleBoard board) { boolean done = animate(board); if (!done) { return; } moveNextTile(board); } private static void moveNextTile(PuzzleBoard board) { if (board.hasMoves()) { TileMove move = board.getNextMove(); board.swap(move.getStart(), move.getEnd()); } } private static boolean animate(PuzzleBoard board) { Tile[] tiles = board.getTiles(); for (Tile tile : tiles) { if (tile != null && !tile.isAtTarget()) { tile.step(); return false; } } return true; } @Override public void run() { while (board.isVisible()) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { board.repaint(); } }); update(board); try { Thread.sleep(10); } catch (InterruptedException ignored) { } } } }