Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - 2 arrays zusammenhängen
reptile - Sa 08.08.09 17:04
Titel: 2 arrays zusammenhängen
folgendes problem: ich will auf einem schachbrett alle möglichen züge des spielers berechnen, der gerade dran ist.
nun ist es kein großes ding, eine funktion zu schreiben, die alle möglichen züge einer einzelnen figur ausgibt. diese funktion könnte ich dann für alle figuren des spielers aufrufen. wie aber kann ich dann die einzelnen arrays die ich dadurch bekomme, zu einem großen array mit allen zügen machen ?
gibt es vielleicht eine art "append" für arrays ?
natürlich kann ich das ganze mit einer schleife einfach in ein neues, großes array kopieren, aber das würde relativ lange dauern...
jaenicke - Sa 08.08.09 17:24
reptile hat folgendes geschrieben : |
| natürlich kann ich das ganze mit einer schleife einfach in ein neues, großes array kopieren, aber das würde relativ lange dauern... |
Was sollte denn eine entsprechende fertige Funktion anderes machen? Also wie kommst du darauf, dass deine Lösung so viel langsamer wäre?
Wie schnell das geht kommt da natürlich auch darauf an wie die Arrays aussehen.
Eine fertige Funktion kenne ich da jedenfalls nicht, wenn du Arrays benutzen möchtest.
reptile - Sa 08.08.09 17:58
hmm na gut, ich werde wohl mal versuchen ob ich das irgendwie so schreiben kann, dass die züge direkt schon in ein großes array geschrieben werden (nacheinander). das müsste ich halt dann immer übergeben
| Zitat: |
| Wie schnell das geht kommt da natürlich auch darauf an wie die Arrays aussehen. |
wie gesagt, es sollen züge darin gespeichert werden, und ein zug besteht momentan nur aus anfangsfeld und zielfeld.
| Zitat: |
| Eine fertige Funktion kenne ich da jedenfalls nicht, wenn du Arrays benutzen möchtest. |
gäbe es denn was sinnvolleres als arrays ?
jaenicke - Sa 08.08.09 18:01
Wenn du Klassen benutzt, könntest du einfach eine TObjectList aus der Unit Contnrs benutzen mit OwnsObjects auf True. Dann brauchst du dich auch nicht um die Freigabe der Objekte kümmern.
delfiphan - Sa 08.08.09 18:39
Mach besser eine Liste von Listen statt eine grosse Liste. Ist schneller, spart dir die Kopiererei, und du brauchst keinen immer grösserwerdenden, zusammenhängenden Speicherblock.
Bergmann89 - Sa 08.08.09 19:09
Hey,
du könntest ja auch gleich ein großes Aray machen. Du beerechnest die max. Länge die du brauchst un übergibst das Array dann an deine Prozedur, die die Züge brechnet un schreibst dann direkt in das Array...
Aber ich würde dir auch eher zu Listen raten!
MfG Bergmann.
Tilman - Sa 08.08.09 19:11
Und, wenn du die Liste selbst als Zeigerkonstrukt implementierst brauchst du zum zusammenhängen nur einen einzigen Zeiger zu setzen. Beispiel für eine solche Liste:
Delphi-Quelltext
1: 2: 3: 4: 5:
| type pMeineListe = ^tMeineListe; tMeineListe = record Daten: Integer; Next_Item: pMeineListe; end; |
Wobei Next_Item immer auf das nächste Item zeigt (rekursiv sehr elegant zu lösen). Dann musst du später nur noch Next_Item vom letzten Element auf das erste Element der zweiten Liste setzen, und shcon hast du eine lange Liste.
reptile - Sa 08.08.09 20:00
vielen dank für die antworten
ich denke eine TObjectList ist hier sinnvoll. die könnte ich dann einfach immer als parameter übergeben, und die neuen züge da eintragen.
eine liste aus listen ist zwar auch keine schlechte idee, aber ich glaube das lohnt sich hier nicht. der geschwindigkeitsvorteil gegenüber einer großen liste wäre glaube ich nicht so groß. schließlich geht es nur um alle möglichen züge in einer stellung, nicht um die folgezüge des gegners oder noch mehr folgezüge. diese liste dürfte nicht größer als ca. 50 elemente werden, oder? in der anfangsstellung hat man 20 möglichkeiten, später werden es etwas mehr.
mal schauen ob das so geht
EDIT: scheint bis jetzt ganz gut zu funktionieren
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!