| Autor |
Beitrag |
reptile
      
Beiträge: 40
|
Verfasst: Sa 08.08.09 17:04
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 40
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
reptile 
      
Beiträge: 40
|
Verfasst: 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
|
|
|