Der Lösungsalgorithmus wird meist rekursiv formuliert. |
// 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(255, 255, 153); bgColor(c); move(5, 1); 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(0, 6 * nofDiscs, 0, 3 * 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 * 2, 1); } 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 * 2, 1); } } private void go(Stack quelle, Stack hilfe, Stack ziel, int n) { if (n == 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.