Ein Ausflug zu den Sternen
Verfasst: Sa Jun 29, 2013 5:00 pm
Ich möchte einen Map-Editor programmieren. Er soll eine Sternenkarten erzeugen, mit bis zu 99 Sternen, die zufällig auf der 601x601-Karte platziert werden. Dabei sollen diese Sterne nicht zu dicht beieinander liegen und auch nicht zu dicht am Rand. Die betreffenden Positionen, die mir zu dicht am Rand währen oder die zu dicht an bereits erzeugten Sternen liegen würden, sollen quasi mit einer weniger großen Wahrscheinlichkeit "gewählt" werden, als normal.
Hierbei gelten noch einige Rahmenbedingungen: Die einzelnen Felder (361.201 an der Zahl) sollen durchnummeriert werden (ich sehe den Vorteil der Verwendung von Koordinaten nicht).
Wenn es zu Demonstrationszwecken einfacher sein sollte, kann das Prinzip auch anhand von weniger Sternen und einer kleineren Karte dargestellt werden.
Wie würdet ihr vorgehen?
Mein Ansatz:
Ich vergrößere die Karte, die programmtechnisch aus einem Array besteht, um 2 Felder pro Position. Will heißen: Ich habe 1.083.603 Felder, wobei jede Position nun aus insgesamt 3 Feldern besteht. Das Array wird nun auf Null gesetzt, was bedeutet, dass alle Felder die gleiche Wahrscheinlichkeit haben, als Position für einen Stern ausgewählt zu werden.
Sobald ich einen Stern per Zufall habe setzen lassen, schnappe ich mir dessen Position und verändere das oben genannte Array so, dass nicht mehr jedes Feld die gleiche Wahrscheinlichkeit hat, "gewählt" zu werden.
Das erreiche ich, indem ich das Feld meines Array, an dem sich der erste Stern befindet "sperre", indem ich alle 3 Felder an der Stelle von 0 auf 1 setze, die 8 Positionen drumherum ebenfalls. Alle Felder rund um die Position meines Sterns, die noch eins weiter außen liegen, bekommen zwei von drei Feldern auf 1 gesetzt, noch weiter außen liegende Positionen bekommen noch ein Feld auf 1 gesetzt und alle übrigen behalten alle drei Felder auf 0, sodass sich für sie nichts ändert (an der Wahrscheinlichkeit).
Kann man diesen Ansatz wählen? Oder fällt euch etwas besseres ein, weil eleganter oder einfacher umzusetzen?
Hierbei gelten noch einige Rahmenbedingungen: Die einzelnen Felder (361.201 an der Zahl) sollen durchnummeriert werden (ich sehe den Vorteil der Verwendung von Koordinaten nicht).
Wenn es zu Demonstrationszwecken einfacher sein sollte, kann das Prinzip auch anhand von weniger Sternen und einer kleineren Karte dargestellt werden.
Wie würdet ihr vorgehen?
Mein Ansatz:
Ich vergrößere die Karte, die programmtechnisch aus einem Array besteht, um 2 Felder pro Position. Will heißen: Ich habe 1.083.603 Felder, wobei jede Position nun aus insgesamt 3 Feldern besteht. Das Array wird nun auf Null gesetzt, was bedeutet, dass alle Felder die gleiche Wahrscheinlichkeit haben, als Position für einen Stern ausgewählt zu werden.
Sobald ich einen Stern per Zufall habe setzen lassen, schnappe ich mir dessen Position und verändere das oben genannte Array so, dass nicht mehr jedes Feld die gleiche Wahrscheinlichkeit hat, "gewählt" zu werden.
Das erreiche ich, indem ich das Feld meines Array, an dem sich der erste Stern befindet "sperre", indem ich alle 3 Felder an der Stelle von 0 auf 1 setze, die 8 Positionen drumherum ebenfalls. Alle Felder rund um die Position meines Sterns, die noch eins weiter außen liegen, bekommen zwei von drei Feldern auf 1 gesetzt, noch weiter außen liegende Positionen bekommen noch ein Feld auf 1 gesetzt und alle übrigen behalten alle drei Felder auf 0, sodass sich für sie nichts ändert (an der Wahrscheinlichkeit).
Kann man diesen Ansatz wählen? Oder fällt euch etwas besseres ein, weil eleganter oder einfacher umzusetzen?