Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.09.2010, 14:47

2D-Spiel: List Vs. Array

Hallo,

ich möchte ein einfaches Roguelike in Java programmieren. Für die Ausgabe habe ich einen kleinen CLI-Emulator geschrieben. Jetzt Frage ich mich, ob ich für die Karte des Spiels (2D) besser ein Array oder eine Liste verwenden soll.

Vorteile des Arrays:
– einfaches Erzeugen von zufälligen Karten
– Objekte auf der Karte können über array[x][y] angesprochen werden

Nachteile des Arrays:
– Position der Objekte wird u. U. doppelt gespeichert (Position im Array (array[x][y]) und Position, die das Objekt verwaltet (setX()/getX() ...)
– Objekte brauchen boolean-Feld, damit überprüft werden kann, ob sie beim Schleifendurchlauf bereits bearbeitet wurden (sowas wie hasMoved oder hasProcessed) -> min. zwei Schleifendurchläufe nötig (wieder auf false setzen)

Vorteile der Liste:
– keine doppelten Positionsdaten
– einfaches Kopieren der Liste (für den Schleifendurchlauf praktisch: Kopie der Liste anfertigen, Kopie durchlaufen und Objekte bewegen (doMove() o. ä.), anschließend Referenz löschen -> bis Liste leer ist)

Nachteile der Liste:
– Erzeugen von zufälligen Karten schwierig, da einzelne Felder nicht über [x][y] angesprochen werden können
– um Objekte nach der Position auszuwählen, muss die gesamte Liste durchsucht werden -> f € O(n)

Insgesamt scheinen mir Arrays im Vorteil. Was meint ihr?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

03.09.2010, 15:24

– Position der Objekte wird u. U. doppelt gespeichert (Position im Array (array[x][y]) und Position, die das Objekt verwaltet (setX()/getX() ...)
– Objekte brauchen boolean-Feld, damit überprüft werden kann, ob sie beim Schleifendurchlauf bereits bearbeitet wurden (sowas wie hasMoved oder hasProcessed) -> min. zwei Schleifendurchläufe nötig (wieder auf false setzen)


Zu den von dir genannten Nachteilen (beim Array).

- Du musst die Position nicht doppelt Speichern. Du kannst auch die Indices des Arrays als Position nehmen
- Du musst das processed Flag nicht löschen. Du kannst bei jedem durchlauf den Test invertieren:

Pseudocode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
bool test = true;

// ...

test = !test;

foreach feld
  if (feld.processed != test)
  {
    process(feld);
    feld.processed = test;
  }
@D13_Dreinig

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

03.09.2010, 15:24

arrays sind ganz klar im vorteil. eine list verwendet man nur wenn man sehr oft elemente mitten in die liste einfügen muss.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

03.09.2010, 15:34

@David_pb: Dass ich die Indizes des Arrays als Position nehmen kann, ist mir zwar bekannt, finde ich aber nicht wirklich elegant. Ich bin der Auffassung, dass ein Objekt auf der Karte immer »wissen« sollte, wo es sich befindet. Diese Tatsache macht vieles einfacher, weil man dann nicht den Umweg über das Array gehen muss, um an die Position zu kommen.

Dass mit dem Invertieren habe ich mir auch schon gedacht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

03.09.2010, 15:40

@David_pb: Dass ich die Indizes des Arrays als Position nehmen kann, ist mir zwar bekannt, finde ich aber nicht wirklich elegant. Ich bin der Auffassung, dass ein Objekt auf der Karte immer »wissen« sollte, wo es sich befindet. Diese Tatsache macht vieles einfacher, weil man dann nicht den Umweg über das Array gehen muss, um an die Position zu kommen.


Eleganz und Sparsamkeit mögen sich eben nicht besonders gut. Für die "eleganze" Lösung musst du den Platz eben bereitstellen, was bei den Dimensionen ohnehin nicht ins Gewicht fällt.


Dass mit dem Invertieren habe ich mir auch schon gedacht.


Super, Problem gelöst! :)
@D13_Dreinig

Werbeanzeige