Turm von Hanoi

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

Über das Scheibenschichten

Ein Stapel von immer kleiner werdenden Scheiben soll über eine Zwischenstation auf einen neuen Platz gestapelt werden. Immer eine aufeinmal und stets die kleinere Scheibe auf die größere.

Die Lösung dieses Problems erfreut sich im Informatik-Unterricht großer Beliebtheit (bei den Lehrern). Es gibt deswegen auch immer wieder Lösungen zu diesem Problem. fischertechnik hat bereits im Kasten Computing von 1984 das Modell eines Hanoi-Roboters angeboten. Auf dieser Site finden sich ebenfalls einige Lösungen für das Problem :

  • WinLogo Lösung für den Hanoi Robot von 1984
  • VB6 Lösung für den Industry Robot von 1998
  • VB6 Lösung für den LynxMotion Robot

Hier Lösungen für VBA mit vbaFish, JScript mit mscFish, VB.NET, C#.NET, Python und Delphi, alle nutzen FishFa30/umFish30.DLL :

Die manuelle Lösung

Das nachfolgende kleine Programm Hanoi.ftC (es wurde im PC Magazin Nr. 22 von 1988 als Quick Basic Lösung veröffentlich) gibt im Debug-Fenster eine Lösungsanweisung für das manuelle Umschichten aus :

Sub Main
Dim n&
  n = InputBox("Anzahl Scheiben")
  Debug.Clear
  Debug.Print "Spiel mit" & n & " Scheiben"
  Hanoi n, "Links ", "Mitte ", "Rechts"
End Sub

Sub Hanoi(n&, TAnf$, TMit$, TEnd$)
  If n = 1 Then
    Debug.Print "Scheibe von " & TAnf & " -> " & TEnd
  Else
    Hanoi n-1, TAnf, TEnd, TMit
    Debug.Print "Scheibe von " & TAnf & " -> " & TEnd
    Hanoi n-1, TMit, TAnf, TEnd
  End If
End Sub

Kern ist das Unterprogramm Hanoi, das aus einer einzigen If-Anweisung besteht. Wenn die Anzahl der Scheiben auf dem Stapel bei 1 angekommen ist, wird direkt vom aktuellen Quellstapel zum Zielstapel geschichtet, sonst wird dreimal hin und her geschichtet. Trick dabei ist der rekursive Aufruf von Hanoi (das Unterprogramm ruft sich selber auf).
Achtung : Zur Anzeige der Lösung ist im Menü Ansicht die Option 'Immer teilen' einzustellen

Die Anweisung Debug.Print "Scheibe von " & TAnf & " -> " & TEnd, die zweimal im Programm auftaucht, ist nun durch eine Anweisung Ziehe zu ersetzen, die einen Robot überredet tätig zu werden, ganz wie im manuellen Verfahren. Dazu ist dann erstmal ein Robot erforderlich :

Der Hanoi Robot

Hanoi Robot

Der Hanoi Robot ist ein Eigenbau der auf dem Schweißroboter-Chassis des Computing Starter Kits basiert. Er entspricht hier weitgehend dem Hanoi Robot von 1984. Allerdings wurde die Technik modernisiert :

M1 : Säulenmotor mit Impulsrad und Endtaster an E1, Impulstaster an E2

M2 : Armmotor mit Endtaster oben E3 und unten E4

M3 : Gefedert gelagerter Magnet (neuere Version bei Knobloch : 32363 - 17,20 Euro)

Gestapelt werden die Eisenscheiben, die im Bild vorn (PosA) neben dem Winkel liegen. Verdrahtet wurde "fliegend".

Der Säulenroboter der Industry Robots II als Tonnenstapler

Man kann auch den Säulenroboter überreden, die gelben Tonnen im Sinne von Hanoi zu stapeln. Dafür wurden um ihn herum drei gelbe Kästchen plaziert (damit er nicht so tief herunter muß). Das Programm dazu entspricht weitgehend dem für den Eisenscheibenstapler und ist in Versionen für VBA und C#.NET ebenfalls in  HanoiRob.ZIP enthalten. Für die VBA-Lösung wird vbaFish40 und für die C#-Lösung wird neben einer installierten C#-IDE noch umFish40.ZIP benötigt.

Die Routinen

------- Hanoi-Logik
Ziehe(Von, Nach) Ersatz für die manuelle Arbeitsanweisung : Zerlegt in Hole(Von) und Bringe(Nach)
Bringe(Pos) Ablegen einer Scheibe auf der gewünschten Zielposition : 
SauleNach(Pos), ArmSenken, ScheibeGreifen, ArmHeben
Hole(Pos) Aufgreifen einer Scheibe von der angegebenen Quellposition
SauleNach(Pos), ArmSenken, ScheibeLegen, ArmHeben
----- Robot-Ansteuerung
SauleNach(ZielPos) Fahren auf die Zielposition. Die Position wird durch eine Impulsrad bestimmt
ArmSenken Senken des Greiferarms bis zum Endtaster
ArmHeben Heben des Greiferarms bis zum Endtaster
ScheibeLegen Einfach : Magnet aus
ScheibeGreifen Auch einfach : Magnet ein
----- DrumRum
Grundstellung Fahren auf Grundstellung ( Robot auf PosA, Armhoch, Magnet aus)
Init Besetzen der globalen Variablen. Dabei auch festlegen der Werte für die drei Stapelpositionen PosA, PosB und PosC

Die Sources

Das komplette VBA Programm gibts gleich zweimal :

  • HanoiRobot.ftC : Eine all-in-one Lösung. Alle beschriebenen Routinen sind in einer Source enthalten
  • HanoiMain.ftC/HanoiRobot.CLS : Die Robot-Ansteuerung wurde in eine separate Klasse ausgelagert. Hier wohl kaum erforderlich. Mehr um zu zeigen, wie man mit vbaFish auch Klassen einsetzen kann. Die Programme sind funktional gleich

eine Perl-Lösung : 

  • Hanoi.PL : Ein File mit dem kompletten Programm.

dann gleich noch einmal für Python :

  • HanoiRobot.PY : Ein File, aber wie bei HanoiMain/HanoiRobot wurde die Robot-Ansteuerung in eine Klasse ausgelagert. Getestet wurde mit PythonWin. Ablauf auch als rreine Konsolapplikation.

für Delphi :

  • poorHanoiRob.DPR : Eine all-in-one Lösung auf Basis des Templates poorFish30. Alle beschriebenen Routinen sind in einer Source enthalten, Konsolprogramm.

und für JScript :

  • HanoiRob.JS : Eine Lösung auf Basis von Unterprogrammen (function)
  • HanoiRobC.JS : Eine Lösungsvariante unter Verwendung eines Objects (Klasse), das die Robot-Methoden kapselt. 

und dann noch VB.NET und C#.NET:

  • HanoiRobot : Eine Windows Lösung unter Nutzung der Klasse HanoiRob.

und jetzt auch noch  eine ROBO Pro-Lösung

Alles zusammengefaßt in HanoiRob.ZIP. Zusätzlich ist noch vbaFish30Setup.EXE (VBA) bzw. PythonFish30.ZIP (Python), vbFish30Setup.EXE (Perl), umFish30.ZIP (C#, VB.NET) oder delphiFish30Setup.EXE (Delphi) erforderlich (Auf der jeweiligen Seite wird das genauer erklärt). Außerdem die zugehörenden Entwicklungssysteme - Ausnahme : vbaFish30, da ist schon alles dabei.

Stand : 07.11.2005