Autor Beitrag
AlexN
Hält's aus hier
Beiträge: 4

WIN XP
D6 Pers
BeitragVerfasst: Do 15.01.04 20:10 
Hallo!

Ich möchte ein Labyrinth Spiel in Delphi mit Hilfe der Komponente Turtle realisieren. Eigentlich ist mit alles klar, einzig allein die Steuerung der Turtle macht mir im Moment noch Sorgen. Man soll die Turtle mit den Pfeiltasten der Tastatur steuern können. Wenn man auf die Rechte Pfeil Taste drückt soll sich die Turtle drehen und nach rechts laufen. Nun kommt aber mein Problem: Wenn die Turtle gerade aus fährt, muss sie eine Drehung nach Rechts machen und danach weiterlaufen. Das habe ich so realisiert, dass mit Hilfe einer True/False Variable die aktuelle Richtung überprüft wird und dann entschieden wird, wie sich die Turtle zu drehen hat. Hier der noch unfertige Quelltext.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
unit labyrinth;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Turtle, MathEdit;

type
  TForm1 = class(TForm)
    Turtle1: TTurtle;
    Panel1: TPanel;
    Score_la: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Score:Integer;
  Turtlehoehe:Integer;
  rechts,links,oben,unten: boolean;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Score := 0;
Turtlehoehe:=5;
Turtle1.PU;
Turtle1.TurtleHeight:=Turtlehoehe;
rechts:=false;
links:=false;
oben:=false;
unten:=false;


end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);


begin
 if key = 38 then // Pfeil-Hoch Taste zum Bewegen der Turtle nach oben

      oben:=true;
      begin


      if rechts = true then     // Wenn Turtle rechtsgedreht 90 Grad nach links
      Turtle1.LT(90);
      begin
      rechts:=false;
      end;
      if key = 38 then
      begin Turtle1.FD(2);
      oben:=true;
      end

      else if links = true then  // Wenn Turtle rechtsgedreht 90 Grad nach rechts
      Turtle1.RT(90);
      begin
      links:=false;
      end;
      if key = 38 then
      begin Turtle1.FD(2);
      oben:=true;
      end

      else if unten = true then  // Wenn Turtle nach unten zeigt 180 Grad Drehung
      Turtle1.RT(180);
      begin
      links:=false;
      end;
      if key = 38 then
      begin Turtle1.FD(2);
      oben:=true;
      end

      else if oben = true then // Wenn in Position, nach vorne
      begin
      if key = 38 then
      begin Turtle1.FD(2);
      oben:=true;
      end









else if key = 39 then // Pfeil-Rechts Taste zum Bewegen der Turtle nach rechts

    rechts:=true;
    begin

    if links = true then     // Wenn Turtle linksgedreht, 180 Grad Drehung
    Turtle1.LT(90);
    begin
    if key = 39 then
    end;
    begin Turtle1.FD(2);
    rechts:=true;
    end
    end
    end

    else if oben = true then // Wenn Turtle oben, 90 Grad Drehung rechts
    Turtle1.RT(90);
    begin
    if key = 39 then
    end;
    begin Turtle1.FD(2);
    rechts:=true;
    end
    end
    end;

    else if unten = true then // Wenn Turtle unten, 90 Grad Drehung links
    Turtle1.LT(90);
    begin
    if key = 39 then
    end;
    begin Turtle1.FD(2);
    rechts:=true;
    end
    end
    end

    else if rechts = true then // Wenn in Position, nach vorne
    Turtle1.FD(2);
    rechts:=true;

    end








end;
end;
end.



Irgendwie läuft das ganze nicht sauber und ist ziemlich unübersichtlich. Gibts da nicht noch eine einfachere Möglichkeit, die nicht so viel Quelltext erfordert?

Ich hab erst seit einem halben Jahr Delphi, deshalb freue ich mich über jede Hilfe :wink:
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 16.01.04 09:12 
Hallo und :welcome: hier im Delphi-Forum.de!

Vorab: Wie setzt du die Begin´s und End´s bei den IF-THEN Anweisungen? War der Code überhaupt zu compilieren? So ist es richtig:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
If Bedingung Then
  Begin
    { Anweisungen1 }
    { Anweisungen2 }
    { Anweisungen... }
  End;

oder
ausblenden Delphi-Quelltext
1:
2:
If Bedingung Then
   { Anweisung }


Als erstes würde ich die Boolean-Variablen rechts, links, ... entfernen und einen Aufzählungstypen definieren weil... Da die Spielfigur ja nur in eine Richtung laufen kann würde ich von den vier Boolean Variablen absehen da man ja gleichzeitig mehrere Variablen auf True stellen könnte (macht also keinen Sinn). Deshalb erstelle lieber ein Aufzählungstypen der die Richtung angibt:
ausblenden Delphi-Quelltext
1:
2:
Type
  TRichtung = (rRechts, rLinks, rOben, rUnten);

Davon kannst du dann eine Variable definieren:
ausblenden Delphi-Quelltext
1:
2:
Var
  AktuelleRichtung: tRichtung;

Außerdem würde ich einen Aufzählungstypen definieren mit dem man die Drehrichtung festlegen kann:
ausblenden Delphi-Quelltext
1:
2:
Type
  tDrehrichtung = (drLinks, drRechts);

Um später bestimmen zu können wie rum und um wieviel Grad gedreht werden muss um von einer Ausgangsrichtung in eine andere Richtigung zu gelangen definieren wir ein 2 Dimensionales Konstanten Array:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Const
  cBewegung : Array [tRichtung, tRichtung] of Record
      DR: TDrehrichtung;
      G: Integer;
    end = (
     // Drehung von Rechts nach...
     ((DR: drKeine; G: 0), (DR: drLinks; G: 90), (DR: drLinks; G: 180), (DR: drRechts; G: 90)),
     // Drehung von Oben nach...
     ((DR: drRechts; G: 90), (DR: drKeine; G: 0), (DR: drLinks; G: 90), (DR: drRechts; G: 180)),
     // Drehung von Links nach...
     ((DR: drLinks; G: 180), (DR: drRechts; G: 90), (DR: drKeine; G: 0), (DR: drLinks; G: 90)),
     // Drehung von Unten nach...
     ((DR: drLinks; G: 90), (DR: drLinks; G: 180), (DR: drRechts; G: 90), (DR: drKeine; G: 0))
   );

Das FormKeyDown Event würde ich dann wie folgt ändern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Var
  NeueRichtung: tRichtung;
Begin
  // Die neue Richtung anhand der gedrückten Taste setzen
  Case Key of
      xy:  // Rechts
        NeueRichtung := rRechts;
      xy:  // Links
        NeueRichtung := rLinks;
      38:  // Oben
        NeueRichtung := rOben;
      xy:  // Unten
        NeueRichtung := rUnten;
    End;

  // Spielfigur in die neue Richtung bewegen
  With cBewegung [AktuelleRichtung, NeueRichtung] Do
    Case DR Of
        drKeine:  { nicht drehen } ;
        drLinks:  Turtle1.LT (G);
        drRechts: Turtle1.RT (G);
      End;

  AktuelleRichtung := NeueRichtung;
End;

Ich hofffe ich konnte dir einen kleinen Tipp geben wie du es eventl. lösen könntest :-)

Gruß
Tino