Koordinatengrafik mit Java
HomeAufgabenDruckenJava-Online

Türme von Hanoi


Beim Start befinden sich alle Schreiben auf dem ersten Stab. Die Scheiben sind auf den dritten Stab zu verschieben, wobei jeweils nur eine Scheibe verschoben wird und nie eine grössere Scheibe auf eine kleinere gelegt werden darf. Der mittlere Stab dient als Scheibenablage.

Der Lösungsalgorithmus wird meist rekursiv formuliert.

Programmcode herunterladen (Hanoi.zip)

 
// Hanoi.java

import java.awt.*;
import ch.aplu.util.*;
import java.util.Stack;
import java.awt.color.*;
import java.awt.event.*;
import javax.swing.*;

public class Hanoi extends GPanel
{
  private int nofDiscs; //Anzahl der Scheiben;
  private Stack tower1, tower2, tower3; 
  private boolean play = false;
  private JTextField nofDiscsTextField = new JTextField(3);
  private JLabel nofDiscsLabel = new JLabel("Anzahl Scheiben");

  public Hanoi()
  {
    JButton goButton = new JButton("go");
    Color c = new Color(255255153);
    bgColor(c);
    move(51);
    tower1 = new Stack();
    tower2 = new Stack();
    tower3 = new Stack();
    
    goButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
         nofDiscs = Integer.parseInt(nofDiscsTextField.getText());
         init();
         window(06 * nofDiscs, 03 * nofDiscs);
         play = true;
      }
    });

    add(nofDiscsLabel);
    add(nofDiscsTextField);
    add(goButton);
    validate();

    while (!play)
      Thread.currentThread().yield();
    go(tower1, tower2, tower3, nofDiscs);
  }

  private void init()
  {
    for(int i = nofDiscs; i > 0; i--)
    {
      tower1.push(new Disc(i));
    }
  }


  private void paint()
  {
    for(int i = 0; i < 3; i++)
    {
      color(Color.black);
      pos(nofDiscs * (2 * i + 1), nofDiscs * 1.5);
      fillRectangle(0.2, nofDiscs + 1);
    }

    Disc cur;
    for(int i = tower1.size() - 1; i >= 0; i--)
    {
      cur = (Disc) tower1.elementAt(i);
      color(cur.color);
      pos(nofDiscs, nofDiscs + i);
      fillRectangle(cur.size * 2 , 1);
    }

    for(int i = tower2.size() - 1; i >= 0; i--)
    {
      cur = (Disc) tower2.elementAt(i);
      color(cur.color);
      pos(3 * nofDiscs, nofDiscs + i);
      fillRectangle(cur.size * 21);
    }

    for(int i = tower3.size() - 1; i >= 0; i--)
    {
      cur = (Disc) tower3.elementAt(i);
      color(cur.color);
      pos(5 * nofDiscs, nofDiscs + i);
      fillRectangle(cur.size * 21);
    }
  }

  private void go(Stack quelle, Stack hilfe, Stack ziel, int n)
  {
    if (== 1)
    {
      ziel.push(quelle.pop());
      clear();
      paint();
      Console.delay(400);
    }
    else
    {
      go(quelle, ziel, hilfe, n - 1);
      go(quelle, tower1, ziel, 1);
      go(hilfe, quelle, ziel, n - 1);
    }
  }

  public static void main(String[] args)
  {
    new Hanoi();
  }
}

class Disc
{
  int size;
  Color color;

  Disc(int sizeDisk)
  {
    size = sizeDisk;
    color = new Color((1 * size) % 256(40 * size) % 256(40 * size) % 256);
  }
}
 

Erklärungen zum Programmcode

Stack<Disc> Ab Version Java 1.5 muss man beim Stack den Datentyp eingeben.