Türme von Hanoi

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Türme von Hanoi

    Hallo liebe Leute,
    ich versuche das Spiel "Die Türme von Hanoi" in Visual Basic zu programmieren (de.wikipedia.org/wiki/Türme_von_Hanoi).
    Wichtig hierfür ist ja der Randoffsche Algorithmus, der zur Lösung des Problems führt. Für die Speicherung der aktuellen Lösung soll ein List of Integer Array der Länge 3 verwendet werden, um die einzelnen Schritte jeweils abzuspeichern und ausgeben zu können. Der Benutzer soll den Ablauf des Programms verfolgen können, hierfür soll nach jedem Schritt eine ausreichende Wartezeit eingebaut werden. Weiterhin soll die aktuelle Belegung und die bisher erfolgten Bewegungen in jeweils einer Textbox ausgegben werden.
    An sich habe ich einen Teil des Problems bereits gelöst (siehe Code). Allerdings halt ohne dieses List of Integer Array zu verwenden und die zweite Ausgabe mit der aktuellen Belegung der Türme. Vielleicht hat ja jemand eine Idee wie meinen bisherigen Code verändern bzw. ergänzen kann! Vielen Dank schon einmal.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim n As Integer
    5. n = CInt(input.Value)
    6. 'Berechne die Lösung von der gegebenen Anzahl von Scheiben
    7. BewegeTurm(n, "0", "1", "2")
    8. Dim Anzahl() As String = Split(Output.Text, vbLf) 'Um Anzahl der Züge zählen zu können(nicht die schönste Variante und auch nicht so gedacht für die Aufgabe)
    9. MsgBox("Das Spiel ist beendet!" & vbLf & CType(Anzahl.Length - 1, String) & " Züge werden benötigt")
    10. End Sub
    11. Private Sub BewegeScheibe(ByVal n As Integer, ByVal Von As String, ByVal Zu As String)
    12. Threading.Thread.Sleep(1000) 'Wartezeit nach jeder Ausgabe
    13. Output.Text &= ("Scheibe " & n & " wurde von " & Von & " nach " & Zu & " verschoben." & vbCrLf)
    14. Update()
    15. End Sub
    16. Private Sub BewegeTurm(ByVal n As Integer, ByVal Start As String, ByVal Mitte As String, ByVal Ziel As String)
    17. If n > 1 Then 'Randoffsche Algorithmus als Lösungsvorlage
    18. BewegeTurm(n - 1, Start, Ziel, Mitte) 'Turm mit einer Scheibe weniger behandeln
    19. BewegeScheibe(n, Start, Ziel) ' von o nach 2 verschieben
    20. BewegeTurm(n - 1, Mitte, Start, Ziel)
    21. Else
    22. BewegeScheibe(n, Start, Ziel)
    23. End If
    24. End Sub
    25. End Class

    Dateien
    • WindowsApp1.rar

      (187,32 kB, 97 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Scully77“ ()

    Ich würde dir ganz dringen zunächstmal paar Grundlagen nahebringen wollen:
    zum einen kann man deinen Code so nicht lesen, das geht deutlich besser, und bitte ich dich, zu verbessern - hier Anleitung:


    Zum anderen programmierst du vb.net unter Einstellungen, die das Erlernen objektorientierter Programmierung nahezu unmöglich machen. Das empfehle ich dir sehr, das zu korrigieren: Visual Studio - Empfohlene Einstellungen

    Jo, das ist eiglich schon eine ganuze Menge, uind du wirst das Gefühl haben, keinen Schritt weitergekommen zu sein (bist du dann aber, weil du hast ungeheuer was gelernt).

    Dann nochmal den neuen Code einstellen, dann kann man sich deiner eigentlichen Frage widmen
    Na Montag Abgabetermin in der Uni-Jena oder was? Ein fleißiger Helfer lässt grüßen! =D

    Ja, die Grundlagen bekommt man halt nicht innerhalb von 4 Wochen in den Kopf gepresst wenn man nach 1 Woche schon ohne jegliche Vorkenntnisse ganze Wissenschaftliche Taschenrechner aus dem Ärmel zaubern soll. =D
    ​ich würde auch lieber auf Sachen wie "option strict on" verzichten aber wenn der Prof sagt, das muss ich die Hausaufgabe mit rein, dann kommt man nicht drum herum, gerade dann nicht wenn die Hausaufgaben insgesamt gut 50% der Prüfung ausmachen.

    zur Array Deklaration (an welcher ich mir auch die Zähne ausgebissen habe) kann ich dir folgendes empfehlen:

    VB.NET-Quellcode

    1. Public liste As New List(Of List(Of Integer)) From {
    2. New List(Of Integer),
    3. New List(Of Integer),
    4. New List(Of Integer)
    5. }



    ​Für das weitere Vorgehen -> Google ist dein freund

    ​Beste Grüße und noch eine angenehme Restwoche.
    Willkommen im Forum. :thumbup:

    Ergott666 schrieb:

    ich würde auch lieber auf Sachen wie "option strict on" verzichten
    Dann verzichte doch gleich auf das Programmieren unter VB.NET. In C# ist das immanent.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann verzichte doch gleich auf das Programmieren unter VB.NET. In C# ist das immanent.​

    Ich Programmiere ja eigentlich auch nur unter VB.NET da ich darin wenigstens ein bisschen was von meiner VBA Erfahrung einbringen kann. Bei C# sieht es leider nicht ansatzweise so Rosig aus, das wurde dank Berufsschule und unfähigen Lehrern zum Abschreckungsbeispiel #1 was Programmierung angeht. Aber wer weiß vielleicht hole ich das ein andermal noch nach wenn ich mein Trauma überwunden habe. =D
    So um wieder zum Thema zurückzukommen hier meine Lösung.

    ​Ich weiß man hätte einiges besser machen können, trotzdem bitte ich um Nachsicht da ich bei dieser Aufgabe u.a. unter Zeitdruck stand und auch nur Anfänger bin.
    ​(Ja gerade die "Pruefen"-Funktion hätte man noch in eine Schleife packen können, ging aufgrund meiner Faulheit etwas unter). über Meinungen und Verbesserungsvorschläge würde ich mich sehr freuen damit ich weiß was ich beim nächsten Mal besser machen kann.

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Public Class Form1
    3. Dim answer As String 'für Textausgabe der Tauschschritte
    4. Dim scheibenanzahl As Integer 'zur weiterverarbeitung der Scheibenanzahl
    5. Dim g As Integer = 0 'Zähler für Scheibenerstellung
    6. Dim j As Integer = 0 'Zähler für Tauschschritte
    7. 'deklaration des Arrays (3) wo jedes Element eine eigene Liste ist
    8. 'siehe Aufgabe a)
    9. Public stab As New List(Of List(Of Integer)) From {
    10. New List(Of Integer),
    11. New List(Of Integer),
    12. New List(Of Integer)
    13. }
    14. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    15. 'Wert des Nummernauswahlfeldes wird an die Variable Scheibenanzahl übergeben
    16. scheibenanzahl = CInt(NumericUpDown1.Value)
    17. 'Zurücksetzen aller Variablen und Textboxen falls Programm erneut ausgeführt werden soll
    18. g = 0
    19. j = 0
    20. TextBox1.Clear()
    21. TextBox2.Clear()
    22. TextBox3.Clear()
    23. RichTextBox1.Clear()
    24. stab(0).Clear()
    25. stab(1).Clear()
    26. stab(2).Clear()
    27. ' Scheiben werden erstellt und in erste Liste eingefügt
    28. Do Until g = scheibenanzahl
    29. stab(0).Add(g)
    30. TextBox1.AppendText(CStr(stab(0).Item(g)))
    31. g = g + 1
    32. Loop
    33. 'Ausführen des Rekursiven Algorithmus sowie übergabe der benötigten Elemente
    34. Call Bewege(scheibenanzahl, stab(0), stab(1), stab(2), "Stab A", "Stab B", "Stab C")
    35. 'c) MessageBox zur fertigstellung des Ablaufs sowie ausgabe der Anzahl an Tauschschritten
    36. 'siehe Aufgabe c)
    37. MsgBox("Spiel erfolgreich beendet." & vbNewLine & "Anzahl Züge: " & j)
    38. End Sub
    39. 'funktion für bewegung der Scheiben
    40. 'siehe Aufgabe a)
    41. Private Function Bewege(ByVal i As Integer, ByVal start As List(Of Integer), ByVal zwischenziel As List(Of Integer), ByVal ziel As List(Of Integer), ByVal a As String, ByVal b As String, ByVal c As String) As String
    42. If (i > 0) Then
    43. Bewege(i - 1, start, ziel, zwischenziel, a, c, b)
    44. Dim itemx As Integer
    45. itemx = start.Last
    46. start.Remove(itemx)
    47. ziel.Add(itemx)
    48. 'Timer um User Zeit zum nachvollziehen des Zuges zu geben / System.Threading.Thread.Sleep alleine würde das Programm einfrieren
    49. For k As Integer = 1 To 100
    50. System.Threading.Thread.Sleep(10)
    51. System.Windows.Forms.Application.DoEvents()
    52. Next
    53. answer = " Scheibe " & itemx & " wurde von " & a & " auf " & c & " verschoben." & vbCrLf ' "verschiebe Scheibe oberste Scheibe von " & start & " nach " & ziel & "."
    54. 'Prüfung nach jedem Schritt ob Scheiben korrekt auf Stäben liegen
    55. Call Pruefen()
    56. 'Aktualisierung der Textboxen
    57. TextBox1.Text = Textaktual(stab(0))
    58. TextBox2.Text = Textaktual(stab(1))
    59. TextBox3.Text = Textaktual(stab(2))
    60. j = j + 1 'Zähler für Tauschschritte
    61. 'Ausgabe der Schritte
    62. 'siehe Aufgabe a)
    63. RichTextBox1.Text &= answer
    64. Bewege(i - 1, zwischenziel, start, ziel, b, a, c)
    65. End If
    66. Return answer
    67. End Function
    68. 'eigene Funktion zur aktualisierung der Textboxen
    69. Public Function Textaktual(ByVal liste As List(Of Integer)) As String
    70. Dim result As String = ""
    71. For Each elem As String In liste
    72. result &= elem & " "
    73. Next
    74. Return result
    75. End Function
    76. 'siehe Aufgabe b)
    77. 'Prüfung ob die Scheiben korrekt auf den Stangen liegen
    78. 'die MsgBox wird leider nie erscheinen da durch den rekursiven Algorithmus die Scheiben immer korrekt liegen
    79. Public Function Pruefen() As Boolean
    80. Dim x As Integer = stab(0).Count
    81. Dim richtig As Boolean
    82. Do Until x = 0
    83. If stab(0).Last > stab(0).Last - 1 Then
    84. richtig = True
    85. Else
    86. richtig = False
    87. MsgBox("nicht möglich")
    88. End If
    89. x = x - 1
    90. Loop
    91. Dim y As Integer = stab(1).Count
    92. Do Until y = 0
    93. If stab(1).Last > stab(1).Last - 1 Then
    94. richtig = True
    95. Else
    96. richtig = False
    97. MsgBox("nicht möglich")
    98. End If
    99. y = y - 1
    100. Loop
    101. Dim z As Integer = stab(2).Count
    102. Do Until z = 0
    103. If stab(2).Last > stab(2).Last - 1 Then
    104. richtig = True
    105. Else
    106. richtig = False
    107. MsgBox("nicht möglich")
    108. End If
    109. z = z - 1
    110. Loop
    111. Return richtig
    112. End Function
    113. End Class

    Ergott666 schrieb:

    VB.NET-Quellcode

    1. Dim g As Integer = 0 'Zähler für Scheibenerstellung
    2. Dim j As Integer = 0 'Zähler für Tauschschritte
    3. ' ...
    4. Dim x As Integer = stab(0).Count
    5. Dim y As Integer = stab(1).Count
    6. Dim z As Integer = stab(2).Count
    Das sind absolut spitzenmäßige Variablennamen. X(
    Ich nehme mal an, Du hattest bei der Erstellung dieses Beispiels keine Ziet, Dir vernünftige Namen austzudenken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!