Autor Beitrag
ravenstorm
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 01.12.10 19:06 
hey leute,

bin neu hier und hoffe, dass ich jetzt in die richtige kategorie gepostet hab.
ich würde mich freuen wenn mir jemand mit etwas erfahrung im programmieren mit delphi bei meinem problem helfen könnte.

wir haben in der informatik-ag gerade das thema "grafik-programierungen mit delphi" angefangen und wer wollte konnte dazu ein referat machen bzw. eine aufgabe vorstellen.
der lehrer den ich habe mag mich aber aus irgentwelchen gründen nicht (ich weiß nicht wieso :( ! ) und hat mir die allerschwerste aufgabe gegeben, mit sachen die wir noch gar nicht gemacht haben...
es wär total nett wenn mir jmd. damit helfen könnte, mit einem programmiervorschlag (bitte nichts zuu schweres) damit ich den dann vorstellen kann, ansonsten muss ich ihm wohl sagen, dass ich aufgebe.

die aufgabe lautet:

eine ameise läuft von einem beliebigen bildpunkt aus zufällig ein pixel nach oben/unten/links oder rechts (hier ist denk ich die random funktion gefragt).
existiert der punkt, auf den sie kommt (punktfarbe überprüfen!), so ändert sie die farbe des punktes, indem sie ihn löscht und dreht sich um 90 grad nach rechts.
existiert der punkt nicht, so wird er gesetzt und sie dreht sich um 90 grad nach links.
das verhalten der ameise am rand des sichtbaren bildschirms wird festgelegt durch
a) die ameise verschwindet, wenn sie den bildschirmrand überschreitet
b) die ameise wird am bildschirmrand zurückgedreht und läuft weiter.


falls euch das noch hilft: wir haben bisher eigentlich vom grafischen her eig. nur was mit der untereigenschaft "canvas" programmiert.


ich bedanke mich schon mal für alle hilfen/programmvorschläge :)

grüße ravenstorm
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 01.12.10 19:16 
Tipp: Das Teil heißt Langton's Ameise.

de.wikipedia.org/wiki/Langton%27s_ant

Aufgeben solltest du nicht. Du solltest ihm lieber zeigen, dass du dich den Anforderungen gewachsen fühlst (ein Programmierer kennt keinen Schmerz :P ).

k. A., in wie weit du dich mit records auskennst. Ich hab das mal in langer Weile programmiert. Etwas weniger als die Aufgabenstellung, aber als Anstoß sicher geeignet.

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:
type
  TAmeise = record
    dir_x, dir_y: Integer;
    pos_x, pos_y: Integer;
  end;

... {TForm1 = class(TForm) und sowas}

var
  ...
  ant: TAmeise;

// var bedeutet: nicht der Wert, sondern die Adresse wird übergeben
procedure Swap(var x, y: Integer);
var
  p: Integer;
begin
  p := x;
  x := y;
  y := p;
end;

procedure TurnLeft;
begin
  Swap(ant.dir_x, ant.dir_y);
  ant.dir_x := -ant.dir_x;
end;

procedure TurnRight;
begin
  Swap(ant.dir_x, ant.dir_y);
  ant.dir_y := -ant.dir_y;
end;

procedure InitAnt;
begin
  { Initialisieren }
  ant.dir_x := 1;
  ant.dir_y := 0;
  ant.pos_x := 280;
  ant.pos_y := 200;
end;

procedure Walk;
begin
  ant.pos_x := ant.pos_x + ant.dir_x; // X
  ant.pos_y := ant.pos_y + ant.dir_y; // Y
end;

procedure TForm1.Step;
begin
  with PaintBox1.Canvas do
    case Pixels[ant.pos_x, ant.pos_y] of
      clWhite:
        begin
          Pixels[ant.pos_x, ant.pos_y] := clBlack;
          TurnRight;
          Walk;
        end;
      clBlack:
        begin
          Pixels[ant.pos_x, ant.pos_y] := clWhite;
          TurnLeft;
          Walk;
        end
    end
end;


Ich gehe hier natürlich davon aus, dass du weißt, was Records und Prozeduren/Funktionen sind. Ansonsten hier eine kurze Erklärung:

··· Records sind einfach nur eine Zusammenfassung von Daten. Mit einer Ameise wird das ziemlich sinnlos. Es könnte aber von Interesse werden, wenn man das z. B. um mehrere Ameisen erweitert. Die Position und die Richtung gehören eben alle zur Ameise, ebenso wie Buttons usw. zur TForm1 gehören, was eine Klasse ist (eine Klasse ist so was wie ein erweiterter Record).

··· eine Prozedur ist nichts weiter als eine Zusammenfassung von Anweisungen. Statt immer eine dritte Variable zum Tauschen einzuführen, kannst du das jetzt immer mit Swap(..., ...) aufrugen

··· var/const bei den Argumenten von Prozeduren/Funktionen bedeuten entweder, dass die Adresse oder der Wert übergeben wird. Wird nur der Wert übergeben, hat eine Änderung der Variablen keine Auswirkungen außerhalb der Prozedur. Delphi nimmt es dir ab, mit Pointern zu arbeiten (ein Pointer ist die Adresse einer Variable, allerdings wird ein richtiger Pointer auch als solche behandelt, also wie eine Zahl, mit der du rechnen kannst).

Einfachster Weg für die randomisierte Startrichtung wäre, denke ich:

ausblenden Delphi-Quelltext
1:
2:
3:
Randomize;
for i := 1 to Random(4) + 1 do
  TurnLeft;

Für diesen Beitrag haben gedankt: ravenstorm
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 01.12.10 19:43 
das hier schreit geradezu nach einer Klasse TAnt...

records sind hier (meiner meinung nach) ganz und garnicht der schönste weg
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 01.12.10 19:52 
Die Frage ist aber, ob man einen Anfänger gleich mit OOP belasten sollte. So ist das noch relativ einfach zu verstehen, OOP ist schon ein größerer Sprung (du hast natürlich recht, dass eine Klasse hier eleganter wäre).

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:
type
  TAmeise = class
    constructor Create;
  private
    dir_x, dir_y: Integer;
    pos_x, pos_y: Integer;
  public
    Canvas: TCanvas;
    procedure TurnLeft;
    procedure TurnRight;
    procedure Walk;
    procedure Step;
  end;

procedure Swap(var x, y: Integer);
var
  p: Integer;
begin
  p := x;
  x := y;
  y := p;
end;

procedure TAmeise.TurnLeft;
begin
  Swap(dir_x,dir_y);
  dir_x := -dir_x;
end;

procedure TurnRight;
begin
  Swap(dir_x, dir_y);
  dir_y := -dir_y;
end;

constructor TAmeise.Create(dirx, diry, posx, posy: Integer; ACanvas: TCanvas);
begin
  { Initialisieren }
  dir_x := dirx;
  dir_y := diry;
  pos_x := posx;
  pos_y := posy;
  Canvas := ACanvas; // Achtung: Klassen werden als Referenz übergeben!!!
end;

procedure TAmeise.Walk;
begin
  pos_x := pos_x + dir_x; // X
  pos_y := pos_y + dir_y; // Y
end;

procedure TAmeise.Step; // EDIT: Nach glotzers Post korrigiert
begin
  with Canvas do
    case Pixels[pos_x, pos_y] of
      clWhite:
        begin
          Pixels[pos_x, pos_y] := clBlack;
          TurnRight;
          Walk;
        end;
      clBlack:
        begin
          Pixels[pos_x, pos_y] := clWhite;
          TurnLeft;
          Walk;
        end
    end
end;

{FormCreate}
MyAmeise := TAmeise.Create(10280200, PaintBox1.Canvas);


Ich bin jedenfalls der Meinung, dass das ein wenig viel auf einmal wäre.


Zuletzt bearbeitet von Jakob_Ullmann am Mi 01.12.10 19:59, insgesamt 2-mal bearbeitet
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 01.12.10 19:55 
procedure TForm1.Step; wird so nicht funktionieren, da fehlt der zugriff auf die klasse
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 01.12.10 19:56 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Step;
begin
  with Canvas do
    case Pixels[pos_x, pos_y] of
      clWhite:
        begin
          Pixels[pos_x, pos_y] := clBlack;
          MyAmeise.TurnRight;
          MyAmeise.Walk;
        end;
      clBlack:
        begin
          Pixels[pos_x, pos_y] := clWhite;
          MyAmeise.TurnLeft;
          MyAmeise.Walk;
        end
    end
end;

auserdem muss die ameise auch noch gezeichnet werden
(sorry für doppelpost)
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 01.12.10 19:57 
Ja, eigentlich sollte es auch TAmeise.Step sein. Und dann klappt es. ;-)

PS: Nein, gezeichnet werden muss nichts. Deshalb wird ja PaintBox1.Canvas im Konstruktor übergeben. Somit zeichnet die Ameise auf die PaintBox (daher der Hinweis der Übergabe als Referenz).
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 01.12.10 20:03 
soll die armeise SELBST nich auch noch sichtbar sein?
btw: jetzt ist hier doch wieder perfekter copy-past code :p
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 01.12.10 20:16 
user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
soll die armeise SELBST nich auch noch sichtbar sein?
btw: jetzt ist hier doch wieder perfekter copy-past code :p


keine Ahnung, was willst du mit einer sichtbaren Ameise? Falls das aber der Fall ist, kann man das ziemlich einfach lösen, man muss sich nur die Farbe des Pixels merken und das Ameisenpixel rot färben (und im nächsten Schritt wieder auf die eigentliche Farbe bringen).

Die Hauptsache ist doch, dass er es versteht. Wenn er es nur kopiert, ohne es zu verstehen, dann checkt der Lehrer das [a) -> ...] oder er checkt es nicht [b) -> selbst dran schuld]. Zur Aufgabenstellung fehlt noch was. Das ist vom Schwierigkeitsgrad her nicht viel niedriger als der Rest (wenn man von OOP mal absieht). Gerade OOP muss man aber verstanden haben, wenn man es erklären will.
ravenstorm Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 02.12.10 21:00 
records haben wir schonmal kurz behandelt, ich denke dass ich mich deshalb mal genauer mit dem ersten post beschäftigen werde.
danke euch allen- ich hoffe das alles hilft mir fürs erste weiter :)
lg ravenstorm