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

Do student code here in below code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* HanoiClient

ID: 3911178 • Letter: D

Question

Do student code here in below code

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 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 );

   }

}

   }

Explanation / Answer

I have modified the HanoiClient.java file so I will be pasting the code for that file only. The rest of the file is same.

Here is the working code:

//HanoiClient.java

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 *****

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

   if(numDisks == 1)
        {
                        System.out.println("Move disk 1 from Tower " + fromTower + " to Tower " + toTower);
            moveDisk(1,fromTower,toTower);
            return;
        }
    recursiveTOfH(numDisks-1, fromTower, useTower, toTower);
// System.out.println();
    System.out.println("Move disk " + numDisks + " from Tower " + fromTower + " to Tower " + toTower);
    moveDisk(numDisks,fromTower,toTower);
    recursiveTOfH(numDisks-1, useTower, toTower, 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");

}

}

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote