Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Snake - Ein Problem mit dynamischen Arrays (https://www.delphipraxis.net/167525-snake-ein-problem-mit-dynamischen-arrays.html)

MrMooed 4. Apr 2012 17:58

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von Coffeecoder (Beitrag 1160226)
Spontan und sauberer wäre folgendes - Pseudocode:
Code:
- Kopf der Schlange mit dem nächsten Feld vergleichen
- wenn frei dann darf ich mich dahin bewegen
- wenn nicht frei
    - gucken ob es Futter ist > Schlange wachsen lassen usw
    - gucken ob es die Wand ist - wenn ja dann verloren

Sicher so dachte ich mir das am Anfang auch. Doch wenn man versuchen würde die Felder rings herum zu untersuchen und man sich zufälligerweise am Rande des Arrays befindet, müsste es doch eigentlich ne Zugriffvsverletzung geben, da er ja nicht auf etwas zugreifen kann, was nicht im Array liegt :shock: So kam ich letztendlich ja auf Tr..Exept :?

DeddyH 4. Apr 2012 18:01

AW: Snake - Ein Problem mit dynamischen Arrays
 
Du hast nur dann einen Vorgänger, wenn der aktuelle Array-Index > Low(Array) und nur dann einen Nachfolger, wenn der Index < High(Array) ist. Das kann man abfragen, dazu braucht es kein extra Exception-Handling.

MrMooed 4. Apr 2012 18:16

AW: Snake - Ein Problem mit dynamischen Arrays
 
Ahhh *klick* Somit müsste ich also vor jeder Bewegung überprüfen lassen, ob in der aktuellen Richtung ein Block vorhanden ist -> falls nicht Leben abziehen/ Beenden. Habe hier ebenfalls auf nicht auf die Syntax geachtet, aber so in etwa würde es dann ausschauen:

Delphi-Quellcode:
möglich = True
case Richtung of
  vorwärts: if Array[i+1] > High(Array) then moeglich = False;
  unten  : if Array[i-1] < Low(Array) then moeglich = False;
  rechts : if Array[i,b+1] > High(Array[i]) then moeglich = False;
  links  : if Array[i,b-1] < Low(Array[i]) then moeglich = False;
end;
Jenachdem ob 'moeglich' True ist bewegt sich dann die Schlange - oder eben nicht. Hätte mir das jetzt eigentlich länger vorgestellt :lol: aber wären nicht "schnellere" Versionen mit Try..Exept zu bevorzugen ? :o Man muss ja nicht immer das Rad neu erfinden :-D

DeddyH 4. Apr 2012 18:32

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von MrMooed (Beitrag 1160236)
aber wären nicht "schnellere" Versionen mit Try..Exept zu bevorzugen ?

Klar, ich achte ja auch nie darauf, ob eine Ampel rot zeigt, da mein Auto über Sicherheitsgurte und Airbags verfügt :zwinker:

Popov 4. Apr 2012 18:42

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von MrMooed (Beitrag 1160098)
Also würdest du alle Koordinaten (sei es nun die der Schlange als auch die der Äpfel/ Münzen) in einem Array Speichern ?

Ich habe gemerkt, dass wenn man auf einem C64 angefangen hat zu programmieren, dann denkt man auch Byte-sparsam. Hier das Konzept mit einem Array-Snake:

Beispiel Array 40x40 als Byte (mehr braucht man nicht)
Vereinbarung: 0 ist leeres Feld, 1 bis 126 Snake, wobei 1 der Kopf ist, 127 ist der Apfel, 128 Wand, Rest 129 bis 255 offen für Erweiterungen
Eine Count Variable für die Länge der Schlange, wobei man auf die verzichten könnte, aber wir wollen es nicht zu kompliziert machen

Neue Kopfposition berechnen, prüfen auf Kollision mit Apfel oder Wand, bei Apfel Count erhöhen, bei Wand Ende
Mit zwei For-Schleifen (X/Y) das Ganze Array durchlaufen. Wert 0 und Werte größer 126 werden ignoriert
Alle Werte zwischen 1 und (126 - 1) und 1 erhöhen
Kopf-X/Y-Position übertragen und den Wert 1 zuweisen
Werte größer Count löschen, bzw. 0 setzten

Fertig

In einer weiteren Prozedur mit den Werten zeichnen.

MrMooed 4. Apr 2012 18:46

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von DeddyH (Beitrag 1160242)
Klar, ich achte ja auch nie darauf, ob eine Ampel rot zeigt, da mein Auto über Sicherheitsgurte und Airbags verfügt :zwinker:

Ich hätte das jetzt eher so formuliert:
Warum sollte ich mich gegen das Aute stellen, wenn ich auch einfach die Bremse zum bremsen nutzen kann :gruebel:

Viele Wege führen nach Rom ;)

MrMooed 4. Apr 2012 18:52

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von Popov (Beitrag 1160246)
Neue Kopfposition berechnen, prüfen auf Kollision mit Apfel oder Wand, bei Apfel Count erhöhen, bei Wand Ende
Mit zwei For-Schleifen (X/Y) das Ganze Array durchlaufen. Wert 0 und Werte größer 126 werden ignoriert
Alle Werte zwischen 1 und (126 - 1) und 1 erhöhen
Kopf-X/Y-Position übertragen und den Wert 1 zuweisen
Werte größer Count löschen, bzw. 0 setzten

Fertig

In einer weiteren Prozedur mit den Werten zeichnen.

:wall: verdammt.. soetwas ähnliches ging gerade durch den Kopf :? Nach einer stärkenden Mahlzeit werde ich mich dann mal nachher dran machen, vllt. finde ich ja noch was schlichteres :P

quaxdachs 4. Apr 2012 20:29

AW: Snake - Ein Problem mit dynamischen Arrays
 
Tach,

aaaalso mein erster Post in einem Delphi-Forum ;-) Ich bin kein großer Praktiker und schon gar nicht für Delphi (meine Güte bin ich froh, dass ich nach der Schulzeit nie wieder etwas damit zu tun hatte), aber jetzt mal den *Klugscheiß-Modus an* und aus der Theorie geplaudert:

Ein dynamisches Array ist schon eine nette Idee für die Schlange, allerdings gibt es schönere Datenstrukturen dafür. Z.B. eine FIFO (first in first out). Klassisch wäre dies wohl TQueue, ein Erbe von Collection.
Was den Speicherplatz angeht: bei solchem "Kleinkram" achtet heute niemand mehr auf Speicher, trotzdem ist es schlechter Stil, Speicher zu verschwenden. Willst du also deine Schlange zwingend in einer eigenen Datenstruktur speichern, wäre es ratsam eine eigene Klasse Schlange anzulegen. Die Klasse bekommt intern einen Fifo, mit dem die aktuell belegten Felder gespeichert werden, und enthält Methoden um den Richtungswechsel zu verarbeiten, Position zurück zu geben ect. Hmm... Jetzt bin ich abgeschweift. Zurück zum FIFO: der Fifo muss nur X Elemente speichern, wobei X die Länge der Schlange ist. Du musst dir keine 4 Elemente Pro Schlangen-Abschnitt merken! Theoretisch reicht ein Punkt (x,y) oder noch schöner nur ein Wert Z. Dazu nummerierst du gedanklich deine Positionen durch. Hast du ein Feld, dass a breit ist und b hoch, so sagt dir z.b. x mod a die Zeile in der ein Element ist und x div b die Reihe. Somit musst du maximal pro Sclangen-Teil noch einen Integer speichern (schöner noch nen byte).

*Klugscheiß-Modus aus*

Naja, praxisnah war das wohl nicht, aber so wird der Quatsch heute noch an der Uni gelehrt ;-)

Greetz

MrMooed 4. Apr 2012 22:13

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von quaxdachs (Beitrag 1160277)
[..] Ein dynamisches Array ist schon eine nette Idee für die Schlange, allerdings gibt es schönere Datenstrukturen dafür. Z.B. eine FIFO (first in first out). Klassisch wäre dies wohl TQueue, ein Erbe von Collection.
Was den Speicherplatz angeht: bei solchem "Kleinkram" achtet heute niemand mehr auf Speicher, trotzdem ist es schlechter Stil, Speicher zu verschwenden. Willst du also deine Schlange zwingend in einer eigenen Datenstruktur speichern, wäre es ratsam eine eigene Klasse Schlange anzulegen. Die Klasse bekommt intern einen Fifo, mit dem die aktuell belegten Felder gespeichert werden, und enthält Methoden um den Richtungswechsel zu verarbeiten, Position zurück zu geben ect. Hmm... Jetzt bin ich abgeschweift. Zurück zum FIFO: der Fifo muss nur X Elemente speichern, wobei X die Länge der Schlange ist. Du musst dir keine 4 Elemente Pro Schlangen-Abschnitt merken! Theoretisch reicht ein Punkt (x,y) oder noch schöner nur ein Wert Z. Dazu nummerierst du gedanklich deine Positionen durch. Hast du ein Feld, dass a breit ist und b hoch, so sagt dir z.b. x mod a die Zeile in der ein Element ist und x div b die Reihe. Somit musst du maximal pro Sclangen-Teil noch einen Integer speichern (schöner noch nen byte) [..]

FIFOs gehen MIR viel zu weit über den Kopf, allerdings wäre es vllt. etwas für Coffeecoder's Java Projekt :thumb: Ich werde mich erstmal auf die Version mit dem Array beschränken und mir FIFOs bei gaaaanz viel langeweile ansehen. Trotzdem nette Ergänzung.

Sir Rufo 4. Apr 2012 22:24

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von MrMooed (Beitrag 1160250)
Zitat:

Zitat von DeddyH (Beitrag 1160242)
Klar, ich achte ja auch nie darauf, ob eine Ampel rot zeigt, da mein Auto über Sicherheitsgurte und Airbags verfügt :zwinker:

Ich hätte das jetzt eher so formuliert:
Warum sollte ich mich gegen das Aute stellen, wenn ich auch einfach die Bremse zum bremsen nutzen kann :gruebel:

Viele Wege führen nach Rom ;)

Übersetzen wir mal Exception, dann kommen wir zum Begriff Ausnahme.
Was ist bei deiner Teilnahme im Straßenverkehr die Regel und was die Ausnahme?

a) Benutzung der Bremse
b) Benutzung des Airbags

So viel zu den Beispielen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz