import java.util.Scanner;

public class TowersOfHanoi {
   
   ///////////////////////////////////  
   // ADD ANY NEEDED CONSTANTS HERE //  
   ///////////////////////////////////  

   ////////////////////////////////////////////
   // ADD ANY NEEDED INSTANCE VARIABLES HERE //
   ////////////////////////////////////////////

   //////////////////////////////////////
   // ADD ANY NEEDED CONSTRUCTORS HERE //
   //////////////////////////////////////
   
   private int baseWidth() {
      return 2*maxNumDisks+1;
   }
   
   private String pad(int diskWidth) {
      String s = (diskWidth == 0 ? " " : "");
      for (int i = 0; i < diskWidth; i++) 
         s += "\u2587";
      int padding = (this.baseWidth()-diskWidth)/2;
      for (int i = 0; i < padding; i++)
         s = " " + s + " ";
      return s;
   }
   
   public String toString() {
      // draw disks..
      String s = "";
      for (int level = maxNumDisks-1; level >= 0; level--) {
         for (int tower = 0; tower < 3; tower++) {
            s += pad(diskWidths[tower][level]);
         }
         s += System.lineSeparator();
      }

      // draw "floor" and number the piles/pegs..
      for (int i = 0; i < 3*this.baseWidth(); i++) s += "=";
      s += System.lineSeparator();
      for (int i = 0; i < this.baseWidth()/2; i++) s += " ";
      s += "0";
      for (int i = 0; i < this.baseWidth()-1; i++) s += " ";
      s += "1";
      for (int i = 0; i < this.baseWidth()-1; i++) s += " ";
      s += "2";
      return s;
   }
   
   /////////////////////////////////////////////////////
   // ADD ANY ADDITIONAL NEEDED INSTANCE METHODS HERE //
   /////////////////////////////////////////////////////

   public static void main(String[] args) {
      System.out.println("How many disks do you want to use?");
      Scanner scanner = new Scanner(System.in);
      String line = scanner.nextLine();
      Scanner lineScanner = new Scanner(line);
      int numDisks = lineScanner.nextInt();
      lineScanner.close();
      
      System.out.println(System.lineSeparator() + "Goal: Move all the disks from pile 0 to pile 2" + System.lineSeparator());
      System.out.println("Restrictions: You can only move a top-most disk " + System.lineSeparator() +
                       "from one pile onto another pile that is either " + System.lineSeparator() +
                       "empty or whose top-most disk is larger than the one " + System.lineSeparator() +
                       "moved" + System.lineSeparator());
      System.out.println("To move a disk from pile X to pile Y: " + System.lineSeparator() +
                       "Type 'XY' and then hit 'enter'" + System.lineSeparator());
      
      TowersOfHanoi toh = new TowersOfHanoi(numDisks);
      System.out.println(toh);
      
      while (! toh.won() && scanner.hasNextLine()) {
         
         line = scanner.nextLine();
         
         int from = line.charAt(0)-'0';
         int to = line.charAt(1)-'0';
         
         if (toh.legalMove(from,to)) {
            toh.move(from,to);
            System.out.println(toh);
         }
         else {
            System.out.println("ILLEGAL MOVE");
         }
      }
      System.out.println("YOU DID IT!");
      scanner.close();
   }
}
