Types speichern, Problem sowohl mit Array als auch mit Tlist

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Gravedigger

Betreff: Types speichern, Problem sowohl mit Array als auch mit Tlist

BeitragDo, Jul 09, 2009 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen


Ich versuche eine Hexfeld-Engine zu programmieren, auf die Einheiten plaziert werden sollen. Das ganze ist objektorientiert und ich möchte sowohl Hexfelder als auch die Einheiten als Objekte verwalten.

das Problem beim Speichern der Objekte in Arrays:

Blitzmax unterstützt scheinbar keine automatische vergabe von Array-Indizes. Ich kann also nicht einfach ein neues Element an das Array anhängen, indem ich die ID weglasse, zb. units[] = new einheit

Auch das Ermitteln einer freien ID erweist sich als schwierig. Wenn ich die Größe des Array ermittele, habe ich immer noch keine Garantie, dass die ID frei ist, wenn zwischenzeitlich einzelne Elemente gelöscht wurden.

Das Problem beim Speichern der Objekte in Listen :

Habe noch nicht rausgefunden, ob und wie man den Elementen des Listenobjektes Id's zuweisen kann. Jedes Mal, wenn ich ein Objekt in der Liste suche, muß ich alle Elemente durchlaufen um nach bestimmten Eigenschaften zu suchen.


Ansich müßte dieses Problem ja häufig bei Projekten auftreten, die mit Maps und Einheiten zutun haben.
Perfekt wäre übrigens eine Möglichkeit zu sagen:

Hole mir Objekt x aus Liste y in dem eigenschaft z1 = 1 und z2 = 4 ist
(ja, ich bin neu bei Blitzmax und habe beruflich mit SQL zutun Laughing)

aber auch für jede andere Lösung wäre ich äußerst dankbar... Smile
Weisheit ist nicht, zu behaupten jedem etwas beibringen zu können - sondern Weisheit ist die Fähigkeit von jedem etwas lernen zu können.

mahe

BeitragFr, Jul 10, 2009 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Klingt als möchtest Du Maps verwenden.

Funktioniert ziemlich genau so wie das was Du mit den Arrays anstellen wolltest.
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,
 

Gravedigger

Betreff: Ja, eine Map will ich erstellen...

BeitragFr, Jul 10, 2009 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
...aber was sind denn nun Maps in Blitzmax? Ist das eine weitere Art Listenobjekt oder ein auf diesen Einsatzzweck optimierter Datentyp?

Ich habe in der Hilfe nichts derartiges gefunden, von daher bringt mich das leider nicht weiter... Sad
Weisheit ist nicht, zu behaupten jedem etwas beibringen zu können - sondern Weisheit ist die Fähigkeit von jedem etwas lernen zu können.

mahe

BeitragFr, Jul 10, 2009 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt eine Map-Klasse die einen auf diesen Einsatzzweck optimierten Datentyp darstellt ... oder so ähnlich.

Ich glaube, intern sind es irgendwelche Bäume. Kann Dir aber erstmal egal sein.

Auf jeden Fall solltest Du die Dokumentation lesen. Das geht schneller als jedes Detail zu erfragen!
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

BtbN

BeitragFr, Jul 10, 2009 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Hex-Map kannst du doch einfach auf ein 2D-Array projizieren. Da brauchts dann keine kompliierten Listen oder gar Hashmaps.

Jolinah

BeitragFr, Jul 10, 2009 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Neues Element anfügen (ist sogar erstaunlich schnell):
Code: [AUSKLAPPEN]
array = array[..array.Length + 1]
array[array.Length - 1] = new Einheit


Freien Platz finden:
Code: [AUSKLAPPEN]
For Local i:Int = 0 to array.Length - 1
  If array[i] = Null Then
    array[i] = new Einheit
    Exit
  EndIf
Next


Das löschen ist etwas umständlicher, aber auch nicht unmöglich Wink Aber wenn du nur Listen mit Einheiten hast ist sowieso TList zu empfehlen. Da geht alles schon von Haus aus (Hinzufügen, Löschen usw.). Wenn du immer direkt auf ein bestimmtes Objekt zugreifen können musst (per Index), dann wie gesagt TMap oder Array.

TMap:
Code: [AUSKLAPPEN]
Local map:TMap = new TMap
map.Insert("my_id", new Einheit);
Local e:Einheit = Einheit(map.ValueForKey("my_id"))

BtbN

BeitragFr, Jul 10, 2009 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrays sind statisch. Jedes verändern der größe hat eine komplette kopie des Kompletten Arrays zur folge.
Dafür sind arrays sehr schnell, wenn es um zugriff per index geht.
Linkedlists sind dafür sehr schnell was das ändern der größe angeht, da sie komplett dynamisch sind. Auch das einfügen und entfernen von nodes in der mitte ist kein Problem. Nur per Index zugriff ist sehr lahm, weil dafür immer die komplette liste durchgegangen werden muss.
 

Gravedigger

Betreff: @Jolinah - das ist genau was ich wissen wollte

BeitragSa, Jul 11, 2009 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Hinzufügen von Einheiten habe ich auch genauso gelöst wie in deinem Vorschlag, der Knackpunkt war nur, daß ich nicht wusste, dass man TLists auch eine ID zuweisen kann. Programmiere normalerweise in PHP wo es nur Arrays gibt, diese aber wesentlich flexibler gehandhabt werden können.

Die Map speichere ich nun in einem Array, allerdings eindimensional. Das in dem jeweiligen Element gespeicherte Hexfeld-Objekt weiß selber wo es hingehört. Damit kann ich die Felder bei Bedarf auch ohne verschachtelte eachin-Schleifen durchlaufen.
Types machen hier tatsächlich keinen Sinn, da sich das Spielfeld während einer Partie in der Regel nicht verändert... Wink



Die Methode der Map-Klasse zum Zeichnen der kompletten Map beschränkt sich dann auf Folgendes

Code: [AUSKLAPPEN]

Method draw()
      
   For eh:hexfeld = EachIn fieldlist
      eh.draw()
   Next
   
   For ee:einheit = EachIn unitlist
      ee.draw()
   Next

EndMethod


Mir ist bewusst, dass die dadurch entstehenden vielen Methodenaufrufe die Sache nicht gerade schneller machen, aber Übersicht ist mir dann doch wichtiger als Performance, zumal sich die Mapgröße und Einheitenanzahl bei Historyline in überschaubaren Grenzen hält...
Weisheit ist nicht, zu behaupten jedem etwas beibringen zu können - sondern Weisheit ist die Fähigkeit von jedem etwas lernen zu können.

ComNik

BeitragSa, Jul 11, 2009 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube du brauchst dynamische arrays.
Ich mach das so:

Code: [AUSKLAPPEN]

   global myarray:int[]
   myarray = new int[0]

 


und dann:
Code: [AUSKLAPPEN]

    for i=0 to 10
      myarray[i] = i
      myarray = myarray[..len(myarray)+1]
    next
   



Hoffe das ist was du suchst...
WIP: Vorx.Engine

mahe

BeitragSa, Jul 11, 2009 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Array jedesmal um 1 zu vergrößern ist keine besonders kluge Idee. Da wäre es z.B. besser die Größe jedesmal zu verdoppeln wenn es voll ist und wieder zu verkleinern wenn eine bestimmte Auslastung unterschritten ist (wenn es wirklich so dynamisch und ein Array sein muss). Da wird dann zwar immer etwas Speicher verschwendet (bzw. reserviert) es ist aber weitaus schneller (weniger Arbeit).

Ideal wäre es natürlich die Größe von Anfang an zu kennen.
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

BtbN

BeitragSa, Jul 11, 2009 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum so umständlich? Die map-größe ist von anfang an klar. Und jedesmal per Eachin alles durchzugehen ist PErformance-Killer schlecht hin.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group