Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Delphi: Hinzufügen von Prozeduren

The MOD / 20 Antworten / Baumansicht Nickles

hi,


wie füge ich eine Prozedur ein, oder schalte sie hinzu, wenn bestimmte Bedingungen erfüllt sind???


NICHT: IF and then...

bei Antwort benachrichtigen
Andreas42 The MOD „Delphi: Hinzufügen von Prozeduren“
Optionen

Hi!

Verstehe deine Frage nicht.

IF ist der Befehl für bedingte Ausführungen in quasi allen Programmiersprachen. Daneben gibt's noch CASE.

Was du wirklich wissen willst, hab' ich nicht verstanden. Beschreibe es bitte nochmal, am besten mit einem beispiel.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Borlander Andreas42 „Hi! Verstehe deine Frage nicht. IF ist der Befehl für bedingte Ausführungen in...“
Optionen
Verstehe deine Frage nicht.
Da bist Du nicht der Einzige...

Beispiel wäre mit Sicherheit hilfreich!
bei Antwort benachrichtigen
The MOD Nachtrag zu: „Delphi: Hinzufügen von Prozeduren“
Optionen

naja, beispiel.

Ich will mit der image.canvas pixels zufällig zeichnen lassen und wenn diese mit einen bestimmten Wert [x,y] übereinstimmen sollte eine neue Procedur integriert werden, die ab da immmer gilt.

Was ist den an der Frage nicht zu verstehen???

P.S. Man könnte es doch mit IF and then machen, aber es gibt doch sicherlich eine bessere lösung??


Ich hoffe ihr habt mich verstanden :-)

bei Antwort benachrichtigen
Borlander The MOD „naja, beispiel. Ich will mit der image.canvas pixels zufällig zeichnen lassen...“
Optionen
und wenn diese mit einen bestimmten Wert [x,y] übereinstimmen sollte eine neue Procedur integriert werden, die ab da immmer gilt.
Ich vermute Du durchläufst das Bild mit mit 2 verschachtelten Schleifen?! Brich die Schleifen beim gefundenen Wert ab und lass zwei weitere verschachtelte Schleifen mit der neuen Procedur den Rast machen, bei dann wird bei jedem durchlauf min. ein Vergleich + ein bedingter Sprung eingespart.
Oder bestimmst Du Du zufällige Bildpunkte und willst sobald ein bestimmter Bildpunkt gezeichnet wurde etwas anderes machen?
Dann ist eine while(not ([...])) Konstruktion das richtige...

Falls es Dir um die Geschwindkeit geht ist die Pixels-Eigenschaft denkbar ungeignte zum Zeichnen - verwendet Stattdessen die Eigenschaft ScanLine


Gruß
Borlander
bei Antwort benachrichtigen
Andreas42 The MOD „naja, beispiel. Ich will mit der image.canvas pixels zufällig zeichnen lassen...“
Optionen

Hi!

Es ist die Kombination: "Ich will verzweigen, aber bitte ohne IF-Statement" = "Ich will Kurven fahren, aber bitte ohne Lenken". ;-)

OK, aber ich weiss ja jetzt, was du machen willst. Es gibt aber keine elegante Möglichkeit sowas per Drag&Drop in der Delphi-GUI (bzw. dem Objektinspector) einzurichten, da muss man immer programmieren (also mit IF-Statements arbeiten).

Jedenfalls gibt's IMHO keine vernünftige andere Lösung.

Und deshalb stelle ich dir jetzt eine unvernünftige vor. ;-)

Aber auch hier muss man die Tastatur quälen (und das nicht zu knapp):

Nutze einen Array aus Procedurvariablen oder besser einen Array mit Objektinstanzen.

Das Array enthält x Elemente in y Reihen und bildet damit deinen Zeichenbereich ab.
Nun definierst du eine Klasse PunktAktion. Diese Klasse besitzt eine Methode Aktion(), in der nichts passiert (sie enthält keinen Programmcode)
Von dieser abstrakten Klasse leitest du zwei Nachfolger ab: MachNix und MachWas.

In MachWas überschreibst du die Methode Aktion(). Sie muss deine gewünschte Procedur sein, oder diese aufrufen.

OK, nun musst du einen Array von Klasse PunktAktion anlegen. Die einzelnen Elemente müssen nun initialisiert werden. die Stellen, an denen nichts passiert werden, bekommen eine Instanz der Klasse MachNix zugewiesen, die Elemente, an denen was ausgeführt werden soll, bekommen eine Instanz der Klasse MachWas.

OK, wenn du nun einen Punkt durch Zufall ausgwählt hast, dann führt du die Methode Aktion() des Elementes an den Koordinaten deines Punktes aus.

Klar soweit?

Ich finde das deshalb unvernünftig, weill ich die Datenmenge des Array für zu gross halte. Falls du dass mit 800x600 Punkten einrichten willst, hat das Array immerhin schon 480.000 Elemente.

Ich denke, es ist da besser die Aktionspunkte in einem getrennten Array zu sichern und nach jeder Zeichenoperation eine Punktsuche im Array zu starten und dann die Aktion anzustossen, wenn der Punkt im Array enthalten ist.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
The MOD Nachtrag zu: „Delphi: Hinzufügen von Prozeduren“
Optionen

oh, hätte besser noch sagen soll, dass ich ein relativer anfänger bin!!!

Genauer gesagt hab ich vor, das eine Pixelline mit einen Timer versehen durchs Image "zieht" und bei jeden Tick verändert sich die Position um +1! Jetzt kommt Random ins Spiel, und zwar dann wenn zufällige Pixel aktiviet werden sollen.Wenn jetzt die laufende Line zu dem Pixel kommt soll sich die Linie verlängern!!!
Das Prinzip nennt sich Snake!!! :-)

Ich habs mir sogedacht, IF PositionSnake = PositionPixel ..., hier sollte dann stehen, dass dann die schlange ab jetzt z.b. 10Pixels länger ist!!!

Oder wisst ihr was besseres wie Image und Pixels??

P.S. Andreas, deinen Lösungsansatz hab ich überhaupt nicht verstanden

Danke

bei Antwort benachrichtigen
Borlander The MOD „oh, hätte besser noch sagen soll, dass ich ein relativer anfänger bin!!!...“
Optionen

Nimm einfach einen zweiten Timer (mit identischem Intervall) dazu auf den Du nach Erreichen der Position umschaltest, also:

Timer1.Enabled := false;
Timer2.Enabled := true

Währen der zweite Timer aktiv ist kann die Schlage dann wachsen - ist das Wachstum abgeschlossen schaltets Du wieder auf Timer1 zurück...


Gruß
Borlander
bei Antwort benachrichtigen
Andreas42 The MOD „oh, hätte besser noch sagen soll, dass ich ein relativer anfänger bin!!!...“
Optionen

Hi!

Tapeworm!

So nannte sich das erste Spiel für das uralte Atari VCS, dass mein Bruder (und ich) hatten. :-)

Schöner Klassiker, ich glaube aber, das ist nich so trivial, wie es aussieht. Was hast du denn dazu schon programmiert?
Ich verstehe jetzt, warum du nach "ohne IF" fragst, wenn man alle Elemente des Wurms (oder Mauer=Tron; oder der Schlange) in Variablen abspeichert und dann bei jedem Zug vergleichen will, gibt das eine IF-Orgie. ;-)

Es wird verscheide Wege geben, dass zu programmieren, man müsste sich einmal festlegen und dann mit dem Ansatz weitermachen.

Ich würde das Spielfeld auf eine feste Feldanzahl begrenzen. Z.B. auf 80*25 Zeichen (klassischer Textbildschirm).
Das hat den Vorteil, dass man das Spielfeld in einem recht kleinen Array unterbringen kann.

Etwa in der Art (Vorsicht, ist so runtergetippt, ohne es compiliert zu haben):

Ich schlage es erstmal "klassisch" vor, ohne Objekte und Klassen.

type
sfeldtype=record
art:byte;
richtung:byte;
end;

sfeld = array[1..80, 1..25] of sfeldtype;

Die Bedeutung der beiden Variablen in sfeldtype (Spielfeldtyp):

art:
Die Art des Feldes. Ein normales freies Feld, dass betreten werden kann, wäre z.B. 0 (Null), ein Teil der Schlange wäre 1 und eine Frucht (die die Schlange verlängert) z.B. 2.

richtung:
Ein Kniff, um die Bewegung der Schlnage zu erleichern. Hier wird abgelegt, in welche Richtung das nächste Teil der Schlange liegt:
1: Oben
2: Rechts
3: Unten
4: Links

Betrachtet vom Ende der Schlange.

Man braucht damit nur zwei Stellen der Schlnage zu kenne (bzw. in Variablen zu speichern): den Kopf (Anfang) und das Ende.

Wenn sich die Schlnage ein Feld weiterbewegt, dann hat man den alten Kopf (z.B. auf Punkt 60,15) und die Richtung (4: Links). Also prüft man Punkt 59,15 und wenn dort art=0 ist, dann wird dort art := 1 (schlangenelement) und richtung := 0. Im alten Kopf (6ß,15) muss richtung := 4 werden.
Das Ende der Schlange wäre z.B. auf 55,22. Dort haben wir eine richtung=2, damit liegt das nächste Element der Scglange auf Feld 56,22. Das machen wir zum neuen Ende der Schlanmge und setzen im alten Ende art := 0 und richtung := 0.

Wenn die Schlange frisst (länger wird), dann verzichten wir einfach auf das weiterziehen am Ende.

Schreib mal, was du dir ausgedacht hast.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
The MOD Andreas42 „Hi! Tapeworm! So nannte sich das erste Spiel für das uralte Atari VCS, dass...“
Optionen

hi,

Ich habe auch schon gemerkt, dass es doch nicht so einfach ist!!!

Ich habe mir bis jetzt keine sorgen über die größe des Feldes gemacht!!
Bis jetzt bin ich soweit, das ich beim oncreate des Formulars in dem Image eine Linie zeichne(besser wäre ein PolyLine)!!
Und die Linie ist an den Timer geschlossen und pro Timerklick erweitern sich die Punkte z.B. um 1!!!
Das ist schon das erste Problem!! Man zeichnet da unendlich viele Linien, weil man die erste Linie zeichnet, die stehen bleibt, eins weiter geht und zeichnet, die auch wieder stehen bleibt,...!! Deswegen hab ich noch in der Timer funktion image1.free eingebaut aber da kommt immer ein fehler!!!

Und Polyline deswegen, weil wenn man nach unten will, soll sich der aktuelle Punkt speichern und ihn in der Polylinie als "abbiege"-eck vermerken!!!

Ich denke nicht, dass mein Ansatz so gut ist, er verwirrt mich selbst!!!

Soll ich mal den Quelltext posten???

bei Antwort benachrichtigen
The MOD Andreas42 „Hi! Tapeworm! So nannte sich das erste Spiel für das uralte Atari VCS, dass...“
Optionen

sorry ich meinte nicht so gut!!!

bei Antwort benachrichtigen
The MOD Andreas42 „Hi! Tapeworm! So nannte sich das erste Spiel für das uralte Atari VCS, dass...“
Optionen

Und noch was, bei mir stand auch früher ein Atari rum, steht jetzt in der Gerümpelkammer!!!!
Mein Bruder und ich haben auch immer gezock, da gabs ja noch ein Spiel namens Airwolf, kennst du das auch???
Warst du auch in der Dos-Spiele Zeit dabei??
Wenn ja, kennst du von da noch Lost of Wikings oder die uralten Wintergames, Zentris

bei Antwort benachrichtigen
Andreas42 The MOD „Und noch was, bei mir stand auch früher ein Atari rum, steht jetzt in der...“
Optionen

Hi!

Airwulf: kommt mir bekannt vor. War das ein horizontal scrollendes Spiel mit einem Hubschrauber, der gegen Pnzer am Boden und Flugzeuge kämpfen musste (eine Art Defender?) -> Hab' einen Hinweis mit Google gefunden, dass ein "Air Wolf" gab', das von Quelle verkauft wurde. Kann durchaus sein, dass ich es schon selbst gespielt habe, in meiner aktuellen Samlung ist es aber nicht drinn (ist auch nur eine kleine, der "Abfall" vom Sammelhobby meines Bruders).

Ich hab' auch die DOS-Spielezeit mitgemacht, aber nicht so extrem. Eigentlich komme ich aus der Atari-Zeit und bin dann nach der C64-Zeit steckengeblieben. ;-)

Ein paar DOS-Spieleklassiker kenne ich aber auch. :-)

Wintergames kenne ich vom C64, "Lost Wikings" hab' ich im Ohr, es klingelt aber nicht (der Name sagt mir was, ich weiss aber nicht mehr um was es geht (war das ein Jump&Run?)

Richtig gezockt hab' ich allerdings nur 2 DOS-Games: Pinball-Dreams und Carrier Command. Ich hab' noch ein paar mehr, aber die waren eher gelegtlich bis seltem im Laufwerk (Psycho Pinball + X andere Pinballs; UFO Enemy Unknown, UFO Flugsimmulator - eine "Schwesterprogram" des bekannten Flugsimmulators, der damals noch nicht zu MS gehörte), Chuck Jeagers Flight Simmulator und natürlich Star Trek Adventures...) :-)

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
The MOD Andreas42 „Hi! Tapeworm! So nannte sich das erste Spiel für das uralte Atari VCS, dass...“
Optionen

Also dein Ansatz hört sich besser an, aber von dem "klassischen" hab ich keine Ahnung!!
Ich verstehe es halbweges, nur eines Wenn der Kopf in Richtung 4 geht warum der Schwanz in Richtung 2?? Muss doch beides in Richtung4 oder???

P.S. Danke, ich find es echt cool, dass du mir Hilfst!!!!

bei Antwort benachrichtigen
Andreas42 The MOD „Also dein Ansatz hört sich besser an, aber von dem klassischen hab ich keine...“
Optionen

Hi!

Von wegen Kopf in 4 und schwanz in 2: das ist nur ein Beispiel, ich hab' mir eine längere Schlange vorgestellt, die erst nach Rechts gegangen ist, dann ein paar schritte nach Oben und dann wieder nach Links.

-> Der Kopf bewegt sich nach Links und der Schwanz immer noch nach Rechts.

Mit deinem Anzatz komme ich auch nicht ganz klar. ;-) Er hat aber IMHO den Vorteil, dass du ein beliebiges Spielfeld nutzen kannst - dafür wird's halt komplizierter mit der Verwaltung.

Um die Bildschirmausgabe hab' ich mir übrigends noch überhaupt keine Gedanken gemacht. Ich hab' das getrennt:

- Ausgabe auf Bildschirm
- Eingabe
- Interne Spielfeldverwaltung (die "Spiel-Engine")

Mit "Zeichnen" unter Delphi hab' ich mich noch nie befasst, aber ich denke, damit wirst du klar kommen
Unter DOS würde ich den Bildschirm einfaach nach jeder Schlangenbewegung neu zeichen (einfach den Array komplett durchlaufen und und die Art des Feldes ausgeben: 0=Space, 1="*", usw.).
Das könnte man natürlich auch in einem echten Fenster machen, sieht aber natürlich etwas primitiv aus. ;-)

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
The MOD Nachtrag zu: „Delphi: Hinzufügen von Prozeduren“
Optionen

hi,

hab gestern mal meinen Lehrer für Delphi in meiner Schule gefragt, der meinte es gäbe keine methode um ein in einem Image Dinge zu löschen!!!
Von daher ist mein Ansatz unmöglich!!!!!!!!!!!!

Was würdest du mir vorschlagen???

bei Antwort benachrichtigen
Borlander The MOD „hi, hab gestern mal meinen Lehrer für Delphi in meiner Schule gefragt, der...“
Optionen
um ein in einem Image Dinge zu löschen!!!
Mit der Hintergrundfarbe übermalen könnte man auch als Löschen auffassen ;-) Dafür braucht es keine extra Procedur...

Gruß
Borlander
bei Antwort benachrichtigen
The MOD Nachtrag zu: „Delphi: Hinzufügen von Prozeduren“
Optionen

hab ihr noch verschläge, würde mich echt reizen das Projekt hinzubekommen!!!!!!!!!!!!!!

bei Antwort benachrichtigen
Borlander The MOD „hab ihr noch verschläge, würde mich echt reizen das Projekt...“
Optionen

Für welche Probleme genau suchst Du denn noch Vorschläge?

bei Antwort benachrichtigen
The MOD Nachtrag zu: „Delphi: Hinzufügen von Prozeduren“
Optionen

Ich möchte gerne Snake programmieren!!!
Da suche ich jetzt Lösungsvorschläge, über verschiedene Komponenten und Methoden!!!

bei Antwort benachrichtigen
Borlander The MOD „Ich möchte gerne Snake programmieren!!! Da suche ich jetzt Lösungsvorschläge,...“
Optionen
Ich möchte gerne Snake programmieren!!!
Das ist schon klar, aber sollen wir Dir vielleicht das komplette Programm zusammenbasteln?

Lösungsvorschläge, über verschiedene Komponenten und Methoden!!!
Wurden doch hier im Thread schon eine ganze Menge genannt - falls noch Fragen zu Details/Teilproblemen bestehen, dann stell sie einfach...
bei Antwort benachrichtigen