Autor |
Beitrag |
ravenstorm
Hält's aus hier
Beiträge: 2
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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  ).
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.
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;
...
var ... ant: TAmeise;
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 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; ant.pos_y := ant.pos_y + ant.dir_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:
Delphi-Quelltext 1: 2: 3:
| Randomize; for i := 1 to Random(4) + 1 do TurnLeft; |
Für diesen Beitrag haben gedankt: ravenstorm
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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).
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 dir_x := dirx; dir_y := diry; pos_x := posx; pos_y := posy; Canvas := ACanvas; end;
procedure TAmeise.Walk; begin pos_x := pos_x + dir_x; pos_y := pos_y + dir_y; end;
procedure TAmeise.Step; 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;
MyAmeise := TAmeise.Create(1, 0, 280, 200, 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Mi 01.12.10 19:55
procedure TForm1.Step; wird so nicht funktionieren, da fehlt der zugriff auf die klasse
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Mi 01.12.10 19:56
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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Mi 01.12.10 20:16
glotzer hat folgendes geschrieben : | 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 
Hält's aus hier
Beiträge: 2
|
Verfasst: 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
|
|
|