package towerofhanoi; import java.awt.Color; import java.awt.Rectangle; import java.util.Observable; import java.util.Observer; import java.util.Random; import CS2114.Button; import CS2114.Shape; import CS2114.Window; import CS2114.WindowSide; // Virginia Tech Honor Code Pledge: // // As a Hokie, I will conduct myself with honor and integrity at all times. // I will not lie, cheat, or steal, nor will I accept the actions of those who // do. // -- Jordan Harrington (jordanha23) /** * @author Jordan Harrington * @version <3/25/2020> */ public class PuzzleWindow implements Observer { private HanoiSolver game; private Shape left; private Shape right; private Shape middle; private Window window; public static final int WIDTH_FACTOR = 10; public static final int DISK_GAP = 0; public static final int DISK_HEIGHT = 5; /** * Constructor * * @param game * - the Hanoi game you want displayed */ PuzzleWindow(HanoiSolver game) { this.game = game; this.game.addObserver(this); window = new Window("Tower of Hanoi"); left = new Shape(100, 50, 5, 100, Color.RED); middle = new Shape(300, 50, 5, 100, Color.RED); right = new Shape(500, 50, 5, 100, Color.RED); for (int i = game.disks(); i > 0; i--) { int x = i * DISK_HEIGHT; Disk newDisk = new Disk(x); window.addShape(newDisk); game.getTower(Position.RIGHT).push(newDisk); moveDisk(Position.RIGHT); } window.addShape(this.left); window.addShape(this.middle); window.addShape(this.right); Button solveButton = new Button("Solve"); window.addButton(solveButton, WindowSide.SOUTH); solveButton.onClick(this, "clickedSolve"); } /** * Updates the window when disks are moved */ public void update(Observable o, Object arg) { if (arg.getClass() == Position.class) { Position args = (Position)arg; moveDisk(args); sleep(); } } /** * Pauses between disk movements */ private void sleep() { try { Thread.sleep(500); } catch (Exception e) { } } /** * Gives the solve button a function * * @param button * - the button to be clicked */ public void clickedSolve(Button button) { button.disable(); new Thread() { public void run() { game.solve(); } }.start(); } /** * Moves the disk in the game * * @param position * - the position you want the disk moved to */ private void moveDisk(Position position) { Disk currentDisk = game.getTower(position).peek(); Shape currentPole = new Shape(0, 0); if (position == Position.LEFT) { currentPole = left; } else if (position == Position.RIGHT) { currentPole = right; } else { currentPole = middle; } int nextX = currentPole.getX() - (currentDisk.getWidth() / 2) + (currentPole.getWidth() / 2); int nextY = currentPole.getY() - game.getTower(position).size() * DISK_HEIGHT + currentPole.getHeight(); currentDisk.moveTo(nextX, nextY); } }