![]() |
Programmierung Türme von Hanoi
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich soll von der Schule aus das Spiel "Die Türme von Hanoi" programmieren. Als Türme und Scheiben hab ich jeweils Leinwände benutzt. Ich kann auch schon die scheiben bewegen, indem ich die ausgewählte anklicke und dann in ein Edit feld eine Zahl reinschreibe. Jetzt habe ich aber das Problem, dass ich nicht weiß wie ich schreiben kann, ob ein Turm schon von einer oder zwei Scheibe/n besetzt wurde. In diesem Fall soll die dahin gezogene Scheibe seine top-Position verändern (-32). Habt ihr Ideen oder Lösungen zu diesem Problem? Wäre euch echt dankbar;) €: Im anhang ist mein Programm. Hab auch schon ein Lösungsansatz aber der funktoniert nicht so wirklich. MfG Florian |
Re: Programmierung Türme von Hanoi
Hallo,
zeig doch mal an Code was Du so hast. Ansonsten vieleicht auch mal hier schauen. ![]() Gruß Jens |
Re: Programmierung Türme von Hanoi
Hallo nairolf92,
ich hab mir jetzt nur das Executable angeschaut. Bei Türme von Hanoi ist ja die Darstellung der Teilaspekt, der nur eine untergeordnete Rolle spielt. Es geht um die logische Umsetzung und in der Regel um Rekursion. D.h. du musst dir ein Konstrukt ausdenken, in dem du speicherst welche Scheibe auf welchem Turm liegt (z.B. 3 Stapelspeicher). |
Re: Programmierung Türme von Hanoi
Ok danke, hab mir jetzt 3 Stapelspeicher erstellt, hat funktioniert. Danke für die Hilfe. ;)
|
Re: Programmierung Türme von Hanoi
Gerne! Wenn du weitere Tipps benötigst melde dich einfach wieder. Ist doch auch mal wieder erfrischend zu sehen, dass es auch Hausaufgabenthreads gibt, in denen Eigentinitiative gezeigt wird und nur bei konkreten Problemen Hilfe nötig ist. :thumb:
|
Re: Programmierung Türme von Hanoi
So, hab nun erneut ein Problem bei dem ich eure Hilfe benötige.
Ich soll eine Prozedur erstellen, in der ich nur den Anfangs und Endpunkt angeben soll und dann die Scheiben automatisch dahin bewegt werden. Hab schonmal ein Lösungsansatz:
Delphi-Quellcode:
die zahlen (bei start und ziel stehen für die türme, s1a soll Stapel1Anzahl heißen, also die Anzahl der Scheiben die auf Stapel 1 liegen und edit5 ist das feld in den man diese Anzahl von 1-8 festlegen kann). Ich merke grad, dass die variable safe unnütz ist, aber abgesehen davon zeigt er noch ziemlich viele fehlermeldungen an.
procedure bewegen(start,ziel:integer) ;
var safe,Auswahl1,Auswahl2,Auswahl3,a,s1a,s2a,s3a:integer; begin s1a := strtoint(edit5.text); s2a := 0; s3a := 0; Auswahl1 :=s1a; Auswahl2 :=s2a; Auswahl3 :=s3a; if (start = 1) and (ziel = 2) then safe:=12; if safe=12 then begin image(Auswahl1).top := (408-32*s2a); image(Auswahl1).left := image(Auswahl1).left+184; s1a:=s1a-1; s2a:=s2a+1; end; if (start=1) and (ziel=3) then safe:=13; if safe=13 then begin image(Auswahl1).top := (408-32*s3a); image(Auswahl1).left := image(Auswahl1).left+368; s1a:=s1a-1; s3a:=s3a+1; if (start=2) and (ziel=3) then safe:=23; if safe=23 then begin image(Auswahl2).top := (408-32*s3a); image(Auswahl2).left := image(Auswahl2).left+184; s2a:=s2a-1; s3a:=s3a+1; if (start=2) and (ziel=1) then safe:=21; if safe=21 then begin image(Auswahl2).top := (408-32*s1a); image(Auswahl2).left := image(Auswahl2).left-184; s2a:=s1a-1; s1a:=s1a+1; if (start=3) and (ziel=1) then safe:=31; if safe=31 then begin image(Auswahl).top := (408-32*s1a); image(Auswahl).left := image(Auswahl).left-368; s3a:=s3a-1; s1a:=s1a+1; if (start=3) and (ziel=2) then safe:=32; if safe=32 then begin image(Auswah)l.top := (408-32*s1a); image(Auswahl).left := image(Auswahl).left-184; s3a:=s3a-1; s2a:=s2a+1; end; darf man bei einer prozedur nicht auf die edit- und image felder zurückgreifen? wenn ja wie könnte ich es anders schreiben? |
Re: Programmierung Türme von Hanoi
Hallo nairofl92,
was soll den image(Auswahl) ergeben? Wie ist image deklariert? Auswahl ist ja ein Integer, so dass image(Auswahl) irgendwie kein sinnvoller Ausdruck ist. |
Re: Programmierung Türme von Hanoi
ich glaube nicht, dass deine funktion so compiliert wird.
da fehlt jede Menge "end;" Würde man auch sofort sehen, wenn man sich etwas an den Style-Guide von Delphi halten würde:
Delphi-Quellcode:
procedure bewegen( start, ziel : integer );
var safe, Auswahl1, Auswahl2, Auswahl3, a, s1a, s2a, s3a : integer; begin s1a := strtoint( edit5.Text ); s2a := 0; s3a := 0; Auswahl1 := s1a; Auswahl2 := s2a; Auswahl3 := s3a; if ( start = 1 ) and ( ziel = 2 ) then safe := 12; if safe = 12 then begin image( Auswahl1 ).top := ( 408 - 32 * s2a ); image( Auswahl1 ).left := image( Auswahl1 ).left + 184; s1a := s1a - 1; s2a := s2a + 1; end; if ( start = 1 ) and ( ziel = 3 ) then safe := 13; if safe = 13 then begin image( Auswahl1 ).top := ( 408 - 32 * s3a ); image( Auswahl1 ).left := image( Auswahl1 ).left + 368; s1a := s1a - 1; s3a := s3a + 1; if ( start = 2 ) and ( ziel = 3 ) then safe := 23; if safe = 23 then begin image( Auswahl2 ).top := ( 408 - 32 * s3a ); image( Auswahl2 ).left := image( Auswahl2 ).left + 184; s2a := s2a - 1; s3a := s3a + 1; if ( start = 2 ) and ( ziel = 1 ) then safe := 21; if safe = 21 then begin image( Auswahl2 ).top := ( 408 - 32 * s1a ); image( Auswahl2 ).left := image( Auswahl2 ).left - 184; s2a := s1a - 1; s1a := s1a + 1; if ( start = 3 ) and ( ziel = 1 ) then safe := 31; if safe = 31 then begin image( Auswahl ).top := ( 408 - 32 * s1a ); image( Auswahl ).left := image( Auswahl ).left - 368; s3a := s3a - 1; s1a := s1a + 1; if ( start = 3 ) and ( ziel = 2 ) then safe := 32; if safe = 32 then begin image( Auswah )l.top := ( 408 - 32 * s1a ); image( Auswahl ).left := image( Auswahl ).left - 184; s3a := s3a - 1; s2a := s2a + 1; end; |
Re: Programmierung Türme von Hanoi
im DF gibts auch schon viele
![]() |
Re: Programmierung Türme von Hanoi
so hab die prozedur jetz ein bisschen verändert:
Delphi-Quellcode:
tatsächlich zeigt er bei der prozedur keinen fehler mehr an, jedoch wenn ich diese mit "bewegen(q,a)" auf einem button abrufen will. Die Fehlermeldung sagt: Operator oder Simikolon fehlt.
var
Scheibenbild: Array [1..8,1..3] of timage; sa: Array[1..3] of integer; procedure TForm1.FormCreate(Sender: TObject); var n : integer; begin For n := 1 to 8 do Begin sa[1] := n; sa[2] := 0; sa[3] := 0; end; Scheibenbild[1,1] := Scheibe4; Scheibenbild[2,1] := Scheibe5; Scheibenbild[3,1] := Scheibe6; Scheibenbild[4,1] := Scheibe7; Scheibenbild[5,1] := Scheibe8; Scheibenbild[6,1] := Scheibe9; Scheibenbild[7,1] := Scheibe10; Scheibenbild[8,1] := Scheibe11; end; procedure bewegen(start,ziel:boolean); var a,q,s:boolean; begin if ((start=q) and (ziel=a)) then begin Scheibenbild[sa[1],1].top := (408-32*sa[2]); Scheibenbild[sa[1],1].left := Scheibenbild[sa[1],1].left+184; sa[1]:=sa[1]-1; sa[2]:=sa[2]+1; end; if (start=q) and (ziel=s) then begin Scheibenbild[sa[1],1].top := (408-32*sa[3]); Scheibenbild[sa[1],1].left := Scheibenbild[sa[1],1].left+184; sa[1]:=sa[1]-1; sa[3]:=sa[3]+1; end; if (start=a) and (ziel=s) then begin Scheibenbild[sa[2],1].top := (408-32*sa[3]); Scheibenbild[sa[2],1].left := Scheibenbild[sa[2],1].left+184; sa[2]:=sa[2]-1; sa[3]:=sa[3]+1; end; if (start=a) and (ziel=q) then begin Scheibenbild[sa[2],1].top := (408-32*sa[1]); Scheibenbild[sa[2],1].left := Scheibenbild[sa[2],1].left+184; sa[2]:=sa[2]-1; sa[1]:=sa[1]+1; end; if (start=s) and (ziel=q) then begin Scheibenbild[sa[3],1].top := (408-32*sa[1]); Scheibenbild[sa[3],1].left := Scheibenbild[sa[3],1].left+184; sa[3]:=sa[3]-1; sa[1]:=sa[1]+1; end; if (start=s) and (ziel=a) then begin Scheibenbild[sa[3],1].top := (408-32*sa[2]); Scheibenbild[sa[3],1].left := Scheibenbild[sa[3],1].left+184; sa[3]:=sa[3]-1; sa[2]:=sa[2]+1; end; end; was könnte der fehler sein? ist es falsch mit z.b. if (start=s) and (ziel=a) then anzufangen? |
Re: Programmierung Türme von Hanoi
Start und Ziel als Boolean :gruebel: was willst du damit der prozedur mitteilen?
sehr seltsam ... |
Re: Programmierung Türme von Hanoi
die prozedur soll bewirken dass jenachdem welchen buchstaben dieser 3 ich bewegen(hier,hier) hinschreibe eine timage scheibe von dem einen turm zum anderen bewegt werden soll. D.h. q steht für den Turm Quelle, a für abeitsbereich und s für senke. ich dachte man kann dann wenn man die prozedur aufrufen will z.b. mit "bewegen(q,s)" bewirken, dass eine scheibe von der quelle zur senke bewegt wird. und dafür reicht true und false nicht aus.
deshalb auch " if start=q and ziel=s then: damit wollte ich sagen, dass wenn der 1. buchstabe in der klammer q ist und der 2. s dann soll eine scheibe von der quelle zur senke bewegt werden. |
Re: Programmierung Türme von Hanoi
wenn du "programmierst"
Delphi-Quellcode:
dann sieht deine procedure folgendes
bewege( s, q )
Delphi-Quellcode:
oder vielleicht
bewege( true, true )
Delphi-Quellcode:
oder auch
bewege( true, false )
Delphi-Quellcode:
oder sogar
bewege( false, true )
Delphi-Quellcode:
und daran soll die jetzt erkennen können von welchem turm zu welchem gezogen werden soll.
bewege( false, false )
Es gibt 6 Zug-Möglichkeiten, deiner procedure kann man aber nur 4 unterschiedliche parameter-kombis übergeben (s.o.) Das kann irgendwie noch nicht passen ... BTW: die procedure schert sich einen feuchten, mit welchen Variablen als Parameter die aufgerufen wurde. Es werden nur die Werte der Variablen übergeben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz