AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programmierung Türme von Hanoi

Ein Thema von nairolf92 · begonnen am 9. Feb 2010 · letzter Beitrag vom 18. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
nairolf92

Registriert seit: 9. Feb 2010
5 Beiträge
 
#1

Programmierung Türme von Hanoi

  Alt 9. Feb 2010, 15:18
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
Angehängte Dateien
Dateityp: zip t_rme_von_hanoi_339.zip (170,1 KB, 56x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Programmierung Türme von Hanoi

  Alt 9. Feb 2010, 15:27
Hallo,

zeig doch mal an Code was Du so hast. Ansonsten vieleicht auch mal hier schauen.

Türme...

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Programmierung Türme von Hanoi

  Alt 9. Feb 2010, 15:58
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).
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
nairolf92

Registriert seit: 9. Feb 2010
5 Beiträge
 
#4

Re: Programmierung Türme von Hanoi

  Alt 9. Feb 2010, 16:49
Ok danke, hab mir jetzt 3 Stapelspeicher erstellt, hat funktioniert. Danke für die Hilfe.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Programmierung Türme von Hanoi

  Alt 9. Feb 2010, 17:27
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
nairolf92

Registriert seit: 9. Feb 2010
5 Beiträge
 
#6

Re: Programmierung Türme von Hanoi

  Alt 15. Feb 2010, 16:22
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:
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;
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.
darf man bei einer prozedur nicht auf die edit- und image felder zurückgreifen? wenn ja wie könnte ich es anders schreiben?
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Programmierung Türme von Hanoi

  Alt 15. Feb 2010, 18:02
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Programmierung Türme von Hanoi

  Alt 15. Feb 2010, 18:30
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#9

Re: Programmierung Türme von Hanoi

  Alt 15. Feb 2010, 18:37
im DF gibts auch schon viele Antworten
  Mit Zitat antworten Zitat
nairolf92

Registriert seit: 9. Feb 2010
5 Beiträge
 
#10

Re: Programmierung Türme von Hanoi

  Alt 17. Feb 2010, 17:18
so hab die prozedur jetz ein bisschen verändert:
Delphi-Quellcode:
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;
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.
was könnte der fehler sein? ist es falsch mit z.b. if (start=s) and (ziel=a) then anzufangen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz