package towerofhanoi; import java.util.Observable; // 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 HanoiSolver extends Observable { private Tower left; private Tower right; private Tower middle; private int numDisks; /** * * @param numDisks * - the number of disks in the game */ HanoiSolver(int numDisks) { this.numDisks = numDisks; left = new Tower(Position.LEFT); right = new Tower(Position.RIGHT); middle = new Tower(Position.MIDDLE); } /** * Getter for the number of disks * * @return the number of disks */ public int disks() { return numDisks; } /** * Getter for the right, left, and middle, towers * * @param pos * - the position of the tower * @return the tower at that position */ public Tower getTower(Position pos) { if (pos == Position.RIGHT) { return right; } else if (pos == Position.LEFT) { return left; } return middle; } /** * toString method * * @return a string signifying which disks are on which rod */ public String toString() { StringBuilder str = new StringBuilder(""); str.append(this.left.toString()); str.append(this.middle.toString()); str.append(this.right.toString()); return str.toString(); } /** * Allows you to move a disk from one tower to another * * @param source * - the tower you're moving the disk from * @param destination * - the tower you're moving the disk to */ private void move(Tower source, Tower destination) { Disk moved = source.pop(); destination.push(moved); this.setChanged(); notifyObservers(destination.position()); } /** * Helper method to solve the game * * @param currentDisks * - the amount of disk being moved * @param startPole * - the pole you start with * @param tempPole * - the pole used to transfer * @param endPole * - the end goal */ private void solveTowers( int currentDisks, Tower startPole, Tower tempPole, Tower endPole) { if (currentDisks == 1) { move(startPole, endPole); } else { solveTowers(currentDisks - 1, startPole, endPole, tempPole); move(startPole, endPole); this.solveTowers(currentDisks - 1, tempPole, startPole, endPole); } } /** * solves the game */ public void solve() { solveTowers(numDisks, right, middle, left); } }