HanoiClient 1 For the code under comment 2 use numDisks as

/* HanoiClient
1. For the code under comment 2, use numDisks as the disk number to move.

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

*/

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( \"\\ttop = \" + top[0] );
System.out.println( \"Tower 1\" );
for ( int i = 0 ; i <= top[1]; i++ )
System.out.print( towers[1][i] + \" \" );
System.out.println( \"\\ttop = \" + top[1] );
System.out.println( \"Tower 2\" );
for ( int i = 0 ; i <= top[2]; i++ )
System.out.print( towers[2][i] + \" \" );
System.out.println( \"\\ttop = \" + 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 );
}
}
}

Solution

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)
{

}

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

*/

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( \"\\ttop = \" + top[0] );
System.out.println( \"Tower 1\" );
for ( int i = 0 ; i <= top[1]; i++ )
System.out.print( towers[1][i] + \" \" );
System.out.println( \"\\ttop = \" + top[1] );
System.out.println( \"Tower 2\" );
for ( int i = 0 ; i <= top[2]; i++ )
System.out.print( towers[2][i] + \" \" );
System.out.println( \"\\ttop = \" + 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 );
}
}
}

/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.
/* HanoiClient 1. For the code under comment 2, use numDisks as the disk number to move. import javax.swing.JOptionPane; import javax.swing.JFrame; import java.

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site