Autor Beitrag
Hennar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 18.12.10 18:39 
Hallo Zusammen,
Wie haben in Informatik ein Hase und Jäger Spiel bekommen.
Spielfeld etc war schon vorgegeben, wir sollten nur die Such/Lauf Prozeduren für Jäger und Hase schreiben.
Zur zeit läuft es so ab, dass der Hase (roter Pfeil) "Zufällig" durch das Labyrinth läuft, der Jäger hingegen durch ein Arrag gesteuert (heißt "Schatten"). Der Jäger macht 2 Schritte der Hase nur einen. Früher oder später findet er ihn dann.
Nun soll das ganze mit Hilfe von Phytagoras verbesster werden, das der Jäger also die Position des Hasens weiß und nun mit Hilfe der Dreiecksberechnung in die Richtung des Hasens geht.
Leider fehlt mir da der Ansatz wie man den Jäger den Phytagoras ausrechenen lässt und ihn dem entsprechend laufen lässt, und hoffe da auf eure Hilfe :D
Das ist die Suchprozedur, falls es dazu noch Fragen gibt erkläre ich das natürlich gerne:
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:
For  spalte:=0 to 22 do begin
      For zeile:=0 to 22 do begin
         Schatten[spalte,zeile]:=0;
      end;
  end;
   //
  Schritte:=0;
  While (not((vorneZiel)or(rechtsZiel)or(linksZiel))) do begin
     Jaegerschritt;
     Jaegerschritt;
     Hasenschritt;
  end;

  //  Hier endet das Suchprogramm **********************************************
CBWahl.Enabled:=true;
end;

procedure TForm1.Jaegerschritt;
begin
// Gang
     If (vornefrei and (not(rechtsfrei)) and (not(linksfrei))) then begin
        //
     end;
     //Sackgasse
     If (not(vornefrei) and not(rechtsfrei) and not(linksfrei)) then begin
       Linksdrehen;
       Linksdrehen;
     end;
     //Linkskurve
     If (not(vornefrei) and not(rechtsfrei) and (linksfrei)) then begin
       Linksdrehen;
     end;
     //Rechtskurve
     If (not(vornefrei) and (rechtsfrei) and not(linksfrei)) then begin
       Rechtsdrehen;
     end;
     //Verzweigung vr
     If ((vornefrei) and (rechtsfrei) and not(linksfrei)) then begin
        If Schatten[xvorne,yvorne]>Schatten[xrechts, yrechts] then begin
          rechtsdrehen;
        end;
     end;
     //Verzweigung vl
     If ((vornefrei) and not(rechtsfrei) and (linksfrei)) then begin
        If Schatten[xvorne,yvorne]>Schatten[xlinks, ylinks] then begin
          linksdrehen;
        end;
     end;
     //Verzweigung rl
     If (not(vornefrei) and (rechtsfrei) and (linksfrei)) then begin
        If Schatten[xrechts,yrechts]>Schatten[xlinks, ylinks] then begin
          linksdrehen;
        end else begin
          Rechtsdrehen;
        end;
     end;
     //Verzweigung vrl
     If ((vornefrei) and (rechtsfrei) and (linksfrei)) then begin
        If (Schatten[xrechts,yrechts]<=Schatten[xlinks, ylinks])and(Schatten[xrechts,yrechts]<Schatten[xvorne, yvorne]) then begin
           Rechtsdrehen;
        end else begin
           If (Schatten[xlinks,ylinks]<Schatten[xrechts, yrechts])and(Schatten[xlinks,ylinks]<Schatten[xvorne, yvorne])then begin
             Linksdrehen;
           end;
        end;
     end;
     // und ein Schritt vorwärts
     vorwärts;
     Schatten[x,y]:=Schatten[x,y]+1;
     Inc(Schritte);
     LSchrittzahl.Caption:=IntToStr(Schritte);

end;

procedure TForm1.Hasenschritt;
begin
     randomize;
     // Gang
     If (vornefreih and (not(rechtsfreih)) and (not(linksfreih))) then begin
        //
     end;
     //Sackgasse
     If (not(vornefreih) and not(rechtsfreih) and not(linksfreih)) then begin
       Linksdrehenh;
       Linksdrehenh;
     end;
     //Linkskurve
     If (not(vornefreih) and not(rechtsfreih) and (linksfreih)) then begin
       Linksdrehenh;
     end;
     //Rechtskurve
     If (not(vornefreih) and (rechtsfreih) and not(linksfreih)) then begin
       Rechtsdrehenh;
     end;
     //Verzweigung vr
     If ((vornefreih) and (rechtsfreih) and not(linksfreih)) then begin
        if random(2)=1 then rechtsdrehenh;
     end;
     //Verzweigung vl
     If ((vornefreih) and not(rechtsfreih) and (linksfreih)) then begin
        If random(2)=1 then linksdrehen;
     end;
     //Verzweigung rl
     If (not(vornefreih) and (rechtsfreih) and (linksfreih)) then begin
        If random(2)=1 then linksdrehenh else rechtsdrehenh;
     end;
      //Verzweigung vrl
     If ((vornefreih) and (rechtsfreih) and (linksfreih)) then begin
        If random(3)=1 then rechtsdrehenh;
        If random(3)=2 then linksdrehenh;
     end;
     vorwärtsh;
end;

end.

Und ein Bild:

Moderiert von user profile iconMartok: Quote- durch Delphi-Tags ersetzt
Einloggen, um Attachments anzusehen!
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 18.12.10 19:25 
Um die prinzipielle Richtung herauszufinden, benötigt man ja die entsprechenden Koordinaten (x,y). Und dann brauchst Du ja nur folgendes zu machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
// x, y : Position Jäger
// xh, yh : Position Hase
  dx := x - xh;
  dy := y - yh;
  Richtung := arcsin(dy / wurzel(sqr(dx)+sqr(dy))/pi;

Richtung -0,25 .. 0,25 :
dx > 0 in +x-Richtung gehen
dx < 0 in -x-Richtung gehen
Richtung -0,5 .. -0,25 :
in -y-Richtung gehen
Richtung -0,25 .. 0,5 :
in +y-Richtung gehen

dann hast Du die Richtung, in der der Jäger gehen sollte. Problem ist nur, dass in einer Sackgasse dies dann zu einem Hin- und Her führt, wenn die Richtung in die Sackgasse hinein führt.

Außerdem muss es wohl in Zeile 101 linksdrehenh statt linksdrehen heißen

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.