Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

/* HanoiClient * Anderson, Franceschi */ import javax.swing.JOptionPane; import

ID: 3846427 • Letter: #

Question

/* HanoiClient
* Anderson, Franceschi
*/

import javax.swing.JOptionPane;
import javax.swing.JFrame;
import java.awt.Graphics;

public class HanoiClient extends JFrame
{
private TowersOfHanoi tOfH;
boolean started = false;

public HanoiClient()
{
    tOfH = new TowersOfHanoi(4);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 300);
    setVisible(true);
}

public TowersOfHanoi getTOfH()
{
    return tOfH;
}

public void setStarted(boolean b)
{
    started = b;
}

public void recursiveTOfH(int numDisks, int fromTower, int toTower, int useTower)
{
    // ***** Student writes the body of this method *****
    //
    // Using recursion, transfer numDisks disks from the tower
    // fromTower to the tower toTower using the tower
    // useTower

    // The disks are numbered as follows: if we started with n disks,
    // the disk at the top is disk # 1
    // and the disk at the bottom is disk # n
    // We call the moveDisk method inside the body of this method
    // The moveDisk method moves one disk and takes 3 arguments:
    // an int, representing the disk number to be moved
    // an int, representing the tower to move the disk from
    // an int, representing the tower to move the disk to
    // So if these three variables are:
    // diskNumber, fromTower, and toTower
    // then the call to moveDisks will be:
    // moveDisk(diskNumber, fromTower, toTower);
    if (numDisks > 0)
    {
      // Student code starts here:

      // 1. Move (numDisks - 1) disks from fromTower
      //   to useTower using toTower

      // 2. Move one disk from fromTower to toTower
      //   Print a message to the screen, then
      //   call moveDisk in order to animate.

      // 3. Move (numDisks - 1) disks from useTower to toTower
      //   using fromTower

    }

    // Base case: 0 disks to move ==> do nothing
    //
    // Student code ends here.
}

public void moveDisk(int diskNumber, int fromTower, int toTower)
{
    repaint();
    try
    {
      Thread.sleep(1000);      // wait for the animation to finish
    }
    catch (Exception e)
    {
    }
    // update parameters
    tOfH.updateTowers(diskNumber, fromTower, toTower);
}

public void paint(Graphics g)
{
    if (started)
    {
      super.paint(g);
      tOfH.draw(g);
    }
}

public int getNumberOfDisks()
{
    boolean goodInput = false;
    int numberDisks = 4; // will be reassigned - default is 4
    while (!goodInput)
    {
      try
      {
        String answer = JOptionPane.showInputDialog(null, "Enter number of disks between 1 and 9");
        if (answer != null)
        {
          numberDisks = Integer.parseInt(answer);
          goodInput = true;
        }
        else
        {
          System.exit(0);
        }
      }
      catch (Exception e)
      {
      }
    }
    return numberDisks;
}

public static void main(String[] args)
{
    HanoiClient app = new HanoiClient();
    // ask user for number of disks
    while (true)
    {
      int numDisks = app.getNumberOfDisks();
      (app.getTOfH()).setDisks(numDisks);
      app.setStarted(true);
      // start
      app.recursiveTOfH((app.getTOfH()).getDisks(), 0, 2, 1);
      // finish last step in animation
      app.repaint();
      System.out.println("Done ");
      // done

      try
      {
        Thread.sleep(5000);      // wait for the animation to finish
      }
      catch (Exception e)
      {
      }
      JOptionPane.showMessageDialog(null, "Done");
    }
}
}

/* TowersOfHanoi
* Anderson, Franceschi
*/

   import javax.swing.JFrame;
   import java.awt.Graphics;
   import java.awt.Color;
   import java.util.ArrayList;

    public class TowersOfHanoi
   {
   // constants for Towers' parameters
      private static final int TOWER_LENGTH = 200;

   // x coordinates of towers
      private static final int XT1 = 100;
      private static final int XT2 = 250;
      private static final int XT3 = 400;

   // y coordinate of the top of the towers
      private static final int YT = 250;

   // height of the disks
      private static final int HD = 15;

   // coefficient of expansion for the width of the disks
      private static final int WDC = 15;

   // int array representing the disks on the tower
      int [][] towers;
   // int array representing the top disk in each tower
      int [] top;

   // Number of disks
      private int disks;

       public TowersOfHanoi( int d )
      {
         setDisks( d );
      }

       public void setTowers( int [][] t )
      {
         towers = t;
      }

       public int [][] getTowers( )
      {
         return towers;
      }

       public void setTop( int [] t )
      {
         top = t;
      }

       public int [] getTop( )
      {
         return top;
      }

       public void setDisks( int d )
      {
         if ( d >= 1 && d <= 9 )
            disks = d;
         else
            disks = 4;
    
         towers = new int[3][disks];
      // put all disks inside tower 1 to start
         for ( int i = 0; i < disks; i++ )
            towers[0][i] = disks - i;
         top = new int[3];
         top[0] = disks - 1; // index of top disk on tower 0
         top[1] = -1;   // index of top disk on tower 1
         top[2] = -1;   // index of top disk on tower 2
      }

       public int getDisks( )
      {
         return disks;
      }

       public void printMe( )
      {
         System.out.println( "Tower 0" );
         for ( int i = 0 ; i <= top[0]; i++ )
            System.out.print( towers[0][i] + " " );
         System.out.println( " top = " + top[0] );
         System.out.println( "Tower 1" );
         for ( int i = 0 ; i <= top[1]; i++ )
            System.out.print( towers[1][i] + " " );
         System.out.println( " top = " + top[1] );
         System.out.println( "Tower 2" );
         for ( int i = 0 ; i <= top[2]; i++ )
            System.out.print( towers[2][i] + " " );
         System.out.println( " top = " + top[2] );
         System.out.println( );
      }

       public void updateTowers( int diskNumber, int fromTower, int toTower )
      {
         if ( enforceRules( diskNumber, fromTower, toTower ) )
         {
         // update toTower
            towers[toTower][top[toTower] + 1] = diskNumber;
            top[toTower] = top[toTower] + 1;
         // update fromTower
            towers[fromTower][top[fromTower]] = 0;
            top[fromTower] = top[fromTower] - 1;
         }
         else
         {
            System.out.println( "Illegal Move: action cancelled" );
         }
      }

       public boolean enforceRules( int diskNumber, int fromTower, int toTower )
      {
         boolean rule = true;
         if ( fromTower < 0 || fromTower > 2 )
            rule = false;
         else if ( toTower < 0 || toTower > 2 )
            rule = false;
         else if ( fromTower == toTower )
         {
            rule = false;
            System.out.println( "Trying to move a disk within one tower" );
         }
         else if ( top[fromTower] == -1 )        // fromTower empty
         {
            rule = false;
            System.out.println( "Trying to move a disk from tower " + fromTower + " which is empty" );
         }
         else if ( top[toTower] == ( disks - 1 ) ) // toTower full
         {
            rule = false;
            System.out.println( "Trying to move a disk to tower " + toTower + " which is full" );
         }
         else if ( top[toTower] != - 1 && diskNumber != towers[fromTower][top[fromTower]] ) // not correct disk
         {
            rule = false;
            System.out.println( "Trying to move a disk which is not at the top of its tower" );
         }
         else if ( top[toTower] != -1 && towers[toTower][top[toTower]] != 0 && diskNumber > towers[toTower][top[toTower]] ) // big disk on top of small disk
         {
            rule = false;
            System.out.println( "Trying to place a disk on top of a smaller disk" );
         }
         else if ( towers[fromTower][top[fromTower]] != diskNumber )
         {
            rule = false;
            System.out.println( "Trying to move a disk not on top of a tower" );
         }
         return rule;
      }

       public void draw( Graphics g )
      {
         g.setColor( Color.BLUE );
      // display tower 1
         g.drawLine( XT1, YT + HD, XT1, YT - TOWER_LENGTH );
      // display tower 2
         g.drawLine( XT2, YT + HD, XT2, YT - TOWER_LENGTH );
      // display tower 3
         g.drawLine( XT3, YT + HD, XT3, YT - TOWER_LENGTH );
    
      // display tower numbers
         g.drawString( "0", XT1 - 3, YT + 35 );
         g.drawString( "1", XT2 - 3, YT + 35 );
         g.drawString( "2", XT3 - 3, YT + 35 );
    
      // display disks on tower 1
         for ( int i = 0; i <= top[0]; i++ )
         {
            g.setColor( Color.RED );
            g.fillRoundRect( XT1 - ( WDC * towers[0][i] )/2 ,YT - i * ( HD + 2 ), WDC * towers[0][i], HD, 10, 10 );
            g.setColor( Color.BLACK );
            g.drawString( "" + towers[0][i], XT1 - 3, YT - i * ( HD + 2 ) + 3 * HD / 4 );
         }
    
      // display disks on tower 2
         for ( int i = 0; i <= top[1]; i++ )
         {
            g.setColor( Color.RED );
            g.fillRoundRect( XT2 - ( WDC * towers[1][i] )/2 ,YT - i * ( HD + 2 ), WDC * towers[1][i], HD, 10, 10 );
            g.setColor( Color.BLACK );
            g.drawString( "" + towers[1][i], XT2 - 3, YT - i * ( HD + 2 ) + 3 * HD / 4 );
         }
    
      // display disks on tower 3
         for ( int i = 0; i <= top[2]; i++ )
         {
            g.setColor( Color.RED );
            g.fillRoundRect( XT3 - ( WDC * towers[2][i] )/2 ,YT - i * ( HD + 2 ), WDC * towers[2][i], HD, 10, 10 );
            g.setColor( Color.BLACK );
            g.drawString( "" + towers[2][i], XT3 - 3, YT - i * ( HD + 2 ) + 3 * HD / 4 );
         }
      }
   }

This file "public class HanoiClient extends JFrame" needs to code to get the output.

Explanation / Answer

Compilation error

compilation info

import javax.swing.JOptionPane;
import javax.swing.JFrame;
import java.awt.Graphics;

public class HanoiClient extends JFrame
{
private TowersOfHanoi tOfH;
boolean started = false;

public HanoiClient()
{
    tOfH = new TowersOfHanoi(4);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 300);
    setVisible(true);
}

public TowersOfHanoi getTOfH()
{
    return tOfH;
}

public void setStarted(boolean b)
{
    started = b;
}

public void recursiveTOfH(int numDisks, int fromTower, int toTower, int useTower)
{
    // ***** Student writes the body of this method *****
    //
    // Using recursion, transfer numDisks disks from the tower
    // fromTower to the tower toTower using the tower
    // useTower

    // The disks are numbered as follows: if we started with n disks,
    // the disk at the top is disk # 1
    // and the disk at the bottom is disk # n
    // We call the moveDisk method inside the body of this method
    // The moveDisk method moves one disk and takes 3 arguments:
    // an int, representing the disk number to be moved
    // an int, representing the tower to move the disk from
    // an int, representing the tower to move the disk to
    // So if these three variables are:
    // diskNumber, fromTower, and toTower
    // then the call to moveDisks will be:
    // moveDisk(diskNumber, fromTower, toTower);
    if (numDisks > 0)
    {
      // Student code starts here:

      // 1. Move (numDisks - 1) disks from fromTower
      //   to useTower using toTower

      // 2. Move one disk from fromTower to toTower
      //   Print a message to the screen, then
      //   call moveDisk in order to animate.

      // 3. Move (numDisks - 1) disks from useTower to toTower
      //   using fromTower

    }

    // Base case: 0 disks to move ==> do nothing
    //
    // Student code ends here.
}

public void moveDisk(int diskNumber, int fromTower, int toTower)
{
    repaint();
    try
    {
      Thread.sleep(1000);      // wait for the animation to finish
    }
    catch (Exception e)
    {
    }
    // update parameters
    tOfH.updateTowers(diskNumber, fromTower, toTower);
}

public void paint(Graphics g)
{
    if (started)
    {
      super.paint(g);
      tOfH.draw(g);
    }
}

public int getNumberOfDisks()
{
    boolean goodInput = false;
    int numberDisks = 4; // will be reassigned - default is 4
    while (!goodInput)
    {
      try
      {
        String answer = JOptionPane.showInputDialog(null, "Enter number of disks between 1 and 9");
        if (answer != null)
        {
          numberDisks = Integer.parseInt(answer);
          goodInput = true;
        }
        else
        {
          System.exit(0);
        }
      }
      catch (Exception e)
      {
      }
    }
    return numberDisks;
}

public static void main(String[] args)
{
    HanoiClient app = new HanoiClient();
    // ask user for number of disks
    while (true)
    {
      int numDisks = app.getNumberOfDisks();
      (app.getTOfH()).setDisks(numDisks);
      app.setStarted(true);
      // start
      app.recursiveTOfH((app.getTOfH()).getDisks(), 0, 2, 1);
      // finish last step in animation
      app.repaint();
      System.out.println("Done ");
      // done

      try
      {
        Thread.sleep(5000);      // wait for the animation to finish
      }
      catch (Exception e)
      {
      }
      JOptionPane.showMessageDialog(null, "Done");
    }
}
}

/* TowersOfHanoi
* Anderson, Franceschi
*/

   import javax.swing.JFrame;
   import java.awt.Graphics;
   import java.awt.Color;
   import java.util.ArrayList;

    public class TowersOfHanoi
   {
   // constants for Towers' parameters
      private static final int TOWER_LENGTH = 200;

   // x coordinates of towers
      private static final int XT1 = 100;
      private static final int XT2 = 250;
      private static final int XT3 = 400;

   // y coordinate of the top of the towers
      private static final int YT = 250;

   // height of the disks
      private static final int HD = 15;

   // coefficient of expansion for the width of the disks
      private static final int WDC = 15;

   // int array representing the disks on the tower
      int [][] towers;
   // int array representing the top disk in each tower
      int [] top;

   // Number of disks
      private int disks;

       public TowersOfHanoi( int d )
      {
         setDisks( d );
      }

       public void setTowers( int [][] t )
      {
         towers = t;
      }

       public int [][] getTowers( )
      {
         return towers;
      }

       public void setTop( int [] t )
      {
         top = t;
      }

       public int [] getTop( )
      {
         return top;
      }

       public void setDisks( int d )
      {
         if ( d >= 1 && d <= 9 )
            disks = d;
         else
            disks = 4;
    
         towers = new int[3][disks];
      // put all disks inside tower 1 to start
         for ( int i = 0; i < disks; i++ )
            towers[0][i] = disks - i;
         top = new int[3];
         top[0] = disks - 1; // index of top disk on tower 0
         top[1] = -1;   // index of top disk on tower 1
         top[2] = -1;   // index of top disk on tower 2
      }

       public int getDisks( )
      {
         return disks;
      }

       public void printMe( )
      {
         System.out.println( "Tower 0" );
         for ( int i = 0 ; i <= top[0]; i++ )
            System.out.print( towers[0][i] + " " );
         System.out.println( " top = " + top[0] );
         System.out.println( "Tower 1" );
         for ( int i = 0 ; i <= top[1]; i++ )
            System.out.print( towers[1][i] + " " );
         System.out.println( " top = " + top[1] );
         System.out.println( "Tower 2" );
         for ( int i = 0 ; i <= top[2]; i++ )
            System.out.print( towers[2][i] + " " );
         System.out.println( " top = " + top[2] );
         System.out.println( );
      }

       public void updateTowers( int diskNumber, int fromTower, int toTower )
      {
         if ( enforceRules( diskNumber, fromTower, toTower ) )
         {
         // update toTower
            towers[toTower][top[toTower] + 1] = diskNumber;
            top[toTower] = top[toTower] + 1;
         // update fromTower
            towers[fromTower][top[fromTower]] = 0;
            top[fromTower] = top[fromTower] - 1;
         }
         else
         {
            System.out.println( "Illegal Move: action cancelled" );
         }
      }

       public boolean enforceRules( int diskNumber, int fromTower, int toTower )
      {
         boolean rule = true;
         if ( fromTower < 0 || fromTower > 2 )
            rule = false;
         else if ( toTower < 0 || toTower > 2 )
            rule = false;
         else if ( fromTower == toTower )
         {
            rule = false;
            System.out.println( "Trying to move a disk within one tower" );
         }
         else if ( top[fromTower] == -1 )        // fromTower empty
         {
            rule = false;
            System.out.println( "Trying to move a disk from tower " + fromTower + " which is empty" );
         }
         else if ( top[toTower] == ( disks - 1 ) ) // toTower full
         {
            rule = false;
            System.out.println( "Trying to move a disk to tower " + toTower + " which is full" );
         }
         else if ( top[toTower] != - 1 && diskNumber != towers[fromTower][top[fromTower]] ) // not correct disk
         {
            rule = false;
            System.out.println( "Trying to move a disk which is not at the top of its tower" );
         }
         else if ( top[toTower] != -1 && towers[toTower][top[toTower]] != 0 && diskNumber > towers[toTower][top[toTower]] ) // big disk on top of small disk
         {
            rule = false;
            System.out.println( "Trying to place a disk on top of a smaller disk" );
         }
         else if ( towers[fromTower][top[fromTower]] != diskNumber )
         {
            rule = false;
            System.out.println( "Trying to move a disk not on top of a tower" );
         }
         return rule;
      }

       public void draw( Graphics g )
      {
         g.setColor( Color.BLUE );
      // display tower 1
         g.drawLine( XT1, YT + HD, XT1, YT - TOWER_LENGTH );
      // display tower 2
         g.drawLine( XT2, YT + HD, XT2, YT - TOWER_LENGTH );
      // display tower 3
         g.drawLine( XT3, YT + HD, XT3, YT - TOWER_LENGTH );
    
      // display tower numbers
         g.drawString( "0", XT1 - 3, YT + 35 );
         g.drawString( "1", XT2 - 3, YT + 35 );
         g.drawString( "2", XT3 - 3, YT + 35 );
    
      // display disks on tower 1
         for ( int i = 0; i <= top[0]; i++ )
         {
            g.setColor( Color.RED );
            g.fillRoundRect( XT1 - ( WDC * towers[0][i] )/2 ,YT - i * ( HD + 2 ), WDC * towers[0][i], HD, 10, 10 );
            g.setColor( Color.BLACK );
            g.drawString( "" + towers[0][i], XT1 - 3, YT - i * ( HD + 2 ) + 3 * HD / 4 );
         }
    
      // display disks on tower 2
         for ( int i = 0; i <= top[1]; i++ )
         {
            g.setColor( Color.RED );
            g.fillRoundRect( XT2 - ( WDC * towers[1][i] )/2 ,YT - i * ( HD + 2 ), WDC * towers[1][i], HD, 10, 10 );
            g.setColor( Color.BLACK );
            g.drawString( "" + towers[1][i], XT2 - 3, YT - i * ( HD + 2 ) + 3 * HD / 4 );
         }
    
      // display disks on tower 3
         for ( int i = 0; i <= top[2]; i++ )
         {
            g.setColor( Color.RED );
            g.fillRoundRect( XT3 - ( WDC * towers[2][i] )/2 ,YT - i * ( HD + 2 ), WDC * towers[2][i], HD, 10, 10 );
            g.setColor( Color.BLACK );
            g.drawString( "" + towers[2][i], XT3 - 3, YT - i * ( HD + 2 ) + 3 * HD / 4 );
         }
      }
   }