W
Ich glaube die Frage wurde sicher schon tausend mal gestellt oder die Lösung ist in Wirklichkeit so scheisseinfach, daß ich so doof bin, daß ich sie trotzdem nicht heraus bekomme.
Zur Idee:
Mir war langweilig und ich wollte irgendwas programmieren. Ich dachte an einen kleinen Life-Simulator.
Das ganze sollte so ablaufen, daß ein Einzeller sich selbstständig vermehrt und durch Mutation neue Kulturen enstehen.
Damit nicht irgendwann alle Speicher mit virituellen Zellkulturen voll sind, müssen sollten einzelne Kulturen auch in der Lage sein andere zu fressen (die durch Mutation erst freigeschaltet wird).
Problem:
Nun, wann sollte aber eine Zelle eine andere Fressen können? Zum einen wenn sie fressbar ist zum anderen wenn sie sich in der Nähe befindet.
Jede Zelle hat also einen eigenen Sichtradius. Doch woher soll sie wissen wann eine andere in der Nähe ist?
Schlechte Lösungen:
Die primitivste bestand darin einfach den Abstand zu ALLEN anderen auszurechnen, und jede Zelle deren Abstand kleiner war, als der Sichtradius der hungrigen Zelle wurde gefressen.
In der Praxis klappt das zwar wunderbar, aber wächst die Rechnerauslastung mit der Anzahl der Zellen im Quadrat, was zu einer horrenden CPU-Auslastung führt.
Eine andere Lösung fand ich darin, einen markierbaren Boden für die Zellen zu kreiern. Eine Zelle mit den Koordinaten (a,b) hinterläßt auf den Boden einen Fleck: "Hier sitze ich."
Jede Fress-Zelle muss in ihrem Sichtradius also nur noch alle Koordinaten nach einem Fleck absuchen (statt sämtlicher Zellen) ob sich dort eine fremde Zelle befindet.
Theoretisch steigt die CPU-Auslastung zwar nun linear an, aber in der Praxis wird sie astronomisch hoch liegen, weil jede Zelle ALLE Punkte in ihrem Sichtfeld abtatschen muss, und wird mit einem größeren Radius auch immer extremer.
Zudem müsste man eine geradezu riesige (X,Y)-Matrix erstellen die viel fressen würde.
Sonstige Ideen:
Das Problem ist eigentlich das selbe wie in jedem x-beliebigen Echtzeitstrategie Spiel (wie StarCraft). Wie haben die das trotz riesiger Maps und zahlloser Einheiten so elegant gelößt?
Man könnte das ganze natürlich einfach in einem groben Raster abspielen lassen, aber das erinnert mich an so Uralt-Programme und kommt für mich nicht in Frage (zumal ich weiß daß es ja sehr wohl Lösungen geben muss).
Eine andere Idee hatte ich dann noch, die riesige Matrix stufenweise in Cluster aufzuteilen. Eine Zelle auf dem Punkt (a, b) markiert zusätzlich das Clusterstück, zudem der Punkt (a, b) gehört, und das kleine Clusterstück markiert ein gröberes und größeres Clusterstück (usw.)
Trotzdem hätte ich immer noch die gigantische MegaMatrix.
Oder muss ich irgendwie mit variablen Clusterlisten arbeiten?? Keine Ahnung...
Ich denk seit Tagen danach, aber mir fällts DIE perfekte Lösung nicht ein.
Kann mir jemand helfen?