AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Snake - Ein Problem mit dynamischen Arrays

Ein Thema von MrMooed · begonnen am 3. Apr 2012 · letzter Beitrag vom 11. Apr 2012
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 22:46
Wobei sich die Frage stellt warum überhaupt ein Array für Snake? Ich habe vor einiger Zeit mal just4fun Snake geprogt, nur um zu sehen wie schnell ich so ein Game hinkriege, und dabei ist es mir aufgefallen, dass es Quatsch ist ein Array für Snake zu nehmen. Ich schätze man nimmt es weil es im ersten Moment logisch erscheint. Aber wenn man genau drüber nachdenkt, dann ist ein Array für Snake doppeltgemoppelt.
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 07:35
Wobei sich die Frage stellt warum überhaupt ein Array für Snake? Ich habe vor einiger Zeit mal just4fun Snake geprogt, nur um zu sehen wie schnell ich so ein Game hinkriege, und dabei ist es mir aufgefallen, dass es Quatsch ist ein Array für Snake zu nehmen. Ich schätze man nimmt es weil es im ersten Moment logisch erscheint. Aber wenn man genau drüber nachdenkt, dann ist ein Array für Snake doppeltgemoppelt.
In der Tat. Ich bin gerade selbst dabei ein Snake zu proggen (zwar in Java). Da ist mein "Snake" selbst das "Array", in dem Point als Koordinaten (Körper der Schlange) beinhaltet.
Coffeecoder
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 09:11
In der Tat. Ich bin gerade selbst dabei ein Snake zu proggen (zwar in Java). Da ist mein "Snake" selbst das "Array", in dem Point als Koordinaten (Körper der Schlange) beinhaltet.
Also würdest du alle Koordinaten (sei es nun die der Schlange als auch die der Äpfel/ Münzen) in einem Array Speichern ? Hmm eigentlich wäre das wirklich sinnvoller Werde das ganze dann wohl nochmal überarbeiten. Trotzdem vielen Dank für die Anregungen

Zu allem Überfluss ist mein Laptop mit nem Bluescreen sbgeschmiert und hat das komplette Delphi Projekt zerschossen. Exakt in dem Moment, in dem ich auf Speichern geklickt habe auf ein neues
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 09:36
Wenn ich zuhause bei meinem Rechner sitze kann ich vielleicht einen kleinen Einblick geben
Coffeecoder
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 16:31
Servus,

Habe mir da mal ein Paar Gedanken zu dem Denkanstoß gemacht und etwas weitergedacht. Wenn man nun die Koordinaten aller Gegenstände von Snake (Schlangenteile, Äpfel, Wände etc.) in einem Array, also einer Art Karte, speichert, stellt sich mir das Problem, wie ich ihm sage wo sich die Schlange befindet und wo deren Kopf liegt (wobei letzteres noch einfach zu erledigen ist) Müsste dort nicht ein weiteres (kleineres) Array zum Einsatz kommen, wo nur Koordinaten der Schlange gespeichert werden ?
Vllt. wäre es noch möglich die "Karte" zu durchsuchen um so an die Stellen zu gelangen, doch dies würde doch enorme Performance Verluste mit sich ziehen oder irre ich da ?
Werde derweil mal weiter Basteln
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 18:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 18:52
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.
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
  Mit Zitat antworten Zitat
quaxdachs

Registriert seit: 4. Apr 2012
1 Beiträge
 
#8

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 20:29
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
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 22:13
[..] 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 Ich werde mich erstmal auf die Version mit dem Array beschränken und mir FIFOs bei gaaaanz viel langeweile ansehen. Trotzdem nette Ergänzung.
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 5. Apr 2012, 06:49
Tach,

aaaalso mein erster Post in einem Delphi-Forum
Willkommen in der DP

[...]

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).
Ein sehr interessanter Ansatz Find ich gut

Ich habe mal eben Just4Fun ein Snake-Spiel mit TMemo programmiert. Ist nicht viel drin, nur ein Level. Gesteuert wird mit den Cursortasten.
Nett Erinnert mich an meinen Java Konsolensnake
Coffeecoder

Geändert von Coffeecoder ( 5. Apr 2012 um 06:52 Uhr) Grund: Add weil ich es kann ;)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz