Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programmierung Türme von Hanoi (https://www.delphipraxis.net/147473-programmierung-tuerme-von-hanoi.html)

nairolf92 9. Feb 2010 15:18


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

Jens Hartmann 9. Feb 2010 15:27

Re: Programmierung Türme von Hanoi
 
Hallo,

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

Türme...

Gruß Jens

MrSpock 9. Feb 2010 15:58

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).

nairolf92 9. Feb 2010 16:49

Re: Programmierung Türme von Hanoi
 
Ok danke, hab mir jetzt 3 Stapelspeicher erstellt, hat funktioniert. Danke für die Hilfe. ;)

MrSpock 9. Feb 2010 17:27

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:

nairolf92 15. Feb 2010 16:22

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:
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?

MrSpock 15. Feb 2010 18:02

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.

Sir Rufo 15. Feb 2010 18:30

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;

haentschman 15. Feb 2010 18:37

Re: Programmierung Türme von Hanoi
 
im DF gibts auch schon viele Antworten :zwinker:

nairolf92 17. Feb 2010 17:18

Re: Programmierung Türme von Hanoi
 
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr.
Seite 1 von 2  1 2      

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